在CLTL2中,有一个结构示例ice-cream-factory作为下面是,据称它将创建两个构造函数。以下是结构定义:
(defstruct (ice-cream-factory
(:constructor fabricate-factory
(&key (capacity 5)
location
(local-flavors
(case location
((hawaii) '(pineapple macadamia guava))
((massachusetts) '(lobster baked-bean))
((california) '(ginger lotus avocado
bean-sprout garlic))
((texas) '(jalapeno barbecue))))
(flavors (subseq (append local-flavors
'(vanilla
chocolate
strawberry
pistachio
maple-walnut
peppermint))
0 capacity)))))
(capacity 3)
(flavors '(vanilla chocolate strawberry mango)))CLTL2声明:
结构式冰淇淋工厂有两个构造器.标准的构造函数--make-冰淇淋-工厂,采用两个关键字参数,名为:容量和:味道。对于这个构造函数,默认的容量槽是3,而默认的口味列表是美国最喜欢的三人行和黑马(不是死的)。
然而,评估标准构造函数却会遇到一个未定义的函数错误:
(make-ice-cream-factory)通用LISP用户::MAKE-冰淇淋工厂的功能还没有定义.
这是因为书中的部分不符合defstruct的最新标准吗?指定:constructor选项,我只有一个构造函数fabricate-factory。
发布于 2019-11-23 16:36:02
只有一个构造函数。如果它提到两个,那就是一个错误。
有关标准通用Lisp的详细信息,请参阅ANSI CL标准和派生文档,如HyperSpec中的HyperSpec条目:
仅当未指定显式:构造函数选项或指定:构造函数选项时,才创建默认命名关键字构造函数。
因为
(defstruct (ice-cream-factory
(:constructor fabricate-factory
(&key (capacity 5)
location
(local-flavors
(case location
((hawaii) '(pineapple macadamia guava))
((massachusetts) '(lobster baked-bean))
((california) '(ginger lotus avocado
bean-sprout garlic))
((texas) '(jalapeno barbecue))))
(flavors (subseq (append local-flavors
'(vanilla
chocolate
strawberry
pistachio
maple-walnut
peppermint))
0 capacity)))))
(capacity 3)
(flavors '(vanilla chocolate strawberry mango)))有一个名为fabricate-factory的构造函数,将不会创建默认名称构造函数。
发布于 2019-11-25 10:11:13
CLtL2不仅是无可救药的过时,它从来没有真正指定CL。CLtL指定了语言的一个版本,而CLtL2只是标准化过程中所发生的事情的一些快照。这一点在当时得到了广泛的理解,但似乎从那以后就被部分遗忘了。
话虽如此,你所指的那一节并不是这本书过时的一个例子:它只是书中的一个错误。第19.6节,CLtL2的“逐位构造函数”以本文开头:
如果将
:constructor选项设为(:constructor name <arglist>),那么defstruct将不再使用关键字驱动的构造函数,而是定义一个“位置”构造函数,使用由参数的位置而不是关键字决定的参数。
(我在上面用<angles>代替了斜体。)
但是你所看到的例子却是错误的。不仅如此,它在内部是不一致的:文本讨论的是一个函数make-ice-cream-factory,而且示例代码包含make-factory。
使示例代码正确的defstruct表单将是
(defstruct (ice-cream-factory
(:constructor fabricate-factory
(&key (capacity 5)
location
(local-flavors
(case location
((hawaii) '(pineapple macadamia guava))
((massachusetts) '(lobster baked-bean))
((california) '(ginger lotus avocado
bean-sprout garlic))
((texas) '(jalapeno barbecue))))
(flavors (subseq (append local-flavors
'(vanilla
chocolate
strawberry
pistachio
maple-walnut
peppermint))
0 capacity))))
(:constructor make-factory))
(capacity 3)
(flavors '(vanilla chocolate strawberry mango)))而使文本正确的则是
(defstruct (ice-cream-factory
(:constructor fabricate-factory
(&key (capacity 5)
location
(local-flavors
(case location
((hawaii) '(pineapple macadamia guava))
((massachusetts) '(lobster baked-bean))
((california) '(ginger lotus avocado
bean-sprout garlic))
((texas) '(jalapeno barbecue))))
(flavors (subseq (append local-flavors
'(vanilla
chocolate
strawberry
pistachio
maple-walnut
peppermint))
0 capacity))))
(:constructor))
(capacity 3)
(flavors '(vanilla chocolate strawberry mango)))所有这些都按照CltL2中在与ANSI兼容的实现中指定的那样工作。
https://stackoverflow.com/questions/59009326
复制相似问题