Macros 如何在scheme中编写带双准引号的LISP宏

Macros 如何在scheme中编写带双准引号的LISP宏,macros,scheme,lisp,lisp-macros,Macros,Scheme,Lisp,Lisp Macros,我需要在scheme中编写lisp宏(请使用宏和语法规则等),它将函数调用和列表作为参数 我希望调用该函数的函数和宏具有如下语法: (foo '(10 (a (lambda () (display "10")) b (lambda () (display "20")))) 或不带引号的宏 我的最后一段代码正在运行,但不确定您是否打算这样编写函数/宏。似乎我需要双引号,但不知道如何写。(我现在正在读Paul Graham的《在嘴唇上》一书,他说双反引号是非常困难的,只有定义宏的宏才需要双反引号,

我需要在scheme中编写lisp宏(请使用宏和语法规则等),它将函数调用和列表作为参数

我希望调用该函数的函数和宏具有如下语法:

(foo '(10 (a (lambda () (display "10")) b (lambda () (display "20"))))
或不带引号的宏

我的最后一段代码正在运行,但不确定您是否打算这样编写函数/宏。似乎我需要双引号,但不知道如何写。(我现在正在读Paul Graham的《在嘴唇上》一书,他说双反引号是非常困难的,只有定义宏的宏才需要双反引号,但这似乎是我需要的)

这是对映射的定义

(define (pair-map fn seq-list)
  "(seq-map fn list)

   Function call fn argument for pairs in a list and return combined list with
   values returned from function fn. It work like the map but take two items from list"
  (let iter ((seq-list seq-list) (result '()))
    (if (null? seq-list)
        result
        (if (and (pair? seq-list) (pair? (cdr seq-list)))
            (let* ((first (car seq-list))
                   (second (cadr seq-list))
                   (value (fn first second)))
              (if (null? value)
                  (iter (cddr seq-list) result)
                  (iter (cddr seq-list) (cons value result))))))))
使用
(string->symbol“quasikote”)
我无法使用双反引号,这可以用双反引号/quasikote编写吗?这应该是什么样子


我想知道这是否可以用不同的方式编写,这样我就可以在我自己的lisp解释器中解决一些问题(不确定是否正常工作,但最终版本的工作原理似乎是一样的)。

我提出了较短的Quasikote版本,但仍然需要插入符号:

(define (foo expr)
    `(list ,(car expr)
           (,'quasiquote ,(pair-map (lambda (a b)
                                      `(,(symbol->string a) . (,'unquote ,b)))
                                    (cadr expr)))))

我提出了较短的Quasikote版本,但仍然需要插入符号:

(define (foo expr)
    `(list ,(car expr)
           (,'quasiquote ,(pair-map (lambda (a b)
                                      `(,(symbol->string a) . (,'unquote ,b)))
                                    (cadr expr)))))

映射对
具有单臂
if
。因此,
配对映射
可能会返回
“香蕉”
,因为单臂
的行为如果
未指定。代码是什么?@sylvest假设它是以car和Alist作为第二项的列表,它应该扩展到
(列表10((a.20)(b)(lambda()(显示“x”)(新行))
我想我理解。你的意思是它扩展到
(列表10(`(a.,20)(b.)),(lambda()(显示“x”)(换行符)))
这样lambda就变成一个函数了吗?@Sylwester是的,我已经编辑了这个问题。我不确定我是否理解这个问题,但是如果你想制作一个过程列表,你可以简单地使用
Quasikote
而不是使用宏。
map pair
有一个单臂
if
。因此
pair map
可能返回
“香蕉”
,因为单臂
的行为如果
是未指定的。什么是
(条形图(10)(A20b(lambda()(显示“x”)(换行符“))
假设扩展到?@sylvester如果它是以car和Alist作为第二项的列表,它应该扩展到
(列表10(a.20)(b.(lambda()(显示“x”)(换行符)))
我想我明白了。你的意思是它扩展到了
(列表10`((a.,20)(b.,(lambda()(display“x”)(newline)))
这样lambda就变成了一个函数?@sylvester是的,我已经编辑了这个问题。我不确定我是否理解这个问题,但是如果你想列出过程,你可以简单地使用
quasikote
而不是使用宏。