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
という変数を参照できる。