我使用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.
我喜欢基于图像的语言的想法,最近我一直在通过sbcl玩弄Common Lisp.我已经在几个地方读到了如何通过保存和加载虚拟机的映像,您可以改进在该映像上运行的应用程序或一组应用程序.
我得到了如何将代码加载到图像中并使其运行,slime使这种事情非常好,但我的问题是:如何判断图像中定义了哪些函数?假设我想在运行后几天或几个月对某个功能进行更新,我记不起名字了.有没有办法获得代码甚至只是图像中定义的函数的名称?
现在,我将代码写入源代码并通过repl加载,所以我有一个副本,但似乎这是一个明显的功能.
有没有办法以某种方式自定义SBCL REPL,使其与CLISP REPL类似.标准的SBCL REPL在Mac OS X上并不真正可用.我不能使用箭头键或退格键.
我正在试图弄清楚如何使用我开始的一个程序的输出流,RUN-PROGRAM因此它可以用作另一个程序的输入RUN-PROGRAM(即道德,也许是文字等效的管道).我已经使用了一些组合的尝试:INPUT,:OUTPUT和:WAIT关键字参数,但没有我打后一直生产至今.任何提示都会有所帮助; 例如,我将如何ls | grep lisp从shell中做一些事情?
我的一个尝试是
(defun piping-test ()
(let ((grep-process (run-program "/usr/bin/grep" '("lisp")
:input :stream
:output :stream)))
(unwind-protect
(with-open-stream (s (process-input grep-process))
(let ((ls-process (run-program "/bin/ls" '()
:output s)))
(when ls-process
(unwind-protect
(with-open-stream (o (process-output grep-process))
(loop
:for line := (read-line o nil nil)
:while line
:collect line))
(process-close ls-process)))))
(when grep-process (process-close grep-process)))))
Run Code Online (Sandbox Code Playgroud)
在SLIME REPL中运行它会导致一切都挂起,直到我打破C-c C-c,所以它显然不是正确的事情,但我不知道如何改变它所以它是正确的.
编辑:添加:WAIT NIL到两个RUN-PROGRAM调用,或仅添加到调用grep …
我定义我的函数等时,我不能在emacs + slime + sbcl上使用自动缩进功能.
我的.emacs文件配置是这样的:
(setq inferior-lisp-program
"D:/emacs/sbcl_1.0.37/sbcl.exe"
lisp-indent-function 'common-lisp-indent-function
slime-complete-symbol-function 'slime-fuzzy-complete-symbol
slime-startup-animation nil
slime-enable-evaluate-in-emacs t
slime-log-events t
slime-outline-mode-in-events-buffer nil
slime-repl-return-behaviour :send-only-if-after-complete
slime-autodoc-use-multiline-p t
slime-highlight-compiler-notes t)
(add-to-list 'load-path
"d:/emacs/site-lisp/slime") ; your SLIME directory
(require 'slime)
(slime-setup)
Run Code Online (Sandbox Code Playgroud)
有人能帮我吗?
如果您运行SBCL(至少在Windows上,我在家中使用CLISP),您会收到消息"您的死小猫等待".我怀疑这与某种形式的内幕笑话有关(比如Super Cow Powers).我已经尝试了谷歌搜索,我发现没有什么特别有用的(我想它在其他地方提到的'网络是一些,如果不是很多,使用).
如果这看起来更像是SuperUser或ServerFault问题,请告诉我,我会在他们的论坛上提问.
似乎这个引用的起源是由Christopher Rhodes 提交到原始来源的1.54版本(感谢Daniel A. White找到了这个名字).我不确定这是否有用,但它是一个额外的途径来接近这个查询.
初始化Lisp会话(我使用Slime和sbcl)的最佳方法是什么,总是使用最大量的调试信息编译函数?
在编写Common Lisp代码时,我使用SLIME.特别是,我使用CC Ck编译包含函数定义的缓冲区,然后切换到REPL以运行这些函数.将可执行代码放在缓冲区中运行这些函数似乎不能很好地工作.如果代码有错误,它可能会弄得一团糟.
有一种方法可以包含不在缓冲区中编译的代码,但是可以从命令行运行,例如在执行时
sbcl --script foo.lisp
Run Code Online (Sandbox Code Playgroud)
如果是这种情况,每次我想从命令行运行代码时,我都不必继续添加和删除代码.是否存在这样的情况?
这类似于Python条件.
if __name__=='__main__':
Run Code Online (Sandbox Code Playgroud)
如果将Python文件作为模块导入,则为false;如果将其作为脚本运行,则为true.
这篇由Googling随机发现的题为"使用SBCL for Common Lisp shell脚本"的博文有
;; If run from command line, the following if-test will succeed
(if (> (length sb-ext:*posix-argv*) 1)
;; Code that is executed from the command line only goes here
)
Run Code Online (Sandbox Code Playgroud)
包含的代码确实不会被SLIME中的编译器运行,但它也不会被运行sbcl --script.
更新:感谢Vsevolod Dyomkin的有用答案和后续行动.关于该答案的一些注释如下,从对该答案的评论中汇编而成.@Vsevolod,如果你将这些添加到你的答案中,我会删除它们.
首先,我问了一种从命令行运行代码的方法,但不是从解释器运行代码.提供的解决方案做得更多; 它还提供了一种从解释器而不是命令行运行代码的方法.
第一步是为宏字符定义一个阅读器宏功能#!.如链接"在遇到宏字符时,Lisp读者调用其读取器宏函数"中所述.读者功能由调用来定义set-dispatch-macro-character.因此,当#!看到该字符时,set-dispatch-macro-character会导致调用正文中定义的lambda函数.然后,此函数将关键字添加:noscript到*features*变量中.另请参阅讨论哪些读取器宏在SO问题中
有用.阅读宏:您使用它们是什么?.
观察到关键字:noscript是*features*在#!角色存在时精确添加的.此外,#! …
我开始使用SBCL Common Lisp并希望使用Hunchentoot开发一个小型Web应用程序.为了便于部署,我计划使用sb-ext:save-lisp-and-die将所有内容保存在二进制文件中,因为我可以使用大输出大小.
对于可执行文件,您需要提供顶级功能.问题是当顶级函数返回时程序退出.我试图从可执行文件启动Hunchentoot,但程序在两秒后结束.
在停止程序之前,我怎么能等到Hunchentoot关闭(从请求内部)?我可以加入Hunchentoot接受器线程吗?或者我甚至可以将REPL包含在可执行文件中以便能够进行实时调试?
我想知道使用Emacs和SLIME以交互方式调试Common Lisp的有效方法是什么.
我之前做过的事情:作为使用IDE(VS和PyCharm)学习C和Python的人,我习惯于设置断点,添加手表,然后踩踏.但是当我开始使用CL时,我发现调试工作流程根本不同.我没有找到设置断点的好方法,通过线条查看变量如何变化.
我使用的哑方法是在代码中添加"print"并反复运行代码,效率非常低.我知道我们可以"检查"SLIME中的变量,但不知道如何以交互方式进行.
我发现的内容:我最近看到了关于摩尔斯电码转换器开发的视频,它展示了如何在SLIME中以交互方式进行调试的完整过程,这一过程非常丰富,具有启发性.就好像我们可以与编译器"交谈"一样.
我想要的是:我在网上搜索但找到了最小的教程,展示了经验丰富的Lisper如何实际开发和调试他们的程序.我渴望学习这样的经历.
sbcl ×10
common-lisp ×9
lisp ×4
slime ×4
windows ×2
command-line ×1
debugging ×1
emacs ×1
executable ×1
hunchentoot ×1
packages ×1
quicklisp ×1