我最近开始使用SBCL学习Common Lisp.如何将我的Lisp程序编译成Windows二进制文件?
蟒蛇
当我学习Python时,我使用一个很好的gui安装程序在Windows上安装它,所有.py文件都会自动在命令行或资源管理器中运行python.
我发现这非常直观和容易,因为我可以立即制作纯文本文件并运行它们.
口齿不清
我开始学习lisp并且(从评论中)决定SBCL不是一个糟糕的lisp实现.
有没有办法设置SBCL像Python一样轻松运行.lisp文件?
是否有其他具有此功能的lisp实现?
新手Common Lisp问题在这里.
有没有办法重置环境状态?我的意思是,是否有一些命令使REPL恢复到启动后的状态,即uninterning所有变量,函数等.或者如果不是在Common Lisp标准中,是否有一些扩展在SBCL(我使用的实现)这样做?
(编辑:我知道在SLIME中,Mx slime-restart-inferior-lisp可以做到这一点,但我想知道是否有办法没有重新启动过程)
(David James都写了问题和答案.我将编辑它以符合Stackoverflow标准.)
使用SBCL,您可以将Lisp代码编译为机器代码.
像Java,.net,C++甚至C一样,您将需要运行时.因此有两种方法可以编译Common Lisp代码.
首先是制作巨大的二进制文件,这在SBCL文档中有解释.目标机器上不需要SBCL.
另一种方式是更灵活的方法,即以fasl(FASt Load)格式创建机器代码.目标计算机上需要SBCL运行时.
第二种方式如何在类Unix操作系统下工作?
我正在调用一个有趣的API来返回一个字节数组,但我想要一个文本流.有没有一种从字节数组中获取文本流的简单方法?现在我只是聚在一起:
(defun bytearray-to-string (bytes)
(let ((str (make-string (length bytes))))
(loop for byte across bytes
for i from 0
do (setf (aref str i) (code-char byte)))
str))
Run Code Online (Sandbox Code Playgroud)
然后用in-input-from-string包装结果,但这不是最好的方法.(另外,它非常低效.)
在这种情况下,我知道它总是ASCII,因此将其解释为ASCII或UTF-8就可以了.我正在使用支持Unicode的SBCL,但我更喜欢便携式(甚至是纯ASCII)解决方案,而不是特定于SBCL-Unicode的解决方案.
我对defun宏如何工作感到困惑,因为
(defun x () "hello")
Run Code Online (Sandbox Code Playgroud)
将创建函数x,但符号x仍将是未绑定的.
如果我将一些lambda绑定到x,那么x将有一个值,但它不会被解释器视为函数,如下所示:
(x)
Run Code Online (Sandbox Code Playgroud)
我认为这与defun应该在全球环境中定义功能这一事实有关,但我不确定它究竟意味着什么.为什么我不能在当前环境中影响它呢?
有没有办法强制解释器将符号视为函数,如果某个lambda绑定到它?例如:
(setq y (lambda () "I want to be a named function"))
(y)
Run Code Online (Sandbox Code Playgroud)
PS:我正在使用SBCL.
我想做一些模拟,ACT-R我需要一个Common Lisp实现.我有三种Common Lisp可用的实现:(1) CLISP [1],(2) ECL [1]和(3) SBCL [1].正如您可能从链接中收集的那样,我已经在维基百科上阅读了所有这三个链接.但我想要一些有经验的用户的意见.更具体地说,我想知道:
(i) 这三种实现之间的主要区别是什么(例如:它们最擅长的是什么?它们中的任何一种仅用于特定目的,因此可能不适用于特定任务吗?)?
(ii)基于我将使用的事实ACT-R还是基于一般原因,是否有明显的选择?
由于这可以解释为一个主观问题我检查了我在这里可以问什么主题以及我应该避免询问哪些类型的问题?如果我读得正确,它不应该被视为禁果.
正如许多其他有兴趣学习Lisp的人一样,我觉得可用的资源不是最适合初学者的,最终会阻止很多新人学习它.你觉得它可以创建某种社区,有一个网站,论坛或者什么,为Lisp用户提供好的(如质量)资源/教程,可能翻译成几个成语?那种没有编写教程所需技能的初学者可以帮助翻译它们.这是一个坏主意还是可以完成的事情?给我一些反馈或激怒我:D
我目前在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中自动化的行时,程序按预期运行.