首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为交互式通用Lisp开发正确加载文件

为交互式通用Lisp开发正确加载文件
EN

Stack Overflow用户
提问于 2020-11-12 17:27:52
回答 1查看 146关注 0票数 3

我想知道,在emacs中常见的lisp交互开发方法是什么(我使用狡猾,但我认为粘液指令应该是相同的)。

假设我有这份文件:

代码语言:javascript
复制
(eval-when (:compile-toplevel :load-toplevel :execute)
  (ql:quickload :closer-mop))

(in-package :cl-user)

(defpackage :shapes
  (:use :closer-common-lisp-user)
  (:export #:rectangle))

(in-package :shapes)

(defclass rectangle ()
  ((height :initform 0.0 :initarg :height)
   (width :initform 0.0 :initarg :width)))

这很简单。用表达式计算它的表达式似乎没有问题,而加载整个文件(C)会给出以下错误:

代码语言:javascript
复制
The variable SHAPES:RECTANGLE is unbound.
   [Condition of type UNBOUND-VARIABLE]

把它撕成

代码语言:javascript
复制
(in-package :cl-user)

(defpackage #:shapes
  (:use #:cl-user)
  (:export #:rectangle))

(in-package #:shapes)

(defclass rectangle ()
  ((height :initform 0.0 :initarg :height)
   (width :initform 0.0 :initarg :width)))

不会有任何改变。

编译和加载(C C-k)也不起作用,留给我的是:

代码语言:javascript
复制
; in: DEFCLASS RECTANGLE
;     (SHAPES::DEFCLASS SHAPES:RECTANGLE NIL
;      ((SHAPES::HEIGHT :INITFORM 0.0 :INITARG :HEIGHT)
;       (SHAPES::WIDTH :INITFORM 0.0 :INITARG :WIDTH)))
; 
; caught COMMON-LISP:STYLE-WARNING:
;   undefined function: SHAPES::DEFCLASS

我看到defclass不能正确地从cl-user:defclass中解析出来,但却看不到修复它的方法。

我想知道我错过了什么?在emacs中,交互开发的共同流程是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-13 10:07:06

这里的根本问题是,您混淆了包可以在CL中使用的两种方式。一个包裹通常有两种用途,一种或两种:

它可以导出许多符号,为functionality;

  • it提供某种接口,它可以是一个使用其他包或从其中导入符号的包,但它不导出任何符号(除非它也是1型包)。

在这些类型的包之间没有正式的区别,但是经常有非正式的区别。上面第二种类型的包通常称为*-USER,典型的示例是CL-USER包。它们经常(但不总是)充当抓取工作的场所。

因此,您要做的是定义一个使用列表是这样一个用户包的包。您可以看到,通过简单地查看这个包的外部符号,这是行不通的。从您的第二个例子:

代码语言:javascript
复制
> (do-external-symbols (s (find-package "CL-USER"))
    (print s))
nil

换句话说,CL-USER根本不输出任何符号。这意味着您的SHAPES包最初将无法访问任何符号,特别是没有一个CL符号会出现。

这个语言定义了一个规范的'type 1‘包,它是CL:这个包的全部目的是导出定义公共Lisp语言的符号,而只有那些符号。因此,在第二个示例中,SHAPES包的定义应该是

代码语言:javascript
复制
(defpackage #:shapes
  (:use #:cl)
  (:export #:rectangle))

(请注意,SHAPES是一个类型1的包:它以SHAPES:RECTANGLE的形式提供了一些功能,因此可能是为了供其他包使用。)

靠近MOP提供了两个包,它们反映了标准的CLCL-USER包:

  • CLOSER-COMMON-LISP类似于CL,只不过各种符号被定义为更接近于MOP的符号所取代,并且可能会有附加的MOP symbols;
  • CLOSER-COMMON-LISP-USER类似于CL-USER:这是一个预期的通用包,用户可以使用它,但它根本不导出任何符号。
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64808793

复制
相关文章

相似问题

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