cvsuser     03/07/01 08:57:37

  Added:       languages/jako/docs future.pod
  Log:
    * Added the file I wrote a while back that talks about some of things
      I want to eventually do with Jako. Much is missing, though.
  
  Revision  Changes    Path
  1.1                  parrot/languages/jako/docs/future.pod
  
  Index: future.pod
  ===================================================================
  
  =head1 Introduction
  
  Jako is a simple malleable language. It has very little built-in functionality,
  but it is very easy to build a reasonable language out of it.
  
  
  =head1 Constructs
  
  The basic constructs of Jako are predefined, but the ways in which they
  combine are programmer-defined.
  
  
  =head2 Words
  
  A word is a contiguous string of characters matching the Perl regular
  expression C<m/[A-Za-z][A-Za-z0-9_]*/>. Words can be used as the names of types,
  variables and constants, and can also be used as I<key words>.
  
  
  =head2 Symbols
  
  Symbols are 
  
  
  =head2 Expressions
  
  =head2 Blocks / Environments
  
  A named block can be executed by passing it to C<eval>.
  
  The section "A Mathematical Note" of [MEYER-2001] presents a model of a class as
  a set of name-value bindings.
  
  Lesson 3, "Semantic Building Blocks" of [MEAD-2001] describes the environment
  (or context) of a program at a specific point in its execution in a similar way.
  
  A block is an environment. Names not explicitly bound in that environment are
  implicitly bound if they are explicitly bound in an ancestor environment.
  
      bind env E word N any V := { E.N = V; }
  
  
  =head2 Blocklists
  
  Parentheses are used to delimit blocklists. A parenthetical list of expressions
  is semantically equivalent to the same number of single-expression blocks, one
  after the other. That is,
  
      (a < b, 5, i++)
  
  is exactly the same as
  
      {a < b} {5} {i++}
  
  
  =head1 Definitions
  
    def
  
  
  =head1 Intrinsic Flow Control Statements
  
  =head2 if
  
  =head2 goto
  
      def goto label L := ...
  
  
  =head1 Defining Conventional Constructs
  
  Even though Jako doesn't have conventional constructs built-in, it is very
  easy to define them using the facilities Jako does provide:
  
  =head2 Eiffel-like loops
  
  Translating from Eiffel notation to a Perl-like notation yields something like
  this:
  
      from {...} invariant (...) variant {...} until (...) loop {...} end;
  
  where each C<{...}> represents a block of statements and each C<(...)>
  represents a single boolean expression.
  
  Since the body of the loop is delimited by the braces, we can get rid
  of the C<end> keyword:
  
      from {...} invariant (...) variant {...} until (...) loop {...};
  
  Since we are used to using C<redo> to go back to the top of the loop
  block and re-do the current iteration, we'll replace C<loop> with C<do>:
  
      from {...} invariant (...) variant {...} until (...) do {...};
  
  Eiffel's C<variant> clause is equivalent to the Perl C<continue> clause:
  
      from {...} invariant (...) continue {...} until (...) do {...};
  
  But, we like to see that clause at the end:
  
      from {...} invariant (...) until (...) do {...} continue {...};
  
  Since we've adopted the Perlish C<continue> in place of C<variant>, now
  C<invariant> seems out of place, but C<check> seems to fit nicely:
  
      from {...} check (...) until (...) do {...} continue {...};
  
  
  =head2 while
  
  With this Jako definition:
  
      def while block W ( do? block D ( continue? block C )? )? := {
        var R: typeof(D); # TODO: typeof(D) == block, we want type of *last statement 
of* D.
        CONT: goto :LAST unless eval W;
        REDO: R = eval D;
        NEXT: eval C;
              goto :CONT;
        LAST: return R;
      }
  
  we can write Perlish while loops:
  
      i = 0;
      while (x[i] < y[i]) do {
        print "$i\n";
      } continue {
        i++
      }
  
  In fact, we can even write very concise C<while> loops, given the
  optionality of the C<do> and C<continue> blocks and the equivalence of
  C<(x;y)> to C<{x} {y}>:
  
      i = 0;
      while (x[i] < y[i]; print "$i\n"; i++);
  
  (which almost looks like a C<for> loop).
  
  
  =head2 for
  
  This Jako definition:
  
      def for block F while? block W continue? block C do? block D := {
        var R: typeof(D); # TODO: typeof(D) == block, we want type of *last statement 
of* D.
        FOR:  eval F;
        CONT: goto :LAST unless eval W;
        REDO: R = eval D;
        NEXT: eval C;
              goto :CONT;
        LAST: return R;
      }
  
  allows us to write C<for> loops the way we are used to, such as:
  
      for (i = 0; i < l; i++) { print x[i], "\n" }
  
  which is really shorthand for:
  
      for { i = 0 } { i < l } { i++ } { print x[i], "\n" }
  
  or, more verbosely:
  
      for {
        i = 0;
      } while {
        i < l
      } continue {
        i++
      } do {
        print x[i], "\n"
      }
  
  
  =head2 redo, next and last
  
  We can define the familiar loop control statements given the consistency of label
  definitions above:
  
      def redo ( label L )? := {
        goto L:REDO; # if L not given, means "goto :REDO"
      }
  
      def next ( label L )? := {
        goto L:NEXT; # if L not given, means "goto :NEXT"
      }
  
      def last ( label L )? := {
        goto L:LAST; # if L not given, means "goto :LAST"
      }
  
  TODO: Allow C<x = next>?  -- What would that mean?
  
  
  =head2 if, then, elseif and else
  
      def if block I then? block T ( elsif block EI then? block ET )* (else block E)? 
