Scheme 我需要一个函数来显示';未加工的';表达

Scheme 我需要一个函数来显示';未加工的';表达,scheme,Scheme,我不熟悉Scheme,所以如果我用错了词汇,请原谅。我想要一个函数,我称之为QandA,它将(除其他外)显示其原始或未处理的参数。例如: (QandA (+ 1 2)) should return the string "(+ 1 2) : 3" (QandA (quote (+ 1 2))) should return "(quote (+ 1 2)) : (+ 1 2)" 我第一次尝试的是: (define (QandA x) (display (quote x)) (dis

我不熟悉Scheme,所以如果我用错了词汇,请原谅。我想要一个函数,我称之为QandA,它将(除其他外)显示其原始或未处理的参数。例如:

 (QandA (+ 1 2)) should return the string "(+ 1 2) : 3" 
 (QandA (quote (+ 1 2))) should return "(quote (+ 1 2)) : (+ 1 2)"
我第一次尝试的是:

 (define (QandA x)
   (display (quote x)) (display " : " ) (display x))
但是

 (QandA (+ 1 2)) returns "x : 3" 
我理解这是错误的,但不知道从哪里寻找解决方案


所以问题是,我应该用什么替换(display(quote x))来获得我需要的行为。欢迎任何提示

如您所见,您无法使用函数实现它,因为参数是在传递给函数之前计算的

一种解决方案是使用,它可以访问未处理的表达式并创建另一个表达式

下面是一个适用于

生成宏所支持的语法因解释器而异,因此您应该检查正在使用的解释器文档。

但是,
define syntax
syntax rules
应该能够在支持or的解释器中使用。

正如@ymonad所指出的,这是一个很好的使用场景-因为您需要推迟对作为参数传递给
QandA
的表达式的求值。您以前的一些问题被标记为
racket
,因此下面是一个使用
#lang racket
(也适用于
#lang scheme
)的racket实现(如果您想显示值,请使用
printf
)返回字符串:

这是问题中给出的示例输入的输出:

(QandA (+ 1 2))
=> "(+ 1 2) : 3"

(QandA (quote (+ 1 2)))
=> "(quote (+ 1 2)) : (+ 1 2)"

对于这个问题,了解您使用的是哪种解释器是非常相关的。请添加相应的标签;)我使用的是Dr Racket,但使用的是#lang scheme(如果我错了,请纠正我),这应该会使事情变得像scheme一样。我的首选方案是“纯”方案(如果存在任何此类方案)。我的方案将使用
#lang scheme
,但它不是标准方案。仅使用标准过程,将表达式的值转换为字符串会很麻烦(因为我们事先不知道会是什么)。当然,如果您只需要显示答案,那么@ymonad的答案就可以了。顺便说一句,这里有一些关于
#lang scheme
的说明。对于基于标准的方案,您应该使用
#lang r6rs
…与Racket相比,您会发现一些限制。
语法规则自R5RS以来一直是标准的,预计将“永远”保持标准化。我会考虑任何缺少代码>语法规则< /代码>支持的方案被打破。换句话说,我不认为<代码>语法规则< /代码>是“不同的解释器”。对不起,我的意思是“不同的解释者”,就是可能有更方便的语法,如“代码>定义语法规则< /代码>在球拍中,在其他解释器中并不总是支持,所以检查文档并在可能的情况下使用它。是的,大多数最近的方案实现至少支持
R5RS
。如果我们谈论的是Racket,那么在本例中直接使用
define syntax rule
。:-)@克里斯·杰斯特·杨是的,那更简单。知道了!谢谢,这一切都有道理。
(define-syntax-rule (QandA exp)
  (format "~a : ~a" 'exp exp))
(QandA (+ 1 2))
=> "(+ 1 2) : 3"

(QandA (quote (+ 1 2)))
=> "(quote (+ 1 2)) : (+ 1 2)"