User Tools

Site Tools


Sidebar

Jump to
AmbientTalk
CRIME
iScheme

at:tutorial:metaprogramming

This is an old revision of the document!


This tutorial is under heavy construction!

Metaprogramming

AT Zero - AmbientTalk without syntactic sugar

In AmbientTalk, everything is an object, also native values such as numbers, booleans, strings and tables. Hence, the only way to interact with these values is by sending messages to them. However, there are some constructs in AmbientTalk that do not seem to send a message at all. Examples are table access/assignment, control structures and arithmic operations:

>[5,6,7][2]
>>6
>if: 1 == 2 then: { 13 } else: { 42 }
>>42
>1 + 2 * 3
>>7

However, these constructs are all syntactic sugar. Behind the scenes, they all perform message sends. The following code shows the equivalents of the previous code, but with the actual message sends:

>[5, 6, 7].at(2)
>>6
>(1 == 2).ifTrue: { 13 } ifFalse: { 42 }
>>42
>1.+(2.*(3))
>>7

Quasiquoting and splicing

Qouting

Any valid AmbientTalk expression can be quoted. This prevents the expression from being evaluated. Instead, it is returned literally.

Quoting and expression is done with the ` operator. There are four variants:

  • `… for quoting literal values
  • `(…) for quoting expressions
  • `{…} for quoting statement lists
  • `[…] for quoting tables
Literal values

Quoting a literal value such as a number or a string results in the exact same number or string.

>`3 == 3
>>true
>`3 + 8
>>11
>`"text" == "text"
>>true

An identifer can also be quoted. This returns a symbol object:

>foo
Undefined variable access: foo
>`foo
>>foo
>`foo.text
>>"foo"

Note that in `foo.text, the quoted expression is foo and not foo.text. The selection is performed on the result of the quotation, in this case a symbol.

Expressions

To quote a complete expression, it has to be wrapped in parantheses:

>`(foo.text)
>>foo.text
>`(foo(1, 2, 3))
>>foo(1, 2, 3)
>`(1+2)
>>1.+(2)
>`(o.m())
>>o.m()
Statements

Statements (definitions, assignments, …) can also be quoted, but only inside a quoted statement list. Trying to quote a statement in the same way as an expression will cause a parse error.

>`{ def a := 4 }
>>def a := 4
>`{ def tab[5] { m() }; tab[3] := n() }
>>def tab[5] { m()}; tab[3] := n()

If you actually want to quote a literal closure, you should use parantheses, since a literal closure is an expression.

`{ | foo | foo := 4 } gives a literal closure AG????
Tables

Literal tables can already be defined as follows:

>def tab := [ 1+2, 3+4, 5+6 ]
>>[3, 7, 11]

With this construct, all the elements of the literal table are evaluated. By quoting a literal table, all the elements are quoted instead of evaluated:

>def tab := `[ 1+2, 3+4, 5+6 ]
>>[1.+(2), 3.+(4), 5.+(6)]

First-class abstract grammar

at/tutorial/metaprogramming.1177002775.txt.gz · Last modified: 2007/04/19 20:34 (external edit)