标签: hygiene

使用宏收集优秀的应用程序和程序

我对Macros非常感兴趣,刚刚开始了解它的真正力量.请帮我收集宏系统的一些很好的用法.

到目前为止,我有这些结构:

模式匹配:

安德鲁赖特和布鲁斯杜巴.Scheme的模式匹配,1995

Prolog精神的关系:

Dorai Sitaram.在schelog中编程. http://www.ccs.neu.edu/home/dorai/schelog/schelog.html

Daniel P. Friedman,William E. Byrd和Oleg Kiselyov.理性的计划者.麻省理工学院出版社,2005年7月

Matthias Felleisen.将Prolog音译为方案.技术报告182,印第安纳大学,1985年.

可扩展循环结构:

塞巴斯蒂安·埃格纳 方案中的热切理解:SRFI-42的设计."计划与功能规划研讨会",2005年9月第13-26页.

奥林颤抖.循环的解剖:范围和控制的故事.在国际功能规划会议,第2-14页,2005年.

班级系统:

PLT.PLT MzLib:图书馆手册.技术报告PLT-TR2006-4-v352,PLT方案公司,2006年 http://www.plt-scheme.org/techreports/

Eli Barzilay.骗取. http://www.barzilay.org/Swindle.

组件系统:

Ryan Culpepper,Scott Owens和Matthew Flatt.组件接口中的语法抽象.在生成编程和组件工程国际会议,第373-388页,2005年

软件合同检查

Matthew Flatt和Matthias Felleisen.单位:用于HOT语言的酷模块在ACM SIGPLAN会议上编程语言设计和实现,第236-248页,1998年

Oscar Waddell和R. Kent Dybvig.扩展句法抽象的范围.在编程语言原理研讨会上,第203-215页,第199页

解析器生成器

Scott Owens,Matthew Flatt,Olin Shivers和Benjamin McMullan.Scheme中的Lexer和解析器生成器.关于计划和功能规划研讨会,2004年9月第41-52页.

工程语义工具:

Matthias Felleisen,Robert Bruce Findler和Matthew Flatt.PLT Redex的语义工程.MIT出版社,2009年8月.

编译器转换的规范:

Dipanwita Sarkar,Oscar Waddell和R. Kent Dybvig.用于编译器教育的纳米框架.功能规划期刊,15(5):653-667,2005年9月.教育明珠.

新的执行形式

具有可序列化延续的Servlet Greg Pettyjohn,John Clements,Joe Marshall,Shriram Krishnamurthi和Matthias Felleisen.广义堆栈检查的延续.在国际功能规划会议上,第216-227页,2005年.

定理证明系统

塞巴斯蒂安·埃格纳 方案中的热切理解:SRFI-42的设计.在计划与功能规划研讨会上,2005年9月第13-26页.

基类的扩展与类型

Sam Tobin-Hochstadt和Matthias Felleisen.打字方案的设计和实施.在编程语言原理研讨会上,第395-406页,2008年.

怠惰

Eli Barzilay和John Clements.没有辛勤工作的懒惰:将懒惰和严格的语言结合起来进行教学.在教育中的功能和声明性编程中,第9-13页,2005年. …

lisp macros scheme hygiene racket

57
推荐指数
2
解决办法
2633
查看次数

有人可以向我解释"卫生"的概念(我是计划程序员)吗?

所以...我是计划r6rs的新手,我正在学习宏.有人可以向我解释"卫生"是什么意思吗?

提前致谢.

macros scheme hygiene r6rs

28
推荐指数
2
解决办法
5570
查看次数

什么是单个命名空间导致不卫生的宏?(在LISP中)

有人声称LISP中的单个命名空间会导致不卫生的宏. http://community.schemewiki.org/?hygiene-versus-gensym

http://www.nhplace.com/kent/Papers/Technical-Issues.html

具有导致宏观卫生的单个,双重或多个名称空间究竟是什么?

lisp macros scheme clojure hygiene

8
推荐指数
1
解决办法
1000
查看次数

如何在程序宏生成的代码中创建卫生标识符?

