User Tools

Site Tools


at:tutorial:basic

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
at:tutorial:basic [2008/03/12 17:18]
tvcutsem *
at:tutorial:basic [2020/02/09 22:05] (current)
elisag
Line 1: Line 1:
- 
 ====== Functional and Imperative Programming ====== ====== Functional and Imperative Programming ======
    
Line 67: Line 66:
 >>[1, [1, 2, ["a", "e", "i", "o", "u"], 4, 5], "ambientTalk"] >>[1, [1, 2, ["a", "e", "i", "o", "u"], 4, 5], "ambientTalk"]
 </code> </code>
 +
  
 ==== Table Splicing ==== ==== Table Splicing ====
Line 85: Line 85:
 >>[2, 3, 4] >>[2, 3, 4]
 </code> </code>
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +==== Multidimensional Tables ====
 +
 +As mentioned before, there is no special constructor for definition of multidimensional tables, a table entry can contain another table. In what follows we have a closer look to manipulations with multidimensional tables.  Consider a multidimensional table which is extensionally defined as follows:
 +
 +<code>
 +def a := [[1,0,0], [0,1,0], [0,0,1]];
 +>>[[1, 0, 0], [0, 1, 0], [0, 0, 1]]
 +>a[1][2]
 +>>0
 +>a[1]
 +>>[1, 0, 0]
 +>(a[1])[2] := 3;
 +>>3
 +>a
 +>>[[1, 3, 0], [0, 1, 0], [0, 0, 1]]
 +</code>
 +
 +An implicit definition of the same table can be expressed as follows:
 +
 +<code>
 +def i := 0;
 +def aux[3] {0}; 
 +def b[3] { i := i + 1; aux := [0,0,0]; aux[i] :=1; aux};
 +>>[[1, 0, 0], [0, 1, 0], [0, 0, 1]]
 +</code>
 +
 +You can find later in this chapter a helper function for creating matrices  [[:at:tutorial:basic#optional_parameters|here]].
 +
 + 
  
 ===== Functions ===== ===== Functions =====
Line 174: Line 216:
 </code> </code>
  
-In that case, the //sum// function still accepts an arbitrary number of arguments as long as two arguments are supplied. //a// and //b// are considered as mandatory arguments of the argument list. +In that case, the //sum// function still accepts an arbitrary number of arguments as long as two arguments are supplied. //a// and //b// are considered as mandatory arguments of the argument list. 
 + 
 +The splice operator can also be used to transform a table into an argument list for a function, for example: 
 +<code> 
 +def args := [3,4,5]; 
 +> sum(1,2, @args); 
 +>> 15 
 +</code> 
 + 
 +One way to think about this is that the splice operator splices the ''args'' table into the table of actual arguments. The "rest" arguments do not necessarily need to be the last parameters, for example: 
 +<code> 
 +> sum(1,2,@args,6); 
 +>> 21 
 +</code> 
 + 
 + 
 + 
 + 
 + 
 + 
 +==== Optional Parameters ====
  
 A function can also declare optional arguments as shown below. Optional arguments can be omitted in a function call. If this is the case, the default expression provided in their definition is evaluated and passed as argument to the function instead. A function can also declare optional arguments as shown below. Optional arguments can be omitted in a function call. If this is the case, the default expression provided in their definition is evaluated and passed as argument to the function instead.
Line 186: Line 248:
 </code> </code>
  
-As is customary in languages with the above parameter passing semantics, AmbientTalk requires mandatory parameters to be defined //before// optional parameters, which should in turn be defined //before// a variable-argument parameter, if any.+As is customary in languages with the above optional arguments, AmbientTalk requires mandatory parameters to be defined //before// optional parameters, which should in turn be defined //before// a variable-argument parameter, if any. 
 + 
 +Let us show how to use optional arguments to define an auxilary function that creates matrices: 
 + 
 +<code> 
 +def makeMatrix(n, m := n, init := { |i,j| 0}){ 
 +  def [i,j] := [0,0]; 
 +  def makeCol(i,j) { 
 +     def col[m] { j := j + 1; init(i,j) } 
 +  }; 
 +  def matrix[n] { i := i + 1; makeCol(i,j)} 
 +}; 
 +>def c := makeMatrix(3); 
 +>>[[0, 0, 0], [0, 0, 0], [0, 0, 0]] 
 +>c[1] := [1,2,3] 
 +>>[1, 2, 3] 
 +>c 
 +>>[[1, 2, 3], [0, 0, 0], [0, 0, 0]] 
 +>def d := makeMatrix(4,4,  
 +  {|i,j| if: (i == j) then: {1} else: {0}}); 
 +>> [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]] 
 +</code>
  
 ===== Closures ===== ===== Closures =====
Line 236: Line 319:
 AmbientTalk borrows its block syntax from languages like Smalltalk and Self, where the role of the curly braces is played by square brackets, i.e. ''[ args | body ]''. In AmbientTalk, the ''<parlist>'' is only used to denote parameters to the block, not also for temporary variables as in Smalltalk. AmbientTalk borrows its block syntax from languages like Smalltalk and Self, where the role of the curly braces is played by square brackets, i.e. ''[ args | body ]''. In AmbientTalk, the ''<parlist>'' is only used to denote parameters to the block, not also for temporary variables as in Smalltalk.
 </note> </note>
 +
 +
  
 ===== Keywords ===== ===== Keywords =====
Line 245: Line 330:
   def i := 0;   def i := 0;
   def mapped[tbl.length] {   def mapped[tbl.length] {
-    clo(tbl[i:=i+1])+    i := i+1
 +    clo( tbl[ i ] )
   };   };
 } }
