我在Mac上学习Common Lisp(Clozure CL),并在这里慷慨的贡献者的帮助下安装了quicklisp。 ' ltk'库在运行时工作(ltk :: ltk-eyes)或(ltk:ltktest)。
正在运行(ql:quickload" ltk"),因为它返回以下内容:
加载1个ASDF系统:
LTK
;正在加载" ltk"
我在运行以下代码时遇到问题,这些代码来自< lt;<文档。这是脚本:
CasAuthenticationOptions casOptions = new CasAuthenticationOptions
{
CasServerUrlBase = // (here's the url of the CAS server service
};
app.UseCasAuthentication(casOptions);
然而,当我跑步时(hello-1)我得到了这个:
错误:找不到名为BUTTON的类。 执行时:FIND-CLASS,在进程Listener(4)中执行。 键入cmd- /继续,cmd-。要中止,cmd- \以获取可用重新启动的列表。 如果继续:再次尝试找到该课程 类型:?其他选择。
我的猜测是' ltk'在函数定义中没有正确访问库?我尝试使用ltk:with-ltk解决问题,因为它似乎是一个ltk函数。
(ql:quickload "ltk") ;my addition to the script
(defun hello-1()
(with-ltk ()
(let ((b (make-instance 'button
:master nil
:text "Press Me"
:command (lambda ()
(format t "Hello World!~&")))))
(pack b))))
但是这产生了以下错误。我似乎已经越来越接近修复它,因为2D画布也出现了GUI,提醒我错误。
感谢您的帮助。
答案 0 :(得分:2)
Common Lisp操纵属于包的符号。 Lisp阅读器负责将符号的非限定引用解析为实际的限定符号。这取决于在读取代码时绑定到*PACKAGE*
的当前包。正如评论中所建议的那样,您应该阅读P. Seibel的§21. Programming in the Large: Packages and Symbols中的Practical Common Lisp。
您可以按如下方式定义自己的包:
(defpackage :test-ltk
(:use :cl :ltk))
:use
子句是USE-PACKAGE
的声明性等价物。以上使test-ltk
包继承了Common Lisp和LTK包中的所有外部符号。通常,您不能一起使用太多的包,因为您更可能有冲突:不能以不合格的方式访问属于不同包但具有相同名称的两个符号。这有点像在C ++中,不鼓励你做using namespace std
。
为了有选择地导入某些符号而不是其他符号,请改用:import-from
。例如,您可以按如下方式定义前面的包:
(defpackage :test-ltk
(:use :cl)
(:import-from :ltk #:with-ltk #:button #:pack))
在这里,您只列出您实际访问的3个符号。 #:symbol
符号表示未加密的符号,即不属于任何包并且仅用于其名称的符号。您可以使用字符串(大写)。
然后,使用IN-PACKAGE
更改当前包。根据当前包的定义解决对符号的无限制访问:
(in-package :test-ltk)
(defun hello-1 ()
(with-ltk ()
(pack
(make-instance 'button
:master nil
:text "Press Me"
:command (lambda () (format t "Hello World!~&"))))))
答案 1 :(得分:1)
解决方案(感谢@jkiiski引用:运算符):在控制台中仔细阅读错误消息后,我就能解决问题。编译器无法访问< ltk'函数(使用-lkk ...)和(pack ...)以及按钮类。
更正后的代码如下(使用Quicklisp使用ltk库):
(load #P"/Users/myDirectory/quicklisp/setup.lisp")
(ql:quickload "ltk")
(defun hello-1()
(ltk:with-ltk ()
(let ((b (make-instance 'ltk:button
:master nil
:text "Press Me"
:command (lambda ()
(format t "Hello World!~&")))))
(ltk:pack b))))
我的下一步是看看我是否能找到类似的方法来使用命名空间'在C ++中,我不需要继续使用let:,并简化代码。