pasberth / Macra

Macro Oriented Language
4 stars 2 forks source link

パーサの仕様変えるかも。 #74

Open pasberth opened 11 years ago

pasberth commented 11 years ago

https://github.com/pasberth/Macra/blob/newParserSpec/Macra/Parser.hs

今このブランチにあるパーサ 検証した後マージするかもしれない。

この変更は master の examples にあるプログラムには影響はない。

prelude はかなり影響受ける。

たとえば

https://github.com/pasberth/Macra/blob/prelude/pure/prelude/map.macra

def map f, xs =>
  if (not xs)
      xs
      [f (car xs) :cons map f (cdr xs)]

=> は今までは

(def map f, xs) => (
  if (not xs)
      xs
      [f (car xs) :cons map f (cdr xs)]
)

のように結合していた。でもこの結合が

((def map f, xs) => (
  if) (not xs)
      xs
      [f (car xs) :cons map f (cdr xs)]
)

に変わる。

つまり x => y の y には関数適用の構文が許されていたけど許されなくなる、ということ

これ次からは

def map f, xs => {
  if (not xs)
      xs
      [f (car xs) :cons map f (cdr xs)]
}

のようにカッコが必須になるかもしれない。

また、

map { x => puts x } [1, 2, 3, nil]

{ x => puts x }

も許されなくなり、これも

map x => {puts x}

とかにする必要あり。

pasberth commented 11 years ago

この変更をする理由は3つある

たとえば、 => の右に関数適用の構文を許さない事によって

f a g key => val c

f a (g key => val) c

のように解析できる事

もし関数適用が許されるなら

f a (g key => (val c))

と解析されてしまう

次に、 => の右に関数適用を許す理由がうすくなってきたから

もともと => の右に関数適用の構文が許されるのは

{ x => puts x }

みたいな構文ができるからという理由が大きかった。でも、もし => の右で中置構文を使いたかったら

{ x => puts x :infix hoge x }

これは今の仕様では許されないから

{ x => (puts x :infix hoge x) }

結局カッコが必須になる。 だから、だったら始めから必須にしちゃった方が良いという理由

あとはパーサの仕様が => の右で関数適用を許すのがやや汚い仕様だから、きれいにしたい

pasberth commented 11 years ago

ただこの仕様の変更をする利点はそんなにない気がする。今は保留。