![]() |
1
6
我只使用方案宏(
它让你写作
Dan Friedman使用宏实现了一个令人费解的OO: http://www.cs.indiana.edu/~dfried/ooo.pdf
但老实说,所有的
有用的
我定义的宏是从中窃取的
Paul Graham's On Lisp
而且通常更容易用
但我在方案中使用的宏不多。惯用方案非常实用,以至于很多时候你只想编写一个函数程序,然后隐藏一些lambda。我开始了函数训练,现在相信如果你有一个懒惰的语言或者一个好的lambda语法,即使这是不必要的,那么宏在纯粹的函数风格中也不是那么有用。
所以我建议
Practical Common Lisp
和
On Lisp
. 如果你想使用PLT方案,我想他们大部分
|
![]() |
2
8
需要宏来实现新的控制结构和新的绑定构造。 因此,在 http://planet.plt-scheme.org . 在Planet上,您可以浏览文档和代码。 新控制结构示例: http://planet.plt-scheme.org/package-source/soegaard/control.plt/2/0/planet-docs/manual/index.html 要查找新绑定表单的示例,请查找以“with-”开头的宏。 一个有用的例子在math.plt中也可以找到。
|
![]() |
3
7
我将开始回答最后一个问题。何时使用宏而不是函数。宏做的是函数做不到的事情,函数做的是宏做不到的事情,所以很难将它们混合在一起,但让我们更深入一点。 当需要计算参数时使用函数,当需要取消计算参数时使用宏。那不是很有用,是吗?当你想用不同的方式写东西时,当你看到一个模式并且你想抽象的时候,你可以使用宏。例如:我定义了三个函数,分别是foo create、foo process和foo destroy,用于不同的foo值和类似的主体,其中唯一的更改是foo。有一个模式,但是对于一个函数来说级别太高了,所以您创建了一个宏。 在我不起眼的经验中,Scheme中的宏和其他Lisp中的宏一样使用,比如普通的Lisp或 Clojure . 我想这是证据,也许卫生宏不是一个好主意,这里我会与保罗格雷厄姆不同意为什么。这并不是因为有时候你想变得肮脏(不卫生),而是因为卫生宏最终变得复杂或复杂。 |
![]() |
4
3
实用的公共Lisp,由PeterSeibel编写,对宏有很好的介绍。保罗·格雷厄姆写的Lisp可能是更复杂例子的一个很好来源。此外,还可以查看公共lisp中的内置宏。 |
![]() |
5
3
这个 Automata via Macros 本文提出了一种利用方案中的宏实现有限状态机的函数编程明珠。 书 The Reasoned Schemer 以一个完全基于宏的Minikanren实现结束,Minikanren是书中使用的逻辑编程语言。 This paper 比书中更正式、更简洁地介绍了Minikanren及其实现。 |
![]() |
6
1
一个更高级的宏的例子不是lambda形式的伪装是常见的lisp宏 带槽 ,使对象槽访问看起来像普通变量访问:
请注意,这与将槽值绑定到局部变量并访问这些变量不同,因为 带槽 允许您通过setq更改插槽并立即看到外部更改。 |
![]() |
7
1
我有一个
|
![]() |
8
1
Scheme宏允许您添加原始语言作者不包括自己的特性;这就是宏背后的整个哲学。 这里有一个很小的例子:PLT方案提供了一种语言来编写称为幻灯片的演示文稿。我使用宏将幻灯片编号与幻灯片关联起来,以便更轻松地管理它们。 |
![]() |
9
1
我编写了一个宏,它提供了中缀语法。没有太花哨的;没有优先权。虽然我_m通常可以使用前缀语法,但我更喜欢<和>的中缀。 |
![]() |
10
0
我在程序不充分时使用它们。 |
![]() |
Joe · 如何修复“无法更改常量”错误 7 年前 |
![]() |
xnv23 · 使用方案中的变量创建环境 7 年前 |
![]() |
Jaro · racket:处理jpeg文件 7 年前 |
![]() |
Atonic · 提供语法规则Racket 7 年前 |
![]() |
Zelphir Kaltstahl · 程序开始时的当前延续 7 年前 |
|
user8866063 · 在递归过程中打印 7 年前 |
![]() |
Nime · 生成递归和结构递归之间有什么区别? 7 年前 |