在编写声明性 ( macro_rules!) 宏时,我们会自动获得宏卫生。在这个例子中,我声明了一个f在宏中命名的变量并传入一个标识符f,该标识符成为一个局部变量:

macro_rules! decl_example {
    ($tname:ident, $mname:ident, ($($fstr:tt),*)) => {
        impl std::fmt::Display for $tname {
            fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
                let Self { $mname } = self;
                write!(f, $($fstr),*)
            }
        }
    }
}

struct Foo {
    f: String,
}

decl_example!(Foo, f, ("I am a Foo: {}", f));

fn main() {
    let f = Foo {
        f: "with a member named `f`".into(),
    };
    println!("{}", f);
}
Run Code Online (Sandbox Code Playgroud)

这段代码可以编译,但是如果查看部分展开的代码,您会发现存在明显的冲突:

impl std::fmt::Display …
Run Code Online (Sandbox Code Playgroud)

macros hygiene rust rust-proc-macros

8
推荐指数
2
解决办法
1643
查看次数

Racket中的宏定义宏?

在Common Lisp中,创建宏定义宏相对容易.例如,以下宏

(defmacro abbrev (short long)
  `(defmacro ,short (&rest args)
     `(,',long ,@args)))
Run Code Online (Sandbox Code Playgroud)

是一个宏定义宏,因为它扩展到另一个宏.

如果我们现在放

(abbrev def defun) 
Run Code Online (Sandbox Code Playgroud)

在我们的程序中,我们可以编写def而不是defun在定义新函数时.当然,abbrev也可以用于其他事情.例如,之后

(abbrev /. lambda)
Run Code Online (Sandbox Code Playgroud)

我们可以写(/. (x) (+ x 1))而不是(lambda (x) (+ x 1)).尼斯.(有关缩写的详细说明,请参阅http://dunsmor.com/lisp/onlisp/onlisp_20.html)

现在,我的问题是:

  1. 我可以在Racket中编写宏定义宏吗?
  2. 如果可以的话,怎么做?(例如,如何abbrev在Racket中编写类似于 宏的内容?)

lisp macros common-lisp hygiene racket

7
推荐指数
2
解决办法
576
查看次数

Julia中的宏调用与宏定义环境

我试图通过Julia关于宏观卫生的Metaprogramming文档中的陈述来理解.文件声称

Julia的宏扩展器以下列方式解决了这些问题.首先,宏结果中的变量被分类为本地或全局变量.如果将变量分配给(并且未声明为全局变量),声明为本地变量或将其用作函数参数名称,则该变量被视为本地变量.否则,它被认为是全球性的.然后将局部变量重命名为唯一(使用生成新符号的gensym()函数),并在宏定义环境中解析全局变量.因此,处理上述两个问题; 宏的locals不会与任何用户变量冲突,time和println将引用标准库定义.

我编写了一个小程序来查看全局变量是否确实在宏定义环境中得到了解决.我写了以下内容:

f(x) = x + 100 

macro g()         # According to Julia docs, ...
  :(f(x) + 5)     # ... f is global, x is local, right?
end               # if so, f should refer to the f above?

(function main()
  local x = 3
  f(x) = x - 100  # f in the call environment subtracts 100
  println(@g())   # So why does this do -92?
end)()
Run Code Online (Sandbox Code Playgroud)

如果我要正确理解Julia文档,宏观卫生的一部分是确保在宏的返回表达式中调用的任何函数都不会被调用者环境中的同名函数劫持.但这正是这里发生的事情,使用的函数f是在本地定义的函数.

我原本以为我必须使用esc才能f在通话点使用范围.但事实并非如此,为什么呢?

另外,我注意到x …

macros hygiene julia

6
推荐指数
1
解决办法
482
查看次数

如何调试 Julia 宏?

注意:这个问题指的是Julia v1.6。当然,任何时候答案都应该理想地回答最新版本的问题。

朱莉娅的宏观卫生似乎存在很多问题和困惑。当我阅读相关手册页时,我仍然很难在使用插值 ( $name)quote和其他引用语法、宏和作用于表达式的函数之间的行为差​​异等内容时编写宏esc

Julia 提供了哪些工具来查找宏中的错误以及如何有效地使用它们?

这当然是一个广泛的问题,我认为它非常值得一个专门的手册页,而不是当前元编程概述中的事后想法。尽管如此,我认为通过考虑和调试一个具体的例子可以有效地回答这个问题(即,以一种教会我和其他人很多关于主要、一般性问题的方式)。因此,我将讨论一个简单的

玩具示例宏:

(请注意,宏Base.@locals “构造[s]一个包含调用站点定义的所有局部变量的名称(作为符号)和值的字典”[来自文档字符串]。)

# Julia 1.5
module MyModule

foo = "MyModule's foo"

macro mac(print_local=true)
    println("Dump of argument:{")
    dump(print_local)
    println("}\n\n")

    local_inmacro = "local in the macro"

    return quote
        println(repeat("-", 30)) # better readability of output

        # intention: use variable local to the macro to make a temporary variable in the user's scope
        # (can you think of a reason why one might want to do this?)
        var_inquote …
Run Code Online (Sandbox Code Playgroud)

debugging macros hygiene julia

6
推荐指数
0
解决办法
544
查看次数

我如何编写卫生的Ruby mixin?

假设我正在编写一个mixin模块,可以为第三方类添加功能.显然,我希望第三方类及其客户端可以访问一些方法和实例变量.这些构成了mixin模块的公共接口.

但我想要封装某些其他方法和实例变量.我不希望它们被我混入的类访问,特别是我不希望它们意外地覆盖,阴影,冲突或以其他方式干扰mixee类的方法或实例变量 - 这些如果第三方修改我正在混合的类,那么当前可能存在,或者将来可能创建的那些.

我需要采取哪些预防措施,以确保我的mixin以这种方式"卫生"?

ruby mixins hygiene

5
推荐指数
1
解决办法
940
查看次数

方案中语法对象的目的究竟是什么?

我试图在python中编写一个类似于方案的小语言,以便更好地理解方案.

问题是我被困在语法对象上.我无法实现它们,因为我不太了解它们的用途以及它们的工作原理.

为了尝试理解它们,我在DrRacket中使用了语法对象.

从我能够发现的情况来看,评估#'(+ 2 3)与评估没有什么不同'(+ 2 3),除非在+顶级命名空间中存在一个词汇变量,在这种情况下(eval '(+ 2 3))仍会返回5,但(eval #'(+ 2 3))只会抛出错误.

例如:

(define (top-sym)
  '(+ 2 3))
(define (top-stx)
  #'(+ 2 3))
(define (shadow-sym)
  (define + *)
  '(+ 2 3))
(define (shadow-stx)
  (define + *)
  #'(+ 2 3))
Run Code Online (Sandbox Code Playgroud)

(eval (top-sym)),(eval (top-stx))(eval (shadow-sym))所有返回5,同时(eval (shadow-stx))抛出错误.他们都没有回来6.

如果我不知道更好,我会认为语法对象唯一特别的事情(除了他们存储代码位置以获得更好的错误报告的琐碎事实)是他们在某些情况下抛出错误符号对应物将返回可能不需要的值.

如果故事很简单,那么在常规列表和符号上使用语法对象就没有什么好处.

所以我的问题是:我对语法对象缺少什么让它们如此特别?

scheme eval hygiene racket syntax-object

5
推荐指数
1
解决办法
672
查看次数

为什么宏卫生不能防止多个 const 定义之间的冲突?

我认为“卫生”会防止X我的宏中定义的 s之间发生冲突m!,但事实并非如此。我有什么误解吗?

macro_rules! m {
    ($e:expr) => {
        const X: i32 = $e;
    };
}

m!(0);
m!(1);

fn main() {
    m!(2);
    m!(3);
}
Run Code Online (Sandbox Code Playgroud)

操场

错误信息:

macro_rules! m {
    ($e:expr) => {
        const X: i32 = $e;
    };
}

m!(0);
m!(1);

fn main() {
    m!(2);
    m!(3);
}
Run Code Online (Sandbox Code Playgroud)

macros metaprogramming hygiene rust

5
推荐指数
1
解决办法
697
查看次数