pasberth/Macra

任意の ConstExpr (数値など) をマクロで置換したい。

Closed this issue · 2 comments

たとえば https://github.com/pasberth/Macra/blob/11aded4397fc4e5b64fb654767abfdfd963ebb39/examples/list-literal.macra なんだけど、

#[ [a] : list -> toplevel
       = a ]

#[ a, b : toplevel -> list -> list
        = !cons a b ]

!print [1, 2, 3, nil]

[1, 2, 3, nil] って書かなくちゃいけないのは、

[1, 2, 3, nil] == !cons 1 !cons 2 !cons 3 nil
[1, 2, 3] == !cons 1 !cons 2 3

だからなんだけど、

もし [1, 2, 3]3 だけ !cons 3 nil に置換できれば、

[1, 2, 3] == !cons 1 !cons 2 !cons 3 nil

とできて、 nil いらなくなる。

#[ [a] : list -> toplevel
       = a ]

#[ a, b : toplevel -> list -> list
        = !cons a b ]

この定義だと [1, 2, 3] の場合 12toplevel3 だけ list のコンテキストだから

#[ `x' : list -> list
        = !cons x nil ]

とか定義できればいい。

ただ仕様が複雑になる。ちゃんと検討したい

仕様が複雑になるというのは、たとえば

[1, 2, (f x)]

としたら、やはり (f x)!cons (f x) nil に置換されて欲しいんだけど、もし任意の式を置換できるのだとすれば

[1, 2, 3]

は、まず

3

!cons 3 nil

になって、 2, !cons 3 nil

!cons 2 !cons 3 nil

になって、それがさらに 任意の式のはずだから

!cons !cons 2 !cons 3 nil nil

になってしまう。。

これはたぶんいらない