Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Common lisp 如何避免为公共lisp项目加载多个asdf文件?_Common Lisp_Slime_Quicklisp - Fatal编程技术网

Common lisp 如何避免为公共lisp项目加载多个asdf文件?

Common lisp 如何避免为公共lisp项目加载多个asdf文件?,common-lisp,slime,quicklisp,Common Lisp,Slime,Quicklisp,在阅读Peter Seibel的《实用通用Lisp》一书时,我在理解如何结合Emacs的SLIME和quicklisp处理通用Lisp包系统时遇到了一些困难。他提供的项目具有以下结构: 包com.gigamonkeys.spam中的spam.lisp,它依赖于另外两个包cl-ppcre和com.gigamonkeys.pathnames com.gigamonkeys.pathnames包中的pathnames.lisp spam.asd,它描述了com.gigamonkeys.spam包的依

在阅读Peter Seibel的《实用通用Lisp》一书时,我在理解如何结合Emacs的SLIME和quicklisp处理通用Lisp包系统时遇到了一些困难。他提供的项目具有以下结构:

  • com.gigamonkeys.spam
    中的
    spam.lisp
    ,它依赖于另外两个包
    cl-ppcre
    com.gigamonkeys.pathnames
  • com.gigamonkeys.pathnames包中的
    pathnames.lisp
  • spam.asd
    ,它描述了
    com.gigamonkeys.spam
    包的依赖关系
  • pathnames.asd
    ,它描述了
    com.gigamonkeys.pathnames
    包的依赖关系
我目前找到的构建最终目标spam.lisp的唯一方法是:

  • 使用SLIME(
    C-x C-k
    )编译并加载
    pathnames.asd
    文件
  • 通过键入
    (asdf:operate'asdf:Load op'spam)加载
    com.gigamonkeys.pathname
  • 通过在REPL处键入
    (ql:quickload“cl-ppcre”)
    来加载
    cl-ppcre
  • 使用SLIME编译并加载
    spam.asd
    文件
  • 通过键入
    (asdf:operate'asdf:Load op'spam)加载
    com.gigamonkeys.spam
  • 使用单个文件(
    spam.lisp
    )中定义的函数所需的工作量似乎太大了,我一定是做错了什么。是否有一些方法可以用更少的命令来加载spam.lisp及其依赖项?

    长话短说,包裹是一袋袋的符号和系统 文件和其他系统之间的关系

    因此,这里使用您的结构是一个简单的系统定义:

    (asdf:defsystem #:spam-filter
      :serial t
      :description "Simple Spam Filter"
      :author "PCL"
      :depends-on (#:cl-ppcre
                   #:com.gigamonkeys.pathnames)
    
      :components ((:file "package")
                   (:file "spam")))
    
    现在,我假设系统
    com.gigamonkeys.pathnames
    处于
    ~/src/lisp/com/gigamonkeys/pathnames/
    和中的垃圾邮件过滤器
    ~/src/lisp/spam filter/

  • M-x
    slime
    RET
  • ,cd~/src/lisp/com/gigamonkeys/pathnamesRET
  • (push(truename“)asdf:*中央注册表*)
  • ,cd~/src/lisp/spam filterRET
  • (push(truename“)asdf:*中央注册表*)
  • (ql:quickload:spam-filter)
  • 由于Quicklisp依赖ASDF加载系统,因此必须添加系统目录 在ASDF搜索路径中

    您还可以通过添加 它们位于
    ~/quicklisp/localprojects/
    中。您可以存储代码 没有或使用符号链接

    附言:你可以找到 一条让我写作的捷径,addRET 而不是
    (push(truename“)asdf:*中央注册表*)

    在另一个快捷方式的下方快速加载系统。
    (,ql
    一些系统名称
    RET)

    一点术语:

    • a是常见的Lisp标准功能。包是符号的名称空间。没别的了。它不是一个文件,不是一个模块,不是一个库,也不与任何这样的东西相关联。它甚至不是函数、变量或类的名称空间。只是为了象征。有一种惯例是将设置包的定义放入自己的文件中。但这只是一个惯例

    • 系统用于定义、加载和编译组成软件库或应用程序的所有文件。系统的概念很古老(超过三十年)。(另一个系统定义工具)是该思想的流行和免费实现。肯特·皮特曼在1984年写了一篇关于

    这样一个系统设施的一部分是一个注册表,从这里可以找到所有系统。系统定义描述了它所包含的文件以及它所依赖的所有系统。通常,这样的注册表是文件系统中的目录和/或正在运行的Lisp中的注册表(变量…)

    加载特定系统时,系统工具会查看注册表并找到它,加载定义,递归加载所有需要的系统,然后加载所有文件


    请参阅ASDF手册:

    对于延迟将其标记为正确,我深表歉意,但这正是我想要的。谢谢你的清楚解释!