:= {
        var R: typeof(...);
        IF:    goto +:NEXT unless eval I; # "+" --> forward-only
        REDO:  R = eval T;
               goto +:LAST;
        NEXT:  {
          *:IF:    goto :*:NEXT unless eval *EI;
          *:REDO:  R = eval *ET;
                   goto LAST;
          *:NEXT:
        } over elsif
        REDO:  R = eval E;
        LAST: return R;
      }
  
  
  =head1 Object-Oriented Programming
  
  A class is an environment template. An instance is an environment built from such a
  template. Method application is the execution of code within the instance's 
environment.
  For example:
  
      y = foo.x
  
  means to find 'x' in the environment 'foo' and point 'y' in the current environment 
at
  it.
  
  Issues: Multiple inheritance for blocks that represent classes vs. single parents for
  blocks that represent general code sequences.
  
  Analogy:
  
      closure : block  ::  instance : class
  
  Instantiation as environment cloning.
  
  
  =head2 self
  
  The word 'self' means the enclosing environment (instance, in the case of an object
  method).
  
  The word 'class' means the enclosing environment's enclosing environment.
  
  Problem:
  
      class {
          method x {
              {
                  self.y;      # Looks in method
              }
              self.z;          # Looks in instance
          }
          int y;
          int z;
      }
  
  
  =head1 To Do
  
  =over 4
  
  =item *
  
  Templates and generic programming
  
  =item *
  
  Multiple inheritance, renaming and redefinition.
  
  =item *
  
  Run-time definition and modification of environments.
  
  =item *
  
  =back
  
  
  =head1 References
  
  =over 4
  
  =item [MEAD-2001]
  
  Mead, Jerud J. and Shende, Anil M. I<Persuasive Programming>, A|B|F Content, 
Wilsonville, OR, 2001.
  
  =item [MEYER-1997]
  
  Meyer, Bertrand. "Object-Oriented Software Construction, Second Edition," Prentice 
Hall PTR,
  Upper Saddle River, NJ, 1997.
  
  =item [MEYER-2001]
  
  Meyer, Bertrand. "Overloading vs. Object Technology," I<Journal of Object-Oriented
  Programming>, October/November 2001 (Vol 14, No. 4).
  
  =back
  
  
  
  
  

Reply via email to