pasberth / Macra

Macro Oriented Language
4 stars 2 forks source link

Applox Applying を採用しよう #76

Closed pasberth closed 11 years ago

pasberth commented 11 years ago

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 11 years ago

ただし

map x -> x list

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

map ((x -> x) list)

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

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

これで回避できる。

pasberth commented 11 years ago

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

pasberth commented 11 years ago

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 11 years ago

不採用で良いと思う。