syntax - 方案语法转换

标签 syntax scheme

我对Scheme相当陌生,我一直在努力解决我认为应该是一个简单的问题。

我正在尝试转换类似的内容

((qty 30) (name "ham"))(sandwich "@qty" 30) (sandwich "@name" "ham")

此外,这必须是动态的以允许额外的子句:

((qty 30) (name "ham") (cheese 'no))

这是我到目前为止所拥有的:

(define-syntax (make-sandwiches x)
        (syntax-case x ()
            [(_ ((col val)...) ) #``(sandwich #,(format "@,~a" (caar #'((col val)...))) #,(cadar #'((col val)...)))] 
            [(_) "make-sandwiches is bad"]))

(make-sandwiches ((qty 30) (name "ham"))) => (param "@#(syntax qty)"30)

所以这有点接近,但它只翻译第一个子句,所以我的想法是使用 map或类似的东西,但我不确定这是否正确:

(define-syntax (make-sandwiches x)
        (syntax-case x ()
            [(_ ((col val)...)) (map (lambda (cv) #``(sandwich #,(format "@,~a" (caar cv)) #,(cadar cv))) #'((col val)...))] 
            [(_) "make-sandwiches is bad"]))

最佳答案

你真的必须使用宏吗?并返回多个值?一个返回列表的简单程序就可以解决问题:

(define (make-sandwiches lst)
  (map (lambda (data)
         (list 'sandwich
               (string-append "@" (symbol->string (car data)))
               (cadr data)))
       lst))

或者更短一点(你似乎正在使用 Racket):

(define (make-sandwiches lst)
  (map (lambda (data) `(sandwich ,(format "@~a" (first data)) ,(second data)))
       lst))

例如,使用问题中的示例输入:

(make-sandwiches '((qty 30) (name "ham") (cheese 'no)))
=> '((sandwich "@qty" 30) (sandwich "@name" "ham") (sandwich "@cheese" 'no))

关于syntax - 方案语法转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24659898/

相关文章:

ruby - 将未知数量的参数传递给 ruby​​ 函数

syntax - Lisp : how to use recursion to defun a function that given a nonnegative integer N, 生成从 1 到并包括 N 的所有整数的列表?

java - Eclipse 想要一个已经存在的分号

scheme - 与数学运算符的字符关联

lambda - 将函数列表应用于 Racket 中的值列表

Haskell 数据类型语法与操作,第二部分

function - def f(x : Int) = x+1 and val f = (x: Int) => x+1 in Scala 之间的实际区别

garbage-collection - 在函数式语言中使用大型数据结构时减少垃圾收集时间

list - 如何使用 chez 方案获得给定列表中所有元素 >10 的总和?

计划 - eq?比较2个字符串?