使用LispWorks步进器进行计算非常直观,但我无法在SBCL中找到它.有人可以给我一个如何在REPL中使用SBCL步进器的一些简单函数的分步示例吗?谢谢.
我目前在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中自动化的行时,程序按预期运行.
好的,最后的问题,我将在Common Lisp完成我的猜数游戏!:D无论何时游戏开始(或者在第一场比赛后开始新游戏),都会调用以下函数.
;;; Play the game
(defun play ()
;; If it's their first time playing this session,
;; make sure to greet the user.
(unless (> *number-of-guesses* 0)
(welcome-user))
;; Reset their remaining guesses
(setq *number-of-guesses* 0)
;; Set the target value
(setq *target*
;; Random can return float values,
;; so we must round the result to get
;; an integer value.
(round
;; Add one to the result, because
;; (random 100) yields a number between
;; …Run Code Online (Sandbox Code Playgroud) 就像这里的一些问题,我是Lisp的新手.我正在阅读Practical Common Lisp一书,但是稍微看了一下设置一个Web应用程序是多么容易,所以我一直在关注这个教程,以及这里的更新版本.
当我到达启动服务器的位置时,我的REPL就会死掉,然后我无法将任何东西推到服务器上*dispatch-table*.
所以基本上,我的代码在REPL中工作得很好,将对象添加到列表中,检索它们等等,然后我启动服务器使用
(setf *web-server* (start (make-instance 'hunchentoot:acceptor :port 8080)))
Run Code Online (Sandbox Code Playgroud)
哪个很好用,我可以访问它http://localhost:8080.但是当我访问它时,日志会打印到REPL,从那时起我无法实际使用REPL.例如,在Adam Petersen的帖子之后,我不能那么做
(push (create-prefix-dispatcher "/retro-games.htm" 'retro-games) *dispatch-table*)
Run Code Online (Sandbox Code Playgroud)
因为REPL没有反应.我尝试从不同的窗口(即从终端的SBCL)启动服务器但是它不知道我所处的上下文 - 它不理解我正在处理的包或我的任何代码.
我使用的是略微非标准的设置; 我在OSX上使用Sublime Text 2和SublimeREPL和SBCL(因为我真的没有进入Emacs和ST2很棒!).我描述我是如何把它一起在这里 -但我真的只张贴的以防万一,我会感到惊讶,如果它是我的设置造成的问题,而不是我失去了一些基本的东西.
无论如何,我知道我可以继续在更像生产的环境中设置hunchentoot,并且已经看到一些详细说明并远程访问REPL的帖子,但是我希望有一些更简单的东西可以解决我的问题.我错过了.
所以我在emacs工作,突然,slime-repl sbcl说文本是只读的.那很好,因为现在我不能输入任何东西.我该如何解决?
我有一个没有太多内存(256Mb)的VPS,我试图使用SBCL + Hunchentoot进行Common Lisp开发来编写一些简单的web应用程序.大量的内存似乎在没有做任何特别复杂的事情的情况下被使用,并且在服务页面一段时间后,内存耗尽并且使用所有交换或者(如果没有交换)就会死掉.
所以我需要帮助:
我假设前两个是相当简单的,但第三个甚至可能吗?人们如何处理Lisp中的内存不足或受限制的内存条件?
(另外,我注意到64位SBCL似乎使用的内存是32位的两倍.这是预期的吗?我可以运行32位版本,如果它会节省大量内存)
采取这个功能:
(defun sum-greater (x y z)
(> (+ x y) z))
Run Code Online (Sandbox Code Playgroud)
我的理解是,在LISP中,列表中的第一个元素始终表示要在后续原子/列表上执行的函数.那么为什么LISP不将xin (x y z)作为一个函数来对待y和执行z.显然,这不是理想的行为,但这将是预期的行为.
据推测,defun以某种方式定义的函数会覆盖列表的标准LISP评估?如果是这样,你能详细说明吗?
谢谢
我很难找到答案,所以也许这是不可能的.我希望能够灵活地从命令行加载/编译lisp文件,即不在emacs内部,然后还可以从命令行运行该文件中的一个lisp函数.这无疑是实现特定的功能,因此任何提供此功能的实现的指针(或者它可能是相当标准的,我不知道).我正在使用SBCL并喜欢它,所以如果可以做到这一点会很棒.
我也在使用Mac OSX和终端.
在Windows上使用64位Steel Bank Common Lisp进行简单的身份识别时:
(defun a (x)
(declare (fixnum x))
(declare (optimize (speed 3) (safety 0)))
(the fixnum x))
Run Code Online (Sandbox Code Playgroud)
我发现反汇编如下:
* (disassemble 'a)
; disassembly for A
; Size: 13 bytes
; 02D7DFA6: 84042500000F20 TEST AL, [#x200F0000] ; safepoint
; no-arg-parsing entry point
; AD: 488BE5 MOV RSP, RBP
; B0: F8 CLC
; B1: 5D POP RBP
; B2: C3 RET
Run Code Online (Sandbox Code Playgroud)
我理解的是:
mov rsp, rbp
pop rbp
ret
Run Code Online (Sandbox Code Playgroud)
从函数操作执行标准返回,但我不明白为什么有这些行:
TEST AL, [#x200F0000] // My understanding is that this …Run Code Online (Sandbox Code Playgroud) sbcl ×10
common-lisp ×9
lisp ×9
assembly ×1
automation ×1
debugging ×1
emacs ×1
hunchentoot ×1
memory ×1
quicklisp ×1
random ×1
shell ×1
slime ×1
stepper ×1
sublimetext2 ×1