假设我想对s-表达式中的第一项以外的其他内容触发Scheme宏。例如,假设我想用infix样式的define替换:=,这样:
(a := 5) -> (define a 5)
((square x) := (* x x)) -> (define (square x) (* x x))实际的转变似乎相当简单。诀窍将是获得方案,以找到:=表达式和宏展开它们。我考虑过用标准宏(可能是:(with-infix-define expr1 expr2 ...) )包围使用infix语法的代码,并让标准宏遍历其正文中的表达式并执行任何必要的转换。我知道,如果采用这种方法,我将不得不小心地避免转换实际上应该是数据的列表,例如引号列表,以及某些准引用列表的部分。我设想的一个例子是:
(with-infix-define
((make-adder n) := (lambda (m) (+ n m)))
((foo) :=
(add-3 := (make-adder 3))
(add-6 := (make-adder 6))
(let ((a 5) (b 6))
(+ (add-3 a) (add-6 b))))
(display (foo))
(display '(This := should not be transformed))所以,我的问题有两方面:
with-infix-define路线,除了报价和准报价之外,我还需要注意其他绊脚石吗?发布于 2012-05-29 05:27:37
:=作为infix语法进行读者级的处理。当然,这也意味着它在引号等方面也有问题,所以现在看来很糟糕,但我的经验是,你最终会意识到,最好是做一些consistently.(x . define . 1)被读为(define x 1)。(正如上面所述,everywhere.)#%module-begin的特殊宏,它包装了一个完整的模块体,而#%top-interaction则封装了REPL上的分层表达式。(这两种方法都是在这两种上下文中隐式添加的。)下面是一个示例(为了简单起见,我使用了Racket的define-syntax-rule ):#lang racket/base (提供(除了-out(所有的球拍/基)#%模块-开始#%的顶部交互)(重命名出我的模块-开始#%的模块-开始))(定义-语法嵌入-def(语法-规则(:= begin) ) (_ (begin E.)(infix-def E) .) (_ E) (定义-语法规则(my-模块-begin E.)(#%模块-begin (infix-def E) .))(定义-语法-规则(我的-顶部-交互)。E) (#%顶极交互作用)。(infix-def E))
如果我将其放入一个名为my-lang.rkt的文件中,现在可以如下所示使用它:
#lang s-exp "my-lang.rkt“(x := 10) ((fib n) := (完成?:= (<= n 1)(如果完成?N (+ (fib (- n1)) (fib (- n2) (fib X)
begin表达式和处理函数体。这显然是一个非常片面的列表--你也会想要一些lambda,let,等等。但是这仍然比一些盲目的按摩要好,因为这是不实际的,因为你不能事先知道一些随机的代码是如何结束的。作为一个简单的例子,请考虑下面这个简单的宏:(定义-语法-规则(E轨道)(开始(eprintf )评估:~s\n“' E) ) (x := 1)
(if := 1)的东西-这是一个条件表达式还是一个定义?你如何决定哪个优先?)因此,对于具有“可爱语法”的语言,一种更流行的方法是将代码读入普通的S-表达式,然后让实际的语言实现使用简单的函数和宏.。
发布于 2012-05-29 09:46:56
重新定义define有点复杂。见伊莱的精辟解释。
另一方面,如果您满足于:=使用set!,那么事情就会简单一些。
下面是一个小例子:
#lang racket
(module assignment racket
(provide (rename-out [app #%app]))
(define-syntax (app stx)
(syntax-case stx (:=)
[(_ id := expr)
(identifier? #'id)
(syntax/loc stx (set! id expr))]
[(_ . more)
(syntax/loc stx (#%app . more))])))
(require 'assignment)
(define x 41)
(x := (+ x 1))
(displayln x)为了将该示例保留为单个文件,我使用了子模块(在Racket的预发布版本中可获得)。
https://stackoverflow.com/questions/10791481
复制相似问题