Common Lisp ltk'按钮'找不到课程

时间:2018-03-08 17:11:01

标签: user-interface frameworks lisp common-lisp clozure-cl

我在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,提醒我错误。

enter image description here

感谢您的帮助。

2 个答案:

答案 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:,并简化代码。