hygiene

    6热度

    3回答

    在Common Lisp中,创建宏定义宏相对容易。例如,以下宏 (defmacro abbrev (short long) `(defmacro ,short (&rest args) `(,',long ,@args))) 是一个宏定义的宏,因为它扩展到另一个宏。 如果我们现在把 (abbrev def defun) 在我们的节目中,我们可以写def而不是defun当

    5热度

    1回答

    我想在python中编写一个类似于小程序的语言,以便更好地理解方案。 问题是我停留在语法对象上。我无法实现它们,因为我不太了解它们的用途以及它们的工作原理。 为了试图理解它们,我在DrRacket中使用了语法对象。 从我已经能够找到,评估#'(+ 2 3)没有从评估'(+ 2 3)不同,除了有一个词汇+可变阴影的一个在顶级命名空间的情况下,在这种情况下仍然(eval '(+ 2 3))回报5,但(

    8热度

    1回答

    一些人声称LISP中的单个命名空间会导致不卫生的宏。 http://community.schemewiki.org/?hygiene-versus-gensym http://www.nhplace.com/kent/Papers/Technical-Issues.html 什么恰恰是它关于有单,双或多个命名空间,导致宏观卫生?

    3热度

    1回答

    我发现一个unless宏的例子在写朱莉娅here如下: macro unless(test, branch) quote if !$test $branch end end end 然而,当我尝试使用它,它失败(显然存在卫生问题,但我想不出它完全)。下面是我使用的测试: x, y = 0, 1 @unless (x == 5) begin

    3热度

    1回答

    至于朱莉娅0.4.2 macro g(y) :((x, $y, $(esc(y)))) end x = 1 function t() x = 2 println(macroexpand(:(@g(x)))) println(@g(x)) end t() println(x) >>> (x,x,x) (2,2,2) 1 我所预料的

    3热度

    1回答

    我有一个引用表达式,比如这一个: ast = quote do IO.puts x end 而且我想给一个变量注入表达,使x的值,并表达不会提高一个CompileError由于x评估时,像这样是不确定的: Code.eval_quoted ast, [x: "Hello, world!"] 这AST传递给我,我不能改变它与生成的代码。我可以在我通过它之后修改AST。 我认为要做

    5热度

    2回答

    假设我正在编写一个为第三方类添加功能的mixin模块。很显然,我想让第三方类和它的客户端可以访问一些方法和实例变量。这些构成了mixin模块的公共接口。 但我想要封装某些其他方法和实例变量。我不希望它们能够被我混入的类访问,特别是我不希望它们意外覆盖,影响,冲突或以其他方式干扰mixee类的方法或实例变量 - 无论是那些目前可能存在的问题,或者如果第三方修改我正在混合的课程,那么未来可能会创建这些

    3热度

    1回答

    我试图在球拍中写一个define-let宏,它可以“保存”(let ((var value) ...) ...)的头部,也就是(var value) ...的一部分,并允许稍后重新使用它。 下面按预期工作的代码: #lang racket ;; define-let allows saving the header part of a let, and re-use it later (de

    2热度

    1回答

    的syntax-parameterize结合通常用于与make-rename-transformer使得语法参数p表现为另一标识符的别名: #lang racket (require racket/stxparam) (define-syntax-parameter p #f) (define-syntax (test-1-p stx) (syntax-case stx()