【问题标题】:scheme on guile: let-syntax invalid?关于诡计的方案:让语法无效?
【发布时间】:2012-03-28 05:52:25
【问题描述】:

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

目前,我正在尝试将 let-syntax 嵌套在 define-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)

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

【问题讨论】:

  • 你想达到什么目的?您期望样本的输出是什么?
  • (coffee (define (xy) (+ xy)) 应该将define语句从scheme转换为等效的coffeescript。虽然,这个特定的例子有点荒谬。如果我的语法正确,输出应该是:x = (y) -> x + y
  • let-syntax 就像 let 一样,它的作用域是围绕一个主体。但是你在这里使用let-syntax 没有正文。你可以看出这一点,因为(let-syntax ...)(if (list? ...) ...) 的缩进级别相同。

标签: macros scheme guile


【解决方案1】:

Scheme R5RS specificationlet-syntax 具有以下语法:

 (let-syntax <bindings> <body>) 

语法:应该有格式

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

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

【讨论】:

  • 谢谢——我最终使用了完全不同的方法来解决我的任务,但你和 dyoo 说的仍然有帮助。
猜你喜欢
  • 2016-10-26
  • 2011-10-01
  • 1970-01-01
  • 2011-08-16
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多