任意の ConstExpr (数値など) をマクロで置換したい。
Closed this issue · 2 comments
pasberth commented
たとえば 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]
の場合 1
と 2
は toplevel
で 3
だけ list
のコンテキストだから
#[ `x' : list -> list
= !cons x nil ]
とか定義できればいい。
ただ仕様が複雑になる。ちゃんと検討したい
pasberth commented
仕様が複雑になるというのは、たとえば
[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
になってしまう。。
pasberth commented
これはたぶんいらない