gpt4 book ai didi

macros - 什么是 "3D syntax"?

转载 作者:行者123 更新时间:2023-12-04 07:55:07 26 4
gpt4 key购买 nike

在编写 Racket 宏的上下文中,“3D 语法”是什么意思?

我已经听过几次这个词了。包括一次引用我正在编写的宏。但那是很久以前的事了;我修复了它,现在我不记得我最初做错了什么。

另外:3D 语法总是不好吗?还是像eval (如果你认为你需要使用它,你可能错了,但在专家手中有一些有效的用途)?

最佳答案

语法对象通常应该只是 serializable data . 3D 语法削弱了这种情况:它允许我们偷偷输入任意值,而不仅仅是普通数据。这就是使它们成为“3d”的原因:它们的值高于您对语法对象所期望的常规平面事物。

比如我们可以潜入lambda值(value)观!

#lang racket

(define ns (make-base-namespace))
(define (set-next! n)
(parameterize ([current-namespace ns])
(eval #`(define next #,n)))) ;; <-- 3d-syntax here

(define (compute s)
(parameterize ([current-namespace ns])
(eval s)))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define counter 0)
(set-next! (lambda ()
(set! counter (add1 counter))
counter))

(compute '(+ (next)
(next)
(next)
(next)))

这样做通常是一件坏事,因为这些值的存在可能意味着跨编译阶段泄漏信息的毫无根据的尝试。结果是可能无法单独编译的东西。如果您看到类似于以下内容的错误:
write: cannot marshal value that is embedded in compiled code value

那么这很可能是由于宏产生了一段无法序列化为字节码的 3d 语法。

有时,在极少数情况下,我们确实需要 3d 语法,通常是在动态评估上下文中。作为一个具体的例子,DrRacket 中的调试器可能希望对程序的语法进行注释,以便函数应用程序直接回调调试器的函数,以便我们可以在程序编辑器中进行交互式代码覆盖着色等操作。从这个意义上说,3d 语法可以充当动态评估代码与其周围环境之间的通信 channel 。

关于macros - 什么是 "3D syntax"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17437037/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com