【问题标题】:Forcing Common Lisp not to evaluate symbol to variable强制 Common Lisp 不将符号计算为变量
【发布时间】:2011-04-14 15:42:55
【问题描述】:

我目前正在研究一个宏/函数,我将使用它作为声明列表的替代方法,即使用 [ 和 ] 而不是通常的 '(a b c) 方式来做到这一点。

虽然我遇到了一些问题,即我总是必须在符号之前写引号(因为它们没有绑定到变量我收到错误消息),但我将如何着手消除对这些引号的需求?

另外,我想引入这种在 Common Lisp 中声明列表的替代方法的主要原因是因为它有时会被括号弄乱,如果我真的想调用我的函数/宏,我需要把它括起来有了括号,我将如何消除对这些的需求?

谢谢!

【问题讨论】:

  • 你能发布一些代码吗?您可能希望查看阅读器宏来完成使用[] 而不是() 的实际任务。看看这里,它有那个确切的例子:psg.com/~dlamkins/sl/chapter03-12.html

标签: macros common-lisp


【解决方案1】:

您可以使用阅读器宏来做到这一点。 (顺便说一下,阅读器宏与“普通”宏完全不同。)

但是,在你在 readtable 中乱七八糟之前,我强烈建议你学习 Lisp。不要打括号!它们是您拥有的唯一语法,所以请使用它们!

为了学习,我推荐 Peter Seibel 的"Practical Common Lisp"

【讨论】:

  • 是的,阅读器宏绝对是要走的路。可能需要调用 READ-DELIMITED-LIST 和几次调用 SET-SYNTAX-FROM-CHAR。可能是一个相当困难的“第一次使用 readtables”项目,但我同意应该首先掌握 CL。
  • Johan,如果您打算使用@Svante 的代码不仅仅是一次性的,我建议您查看这个库:common-lisp.net/project/named-readtables。它允许您将阅读器宏打包在命名表中,提供 defpackage 为符号提供的那种组织。我在这里写了一些代码 (bitbucket.org/blevyq/short-lambda),它使用命名的 readtables 定义了 #\[ 和 #\] 的阅读器宏。它可以为您的宏提供一个很好的起点。
猜你喜欢
  • 1970-01-01
  • 2016-09-27
  • 2019-09-28
  • 2013-07-26
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多