我想知道,在emacs中常见的lisp交互开发方法是什么(我使用狡猾,但我认为粘液指令应该是相同的)。
假设我有这份文件:
(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)会给出以下错误:
The variable SHAPES:RECTANGLE is unbound.
[Condition of type UNBOUND-VARIABLE]把它撕成
(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)也不起作用,留给我的是:
; 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中,交互开发的共同流程是什么?
发布于 2020-11-13 10:07:06
这里的根本问题是,您混淆了包可以在CL中使用的两种方式。一个包裹通常有两种用途,一种或两种:
它可以导出许多符号,为functionality;
在这些类型的包之间没有正式的区别,但是经常有非正式的区别。上面第二种类型的包通常称为*-USER,典型的示例是CL-USER包。它们经常(但不总是)充当抓取工作的场所。
因此,您要做的是定义一个使用列表是这样一个用户包的包。您可以看到,通过简单地查看这个包的外部符号,这是行不通的。从您的第二个例子:
> (do-external-symbols (s (find-package "CL-USER"))
(print s))
nil换句话说,CL-USER根本不输出任何符号。这意味着您的SHAPES包最初将无法访问任何符号,特别是没有一个CL符号会出现。
这个语言定义了一个规范的'type 1‘包,它是CL:这个包的全部目的是导出定义公共Lisp语言的符号,而只有那些符号。因此,在第二个示例中,SHAPES包的定义应该是
(defpackage #:shapes
(:use #:cl)
(:export #:rectangle))(请注意,SHAPES是一个类型1的包:它以SHAPES:RECTANGLE的形式提供了一些功能,因此可能是为了供其他包使用。)
靠近MOP提供了两个包,它们反映了标准的CL和CL-USER包:
CLOSER-COMMON-LISP类似于CL,只不过各种符号被定义为更接近于MOP的符号所取代,并且可能会有附加的MOP symbols;CLOSER-COMMON-LISP-USER类似于CL-USER:这是一个预期的通用包,用户可以使用它,但它根本不导出任何符号。https://stackoverflow.com/questions/64808793
复制相似问题