Common Lisp:如何从Emacs Slime中获取(in-package ...)

 家里蹲是如何炼成的 发布于 2022-12-09 20:53

64位Windows 7
Clozure Common Lisp版本1.9 WindowsX8632
Emacs 24.3.1
史莱姆更改日期2014-06-17

我有一个示例.lisp文件,开头如下:

(ql:quickload 'qt)
(in-package "QT")

程序的其余部分显示一个对话框.当我从命令行运行wx86cl -load helloqt.lisp它时,它似乎工作正常.当我从Emacs Slime(C-x C-k)运行它时,它说没有包"QT".但是,如果我首先单独评估第一行(C-x C-e)然后我可以编译整个事情并且它可以工作,模拟尝试在Windows上的Slime内运行QT线程的正常问题.

我如何制作它以便我可以从emacs编译/运行该文件而无需先手动评估第一行?

另外,为什么不在(in-package ...)Slime会话中更改当前包?如果我想与包内容进行交互,我必须手动更改它.

1 个回答
  • 当您整体编译文件时,它首先作为整体读取.那时,尚未对其进行评估,因此QT尚未定义包.

    您可以使用eval-when较早时间评估某些内容,也可以使用系统定义工具(ASDF现在占主导地位)以正确的顺序加载系统.

    Eval-when:

    (eval-when (:compile-toplevel :load-toplevel :execute)
      (ql:quickload '#:qt))
    
    (in-package #:qt)
    

    请注意,您通常不应该在库包中捣乱,而是定义自己的新包以保存代码:

    (eval-when (:compile-toplevel :load-toplevel :execute)
      (ql:quickload '#:qt))
    
    (defpackage #:qt-example
      (:use #:qt))
    
    (in-package #:qt-example)
    
    ;; your code here
    

    (如果你想知道,defpackage,defun,defclass等专门设计的是扩大到内这种形式的宏eval-when.)

    对于一些小的一次性脚本,这有时是可以的.对于任何值得注意的大小的系统,特别是只要它们有多个源文件,请使用ASDF:

    ;;;; qt-example.asd
    
    (in-package #:cl-user)
    
    (asdf:defsystem #:qt-experiments
      :description "Some experiments with QT."
      :serial t
      :components ((:file "package")
                   (:file "qt-example"))
      :depends-on (#:qt))
    
    ;;;; package.lisp
    
    (defpackage #:qt-example
      (:use #:qt))
    
    ;;;; qt-example.lisp
    
    (in-package #:qt-example)
    

    ASDF附带了大多数开源Common Lisp实现.您可能需要设置ASDF注册表.我喜欢为我的所有本地项目提供一个或两个基本目录,因此我可以将以下内容放入~/.config/common-lisp/source-registry.conf:

    (:source-registry
      (:tree (:home "devel"))
      (:tree (:home "src"))
      :inherit-configuration)
    

    然后,ASDF查找在这些目录下定义的所有系统.在SLIME中,您可以使用,load-system或使用,open-system带有系统名称的REPL来加载它.打开其中的所有文件,可选择加载它.

    C-c C-c从文件中编译单个顶层形式(使用)时,SLIME从那里向后看一个in-package表单以找出它应该采用的包.通常,in-package每个文件只应在其顶部有一个表单.

    一个常用的快捷方式是C-c ~Lisp源文件,它将REPL切换到文件目录和点上的有效包.

    2022-12-11 02:07 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有