我目前在Common Lisp中有一个小程序,我希望它作为shell脚本运行.我正在使用SBCL并且完全没问题,所以我宁愿留在这个平台上.:)
我知道这个--script选项,除了(ql:quickload)形式,它完美无缺.
我的程序使用CL-FAD,它加载通过ql:quickload(我想我应该提到它是来自quicklisp的包加载函数).当脚本运行到评估时
(ql:quickload :cl-fad)
Run Code Online (Sandbox Code Playgroud)
形式,它打破了下一个错误:
package "QL" not found
Run Code Online (Sandbox Code Playgroud)
程序打包在单个源文件中,该文件具有以下标题:
(defpackage :my-package
(:use :common-lisp)
(:export :my-main-method))
Run Code Online (Sandbox Code Playgroud)
它是简单的自动化可执行文件,因此我决定(可能是错误的)不要编写任何ASDF系统.它导出单个函数,应该在没有任何参数的情况下运行.
对于这个程序,我目前正在尝试编写启动器脚本,这就是我正在盯着的:
#!/usr/bin/sbcl --script
(load "my-program.lisp")
(in-package :my-package)
(my-main-method)
Run Code Online (Sandbox Code Playgroud)
这三行(不包括shebang)是我想要自动化的.正如我在文档中看到的那样,使用这个shebang的脚本可以被称为简单./script.lisp,并且它确实这样做...具有之前描述的错误.
我需要在启动器中添加什么:cl-fad才能正确加载?文档说明使用--script选项SBCL不加载任何init文件,所以我真的需要复制行
#-quicklisp
(let ((quicklisp-init (merge-pathnames "systems/quicklisp/setup.lisp"
(user-homedir-pathname))))
(when (probe-file quicklisp-init)
(load quicklisp-init)))
Run Code Online (Sandbox Code Playgroud)
(ql:add-to-init-file添加到.sbclrc),到我的启动器脚本?也许我的程序设置有一些深层的架构缺陷?
是的,当我输入我尝试在sbcl本身的REPL中自动化的行时,程序按预期运行.
我使用quicklisp安装了CL-PNG软件包.
(ql:quicklisp 'png)
Run Code Online (Sandbox Code Playgroud)
现在我想定义自己的包,这取决于CL-PNG包.像这样:
(defpackage :FOO
(:use :CL :PNG)
(:export :BAR))
Run Code Online (Sandbox Code Playgroud)
编译时我收到此错误:
The name "PNG" does not designate any package.
[Condition of type SB-KERNEL:SIMPLE-PACKAGE-ERROR]
Run Code Online (Sandbox Code Playgroud)
(require :PNG)在编译我的包之前,我似乎必须调用REPL.
如何在不手动调用requireREPL的情况下为编译器提供CL-PNG包,我该怎么办?
更新:我正在使用SBCL.
我发现easy_install对于使用Python进行编程非常有用,就像使用Ruby的rubygem一样.
Lisp有类似的功能吗?我知道有很多Lisp实现(clisp,sbcl,clozure cl ...),但我只是想知道Lispers在需要查找和使用Lisp库函数时会做什么.
有没有办法让quicklisp加载库而不发送:
To load "drakma":
Load 1 ASDF system:
drakma
; Loading "drakma"
Run Code Online (Sandbox Code Playgroud)
标准出来?我已经尝试添加:verbose nil和:explain nil参数ql:quickload(这是我现在加载库的方式),但似乎这些是默认值 - 打开它们只会增加输出量.
谢谢你的帮助!
假设我在net.aserve和之上构建了一个应用程序bordeaux-threads.我的包声明可能如下所示:
(defpackage :my-package
(:use :cl :net.aserve :bordeaux-threads)
(:export …))
Run Code Online (Sandbox Code Playgroud)
我使用Quicklisp,所以(ql:quickload "aserve") (ql:quickload "bordeaux-threads")在编译我的包之前我在SLIME中运行,一切都很好.
当然,明天我再次启动SLIME,我必须记得QUICKLOAD在编译之前发出s,否则我就麻烦了.
我可以把类似的东西
(eval-when (:compile-toplevel)
(ql:quickload "aserve")
(ql:quickload "bordeaux-threads"))
Run Code Online (Sandbox Code Playgroud)
在我的软件包的顶部 - 这是我为开发所做的 - 但我觉得强制一个包管理器对用户来说不是一个好主意.
还有更好的选择吗?
我一直在尝试在我的可执行脚本中使用Quicklisp包.一个(平凡的)工作示例是:
#!/usr/bin/sbcl --script
(eval-when (:compile-toplevel :load-toplevel :execute)
(ql:quickload "lisp-unit")) ;as explained by another question
(defpackage :test
(:use :cl :lisp-unit))
(format t "This is a test.")
Run Code Online (Sandbox Code Playgroud)
在chmod使用此代码(调用test.lisp)的文件后,我尝试执行它.但是,我收到以下错误消息:
Unhandled SB-C::INPUT-ERROR-IN-LOAD in thread #<SB-THREAD:THREAD
"main thread" RUNNING
{1002C16923}>:
READ error during LOAD:
Package QL does not exist.
Line: 4, Column: 15, File-Position: 95
Stream: #<SB-SYS:FD-STREAM
for "file /home/koz/Documents/Programming/CL/trees/test.lisp"
{1002C19A93}>
Backtrace for: #<SB-THREAD:THREAD "main thread" RUNNING {1002C16923}>
0: ((LAMBDA NIL :IN SB-DEBUG::FUNCALL-WITH-DEBUG-IO-SYNTAX))
1: (SB-IMPL::CALL-WITH-SANE-IO-SYNTAX #<CLOSURE (LAMBDA NIL :IN SB-DEBUG::FUNCALL-WITH-DEBUG-IO-SYNTAX) {1002C2498B}>) …Run Code Online (Sandbox Code Playgroud) 我想通过asdf向已知项目添加一个本地项目,但由于*central-registry*aslis由quicklisp 安装和配置,并且指向"#P/home/user/quicklisp/quicklisp /",其中包含.lisp文件.我不知道该怎么做,因为手册解释了目录中的符号链接会做到这一点,但我不想在quicklisp里乱搞.(它确实可以作为修补程序使用!)
因此:如何将本地项目添加到由quicklisp安装和配置的asdf(NOT QUICKLISP)?
我想使用buildapp来生成curl-lisp可执行文件作为示例:
buildapp --output lisp-curl --asdf-path ~/src/clbuild/systems/ \
--load-system drakma \
--eval '(defun main (args) (write-string (drakma:http-request (second args))))' \
--entry main
Run Code Online (Sandbox Code Playgroud)
这绝对不会起作用,因为我没有路径"〜/ src/clbuild/systems /",因为我使用quicklisp我的系统应该在"〜/ quicklisp/dists/quicklisp/software",但是当我执行时:
buildapp --output lisp-curl \
--asdf-path ~/quicklisp/dists/quicklisp/software \
--load-system drakma \
--eval '(defun main (args) (write-string (drakma:http-request (second args))))' \
--entry main
; file: /home/simkoc/dumper-YKYna1b3.lisp
; in: DEFUN DUMP-FILE-DEBUGGER
; (QUIT :UNIX-STATUS 111)
;
; caught STYLE-WARNING:
; SB-EXT:QUIT has been deprecated as of SBCL 1.0.56.55. Use SB-EXT:EXIT or
; SB-THREAD:ABORT-THREAD instead.
;
; …Run Code Online (Sandbox Code Playgroud) 如果我想创建一个程序的Lisp图像,我该如何正确地完成它?有先决条件吗?它不和QUICKLISP很好地搭配吗?
现在,如果我启动SBCL(只预装了QUICKLISP)并保存图像:
(save-lisp-and-die "core")
Run Code Online (Sandbox Code Playgroud)
然后尝试使用此图像再次启动SBCL
sbcl --core core
Run Code Online (Sandbox Code Playgroud)
然后尝试做:
(ql:quickload :cl-yaclyaml)
Run Code Online (Sandbox Code Playgroud)
我得到以下内容:
To load "cl-yaclyaml":
Load 1 ASDF system:
cl-yaclyaml
; Loading "cl-yaclyaml"
.......
debugger invoked on a SB-INT:EXTENSION-FAILURE in thread
#<THREAD "main thread" RUNNING {100322C613}>:
Don't know how to REQUIRE sb-sprof.
See also:
The SBCL Manual, Variable *MODULE-PROVIDER-FUNCTIONS*
The SBCL Manual, Function REQUIRE
Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
0: [RETRY ] Retry completing load for …Run Code Online (Sandbox Code Playgroud) 我在Mac OS X 10.6.4上使用clisp 2.48(2009-07-28).我用'sudo port install clisp'下载了clisp.
安装快速lisp后,我安装了一些软件包,其中大多数都没问题.
但是,当我尝试安装"sqlite"时,我收到以下错误.
[1]> (ql:quickload "sqlite")
To load "sqlite":
Load 1 ASDF system:
sqlite
; Loading "sqlite"
[package cffi-sys]
*** - CFFI requires CLISP compiled with dynamic FFI support.
它说我的安装了mac port的clisp没有FFI支持.
有没有办法在Mac OS X上使用动态FFI支持编译CLISP?
common-lisp ×10
quicklisp ×10
sbcl ×5
lisp ×3
allegro-cl ×1
asdf ×1
automation ×1
clisp ×1
dump ×1
macports ×1
packages ×1
shell ×1