pasberth/Macra

Applox Applying を採用しよう

Closed this issue · 4 comments

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 がマクロなら、 マクロのカリー化ができない仕様のせいで
カッコは省けない事になる。

ただし

map x -> x list

のようにラムダ式を書くと Applox Applying では

map ((x -> x) list)

になるのが注意。でもそれは

#[ a -> b : * -> * -> * = !lambda a b `;` ]

これで回避できる。

ただそう簡単には採用できない大きな変更である。
けっこう検証必要

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 をマクロでエミュレートできる。

不採用で良いと思う。