Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme “宏”的方案;或;_Scheme - Fatal编程技术网

Scheme “宏”的方案;或;

Scheme “宏”的方案;或;,scheme,Scheme,为了学习Scheme宏,我将学习Kent Dybvig的“Scheme编程语言” 在第8.2节中 他有“或”宏的例子 有什么原因他没有使用更简单的形式: (define-syntax or (syntax-rules () ((_) #f) ((_ e) e) ((_ e1 e2 ...) (let ((t e1)) (if t t (or e2 ...)))))) 这两种形式是否等效展开?后跟…的子模式可以匹配输入的零个或多个元素。使用e1 e

为了学习Scheme宏,我将学习Kent Dybvig的“Scheme编程语言”

在第8.2节中 他有“或”宏的例子

有什么原因他没有使用更简单的形式:

(define-syntax or
   (syntax-rules ()
     ((_) #f)
     ((_ e) e)
     ((_ e1 e2 ...)
      (let ((t e1)) (if t t (or e2 ...))))))

这两种形式是否等效展开?

后跟
的子模式可以匹配输入的零个或多个元素。使用
e1 e2 e3
使此案例与前一个案例截然不同。

在我看来,这样做是为了让事情更清楚一点——您的简单形式取决于案例的顺序,因为
(或x)
可以匹配第二个和第三个规则。因此,使案例相互排斥可以使其更易于阅读,也更健壮

(顺便说一句,这里有一个更微妙的点,我最初以为你在问:为什么不进一步简化为:

(define-syntax or
  (syntax-rules ()
    ((_) #f)
    ((_ e1 e2 ...)
     (let ((t e1)) (if t t (or e2 ...))))))

?)

不太可能,请注意Harry的简单形式仍然计算出正确的值。Eli,是的,你的“使案例相互排斥,使其更易于阅读和更可靠”正是我想说的“使此案例与前一个案例截然不同”。@Eli感谢Eli。在Racket中,如果我键入类似(expand)(或a b c))的内容,它会显示“or”宏扩展到什么,但是在Racket中有没有办法不查看宏扩展到什么,而是查看作为宏的Racket表单的宏表单本身。@Harry:试试宏步进器,标准的隐藏策略不会显示
扩展,因此,您需要单击
使其聚焦,然后右键单击并选择显示它。。。。我觉得很尴尬,花了我这么长时间才弄明白:)@eli我刚刚在Kent Dybvig的书中看到,他有一个练习3.2.6,说明你的较短版本的or宏与他的较长版本不相等。链接是:。我不知道原因是什么?也许你可以澄清一下。@HarrySpier:他给了一个很好的暗示。。。如果您想要一个可能更直接的提示,请查看它是如何展开的:
(定义(循环)(或'foo(循环))
(define-syntax or
  (syntax-rules ()
    ((_) #f)
    ((_ e1 e2 ...)
     (let ((t e1)) (if t t (or e2 ...))))))