Line 266: Line 352:
 </code> </code>
  
-However, it is impossible to directly call or define a keyworded function in canonical style.+It is also possible to invoke keyworded functions using the canonical function application syntax: 
 + 
 +<code> 
 +foo:bar:(1,2) 
 +</code> 
 + 
 +<note important> 
 +Be careful when nesting calls to keyworded functions: call of the form ''foo: foo: 1 bar: 2 bar: 3'' is parsed as ''foo: (foo: 1 bar: 2 bar: 3)'', not as ''foo: (foo: 1 bar: 2) bar: 3''. It is recommended to always explicitly parenthesize nested keyworded function calls. 
 +</note>
  
 ===== Native Data Types ===== ===== Native Data Types =====
  
 The basic data types in AmbientTalk are numbers (i.e. integers), fractions (i.e. double precision floating point numbers), text (i.e. strings), tables (i.e. arrays) and booleans. In fact, instances of these data types are nothing but objects and as such, they respond to a variety of native methods. Objects will be the subject of the next chapter of the tutorial. This section explains the basic data types and includes some examples how to manipulate them. The complete list of methods can be found in the language reference. The basic data types in AmbientTalk are numbers (i.e. integers), fractions (i.e. double precision floating point numbers), text (i.e. strings), tables (i.e. arrays) and booleans. In fact, instances of these data types are nothing but objects and as such, they respond to a variety of native methods. Objects will be the subject of the next chapter of the tutorial. This section explains the basic data types and includes some examples how to manipulate them. The complete list of methods can be found in the language reference.
 +
 +
  
 ==== Numerical data types ==== ==== Numerical data types ====
Line 303: Line 399:
 Numbers also support some useful iterator methods such as: Numbers also support some useful iterator methods such as:
 <code> <code>
->6.to: 0 step: 2 do: { |i| system.println(i) }+>1.to: 5 do: { |i| system.println(i)} 
 +
 +
 +
 +
 +
 +>1.to: 5 step: 2 do: { |i| system.println(i)} 
 +
 +
 +
 +>6.downTo: 0 step: 2 do: { |i| system.println(i) }
 6 6
 4 4
 2 2
 +0
 >>nil  >>nil 
 >3.doTimes: { |i| system.println(i) } >3.doTimes: { |i| system.println(i) }
Line 413: Line 520:
 ===== Control Flow Constructs ===== ===== Control Flow Constructs =====
  
-Control flow constructs are defined in the lexical root of AmbientTalk. The lexical root is an object containing globally visible native methods (i.e. it is the top-level environment). We have already seen in the previous sections examples of use of the foreach and if/then structures. A list of traditional control flow structures defined in AmbientTalk is shown below:+Control flow constructs are defined in the "lexical root". The lexical root is an object containing globally visible native methods (i.e. it is the top-level environment). We have already seen in the previous sections examples of use of the foreach and ''if:then:'' control structures. A list of traditional control flow structures defined in AmbientTalk is shown below:
 <code> <code>
 if: booleanCondition then: consequentClosure if: booleanCondition then: consequentClosure
Line 457: Line 564:
     table;     table;
   };   };
-  quickSort(table, 1, table.getLength());+  quickSort(table, 1, table.length);
 }; };
 >><closure:sort> >><closure:sort>
at/tutorial/basic.1205338695.txt.gz · Last modified: 2008/07/03 16:20 (external edit)