arc> "foo"
"foo"
arc> 12
12
Symbols are also atoms, but have the special property that they may be defined to have some other value. Quoting a symbol means it doesn't get evaluated.
arc> 'bar
bar
arc> (set bar "toto")
"toto"
arc> bar
"toto"
Lists are another story: when arc evaluates a list, it assumes the first item of the list is a function, and the remainder are arguments.
arc> (+ 1 2)
3
arc> (expt 9 2)
81
The first item is not necessarily a function: it might also be a reference to a macro, or in anarki, an object for whose type a function has been prepared via
defcall
. For another day. The first place in a list is usually referred to as "functional position". So, the procedure for evaluating (a b c d)
, is to evaluate each of a, b, c, and d (order is unspecified). a
should evaluate to a function, which is then called with the values of b, c and d as arguments.But, the object in functional position doesn't have to be a symbol pointing to a function. It could also be an inline, anonymous function.
arc> ((fn (a b) (+ a b)) 23 67)
90
Disadvantage: it's dead ugly, and totally unreadable. Nest a few of these and you have parenthesis soup. It turns out this is one of the fundamental organising principles of arc code. So why bother?
- group expressions
- declare local variables
- iteration
- all sorts of wonderful things
- all this in a neat and concise way, without namespace clutter or parameter hell. Except, we need macros to make it happen.
Macros: a future post.
No comments:
Post a Comment