Applox Applying を採用しよう
Closed this issue · 4 comments
pasberth commented
Applox Applying はカッコを省くために非常に強力な仕様だと思う。
すこし検証してみた所 Applox Applying は Applox という言語にだけでなく
Macra にも組み込めそうだと思った。
Applox Applying はどちらかといえばカリー化のような機能で、構文に縛られず、
Lisp の構文にも組み込める。
Applox Applying はもともと構文の優先順位がある言語にも適用できるのである
具体例をあげると
https://gist.github.com/4223441
の
def kudr f, str,
{
if (not str)
f
(if !equal $'a !car str
(kudr (f :. _car) !cdr str)
(if !equal $'d !car str
(kudr (f :. _cdr) !cdr str)
(kudr f !cdr str)))
};
は、もし if
および not
が関数なら 便宜上無適用リテラルを
`;`
と書くとして
def kudr f, str,
{
if not str
f `;`
if !equal $'a !car str
kudr (f :. _car) !cdr str `;`
if !equal $'d !car str
kudr (f :. _cdr) !cdr str `;`
kudr f !cdr str `;`
};
ただ、 if
および not
がマクロなら、 マクロのカリー化ができない仕様のせいで
カッコは省けない事になる。
pasberth commented
ただし
map x -> x list
のようにラムダ式を書くと Applox Applying では
map ((x -> x) list)
になるのが注意。でもそれは
#[ a -> b : * -> * -> * = !lambda a b `;` ]
これで回避できる。
pasberth commented
ただそう簡単には採用できない大きな変更である。
けっこう検証必要
pasberth commented
Applox Applying は空白文字がマクロであるとも考える事ができる。
#[ f ` ' x : * -> * -> * = !if !atom? x !funcall f x !lambda y !funcall f !funcall x y ]
と空白文字を定義できるとすると、
f x y
は
f ` ' x ` ' y
なので、 Applox Applying をマクロでエミュレートできる。
pasberth commented
不採用で良いと思う。