Macro is the parameter of Lambda.
m = \x -- A primitive macro.
f = m {x} -- The m builds an lambda with first argumenet, parameter of which is x.
f 1 -- 1
| Name | Syntax | Type | Detail |
|---|---|---|---|
| macro | \ p | a -> b -> a | right recursion. |
| closure | { x } | a | Makes a function which has no parameter. |
We can build an lambda, by giving a function for the primitive macro.
let = \m \a \v { m v a }
-- let \x 42 x => 42
compose = \m \k \a { m (k a) }
-- compose (let \x a) (let \y b)
-- == \p { let \x a (let \y b p) }
-- == \p { \x (\y p b) a }
置換コマンド
を考える。
$aは遅延評価であり、なおかつダイナミックスコープである。sコマンドは"(\d+)"にマッチした場合、グループをa, b, .. zの順に変数に束縛したのち、 右辺を評価し、その結果で置換する関数であるすると、
$aはグローバルでも、特別な構文でもないが、sの中で宣言されたaという変数を参照できる。