guile上的方案:让语法无效?

时间:2012-03-11 16:36:43

标签: macros scheme guile

对于函数式编程赋值,我正在编写一个将方案代码转换为coffeescript代码的方案宏。我在Linux Mint 12上使用guile,并且(use-syntax(ice-9 syncase))处于活动状态。

目前,我正在尝试在define-syntax中嵌套let-syntax,并且我不断收到意外的“无效语法”错误。请原谅任何糟糕的编程习惯,因为我是一个计划新手。 :)

我的代码:

(define-syntax coffee
  (syntax-rules (define lambda)
    ; translate define function
    ((_ (define arg1 arg2)) 
     (begin
       (let-syntax ((temp
                     (syntax-rules ()
                       ((_) (quote-replace-list 'arg1 'arg2))))))
       (if (list? 'arg1) 
           (string-append (coffee (car 'arg1)) " = " 
                          (comma-splice (cdr 'arg1)) " -> " 
                          (coffee temp))
           (string-append (coffee 'arg1) " = " 
                          (coffee arg2)))))))

和我的输出:

guile> (load "hw2-retry.scm")
guile> (coffee (define (x y) (+ x y)))
ERROR: invalid syntax (let-syntax ((temp (syntax-rules () ((_)
(quote-replace-list (quote #) (quote #)))))))
ABORT: (misc-error)

在尝试研究这个错误之后,我开始认为我只是不理解一些基本的东西。我确信你可以在define-syntax中嵌入let语法。我做错了什么?

1 个答案:

答案 0 :(得分:1)

Scheme R5RS specification开始,let-syntax具有以下语法:

 (let-syntax <bindings> <body>) 
     

语法:应该有

形式
((<keyword> <transformer spec>) ...)

代码中let-syntax的问题(或者至少是其中一个问题)是if应该包含在正文部分中,正如dyoo所提到的那样。换句话说,你应该缩进if,从第8行的末尾删除一个右括号,并在第14行的末尾添加结束语。