Scheme 如何编写接收任意数量参数的宏并将其打印出来?

Scheme 如何编写接收任意数量参数的宏并将其打印出来?,scheme,racket,Scheme,Racket,上述代码在racket中运行时将发出以下错误: 格式:格式字符串需要1个参数,给定3个;论点如下: ~a“1”2 3 那么,当使用(prnt“1”2 3)时,如何实现它可以打印prnt之后的任何内容?如果您确实需要宏: (define-syntax prnt (syntax-rules () [(prnt elem ...) (display (format "~a" elem ...))] )) 如果您只想通过一个函数调用显示

上述代码在racket中运行时将发出以下错误:

格式:格式字符串需要1个参数,给定3个;论点如下: ~a“1”2 3


那么,当使用(prnt“1”2 3)时,如何实现它可以打印prnt之后的任何内容?

如果您确实需要宏:

(define-syntax prnt 
  (syntax-rules ()
               [(prnt elem ...) (display (format "~a" elem ...))]
               ))
如果您只想通过一个函数调用显示多个对象,则不需要宏,不过:

(define-syntax prnt 
  (syntax-rules ()
    [(prnt elem ...)
     (begin (displayln elem) ...)]))

我只是很少像我想的那样使用宏语法,所以我只想用这个小例子来了解它。我只是对它进行了一点测试:
((lambda v(display v))elem…
,因为宏模板也可以工作:)好吧,如果您想练习阅读语法规则宏,这里还有几个模板应该可以工作:
(display(list elem…)
(这与您的解决方案相当)<代码>(开始(开始(显示元素)(显示“”)…)。哦,当然还有递归宏变量:
(定义语法prnt(语法规则()[((u)(void)][((ue1 e2…)(begin(displayln e1)(prnt e2…))
)在最后一个例子中使用
map
是不好的——每个
都应该是
。作为记录,对于任何询问为什么每个
都是
的人来说,在本文中比
map
更好:1<代码>对于每个
从左到右处理列表项<代码>映射
不提供此类保证。2. <代码>对于每个
都不会生成结果列表(在本例中,结果列表只是被丢弃)。3.在R6RS以后的版本中,“未指定值”可以是零或多个值,而不是单个值,因此
map
与返回“未指定值”(例如
display
)的函数一起使用时可能会失败。此处的实际上下文是Racket,因此,针对“map”的order参数和来自“for each”的未指定数量的返回值不成立。但这里重要的一点是返回类型,事实上,你并不在乎你从这样一个函数中得到什么,因为它只会产生副作用。(遗憾的是R*RS仍然没有给你这样的价值…)
(define (prnt . args)
  (for-each displayln args))