【发布时间】:2019-08-16 15:59:35
【问题描述】:
我知道有macro-function,解释了here,它可以让你检查,但是否也可以通过简单地阅读lisp源有时推断出你在看什么“这一定是宏”? (当然假设您以前从未见过函数/宏)。
我相当肯定答案是肯定的,但由于这似乎很重要,我认为值得一问,尤其是因为这方面的任何细微差别都可能很有价值且很有趣。
在 Paul Graham 的 ANSI Common Lisp,p70 中,他描述了如何使用 defstruct。
当我看到(defstruct point x y) 时,如果我对defstruct 是什么一无所知,这也可能是一个函数。
但是当我看到
(defstruct polemic
(subject "foo")
(effect "bar"))
我知道 必须 是一个宏,因为(假设)我也知道 subject 和 effect 是未定义的函数。 (我知道那,因为当他们在“顶层”(?)调用时,undefined function 会出错)(如果这是正确的术语)。
如果上面defstruct 的两个列表参数被引用,就不会那么简单了。因为它们没有被引用,所以它必须是一个宏。
就这么简单吗?
为了让这个问题更清楚,我对书中使用的字段名称稍作更改。
最后,格雷厄姆写道:
“我们可以通过在原始定义的列表中包含字段名称和默认表达式来指定结构字段的默认值”
我注意到这是真的,但它不是(引用的)列表。这篇文章的读者会不会对上面的句子有完全不同的措辞(鉴于书中还没有介绍宏(尽管我对它们有一个基本的了解))。
我的感觉是它不是包含那些默认表达式的“数据列表”。(对不好的术语表示歉意)- 在这里寻求如何正确地概念化。
【问题讨论】:
标签: common-lisp