首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >普通的Lisp语言2过时了吗?

普通的Lisp语言2过时了吗?
EN

Stack Overflow用户
提问于 2019-11-23 15:45:12
回答 2查看 147关注 0票数 3

在CLTL2中,有一个结构示例ice-cream-factory作为下面是,据称它将创建两个构造函数。以下是结构定义:

代码语言:javascript
复制
(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,而默认的口味列表是美国最喜欢的三人行和黑马(不是死的)。

然而,评估标准构造函数却会遇到一个未定义的函数错误:

代码语言:javascript
复制
(make-ice-cream-factory)

通用LISP用户::MAKE-冰淇淋工厂的功能还没有定义.

这是因为书中的部分不符合defstruct的最新标准吗?指定:constructor选项,我只有一个构造函数fabricate-factory

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-23 16:36:02

只有一个构造函数。如果它提到两个,那就是一个错误。

有关标准通用Lisp的详细信息,请参阅ANSI CL标准和派生文档,如HyperSpec中的HyperSpec条目:

仅当未指定显式:构造函数选项或指定:构造函数选项时,才创建默认命名关键字构造函数。

因为

代码语言:javascript
复制
(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的构造函数,将不会创建默认名称构造函数。

票数 4
EN

Stack Overflow用户

发布于 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表单将是

代码语言:javascript
复制
(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)))

而使文本正确的则是

代码语言:javascript
复制
(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兼容的实现中指定的那样工作。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59009326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档