lisp - common lisp中如何做动态加载(Load)

标签 lisp common-lisp sbcl quicklisp

我的以下代码片段将给出 SB-INT:SIMPLE-READER-PACKAGE-ERROR; 我知道这是因为在 REPL 读取代码时尚未定义包“quicklisp-quickstart”;但是这个包是在“quicklisp.lisp”中定义的。

如何使下面的代码工作? 或者我如何告诉普通的 lisp 读者这个包将在动态加载的文件中定义?

* (let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"
                                       (user-homedir-pathname))))
  (if (probe-file quicklisp-init)
    (load quicklisp-init)
    (progn
      (load "quicklisp.lisp")
      (quicklisp-quickstart:install))))

debugger invoked on a SB-INT:SIMPLE-READER-PACKAGE-ERROR in thread
#<THREAD "main thread" RUNNING {100299C6A3}>:
  Package QUICKLISP-QUICKSTART does not exist.

    Stream: #<SYNONYM-STREAM :SYMBOL SB-SYS:*STDIN* {100017F893}>

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.

最佳答案

您可以使用 FIND-SYMBOL尝试找到该函数,并使用 FUNCALL 调用它。有点像

(let* ((package (find-package :quicklisp-quickstart))
       (function (unless (null package)
                   (find-symbol (string '#:install)
                                package))))
  (if (null function)
      (error "Can't install...")
      (funcall function)))

关于lisp - common lisp中如何做动态加载(Load),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40903944/

相关文章:

c - select() 不等待任何变化

Lisp Web 框架?

scheme - Lisp 程序(使用 Scheme 48 1.9 解释器)找出级数 1^3 + 2^3 + … 的总和。 + n^3

lisp - 定义 "minimum"函数以返回列表中的最小值,使用另一个返回两个数字中较小者的函数

lisp - lisp 可以用来编写病毒或其他恶意软件吗?

lisp - Lisp 中的反引号扩展

performance - 优化简单的 Common Lisp gibbs 采样器程序

graph - 在 Common Lisp 中表示有向无环图

autocomplete - 如何在初始文件中设置 linedit 支持 CCL?

lisp - 使用 macroexpand-1 扩展 let 形式内的宏(Practical Common Lisp,第 8 章, "Plugging the Leaks")