根据HyperSpec,其页面DO(由我提供的重点):
do接受任意数量的迭代变量,这些变量在迭代中绑定并并行执行.
但似乎DO无法接受空变量列表,例如:
(do (())
((cond n) (end-result))
(cond-1..
(cond-2..))
Run Code Online (Sandbox Code Playgroud)
是不是真的DO不能接受空的var列表?是否有一个原因?(我想总有LOOP).
我正在运行SBCL.
我安装了emacs + sbcl + slime.我定义了这个功能
(defun jugar ()
(let* ((nodoActual *nodo-inicial*)
(estadoActual (nodo-estado nodoActual))
(timeStart nil)
(timeEnd nil)
)
(loop while (not (es-estado-final estadoActual)) do
(setf *hojas* 0)
(setf timeStart (get-universal-time))
(setf nodoActual (decision-minimax nodoActual *profundidad* timeStart))
(setf timeEnd (get-universal-time))
(setf estadoActual (nodo-estado nodoActual))
(imprime-en-fichero estadoActual)
(format t "Hojas analizadas: ~a ~%" *hojas*)
(format t "Tiempo empleado: ~a ~%~%" time))
))
Run Code Online (Sandbox Code Playgroud)
进行一系列调用并在循环中打印一些变量.
问题是当我(jugar)从*slime-repl sbcl*缓冲区调用时,提示等待直到(jugar)执行结束以显示所有(format …)在一起.我从一个终端(运行sbcl)尝试了同样的方法并且运行良好,所以我猜这是与emacs或slime相关的东西.我该如何解决?
我昨天开始在Common Lisp中编程.现在我想找到1000或以下3或5的所有倍数的总和.我提出了:
(loop for n from 1 to 1000 when
(or
(eq (mod n 5) 0)
(eq (mod n 3) 0))
(sum n)))
Run Code Online (Sandbox Code Playgroud)
我知道循环部分是有效的(loop for n from 1 to 1000 sum n)总结前1000个数字.我知道这些((eq (mod n 5) 0) (mod n 3) 0))部分是有效的.我知道它(or (eq (mod n 5) 0) (eq (mod n 3) 0))有用.所以它对我来说看起来像一个强大的程序,但是当我运行它时我得到错误:
1 =(SUM N)找到关键字期望在当前LOOP上下文之后得到LOOP子句:WHEN(OR(EQ(MOD 1000 5)0)(EQ(MOD 1000 3)0))1#.[SB-INT型的条件:SIMPLE-PROGRAM-ERROR]
我怀疑(sum n)or-statement之后出现了问题.但我不知道为什么会这样或者我如何解决它.有人可以帮助我,让我的第一个Lisp程序工作吗?
如何在常见的lisp中加入一系列路径组件?
在python中,我能做到,
`os.path.join("/home/", username, "dira", "dirb", "dirc");`
Run Code Online (Sandbox Code Playgroud)
常见的lisp中的等价物是什么?
当然我可以编写自己的函数,但我怀疑我应该能够使用内置函数.
这个问题是关于sbcl - 或者我最初想的.问题:角色什么时候不是角色?请考虑以下代码:
(defconstant +asc-lf+ #\Newline)
(defconstant +asc-space+ #\Space)
(prin1 (type-of #\Newline )) (terpri)
(prin1 (type-of #\Space )) (terpri)
(prin1 (type-of +asc-lf+ )) (terpri)
(prin1 (type-of +asc-space+)) (terpri)
Run Code Online (Sandbox Code Playgroud)
正如所料,它产生:
STANDARD-CHAR
STANDARD-CHAR
STANDARD-CHAR
STANDARD-CHAR
Run Code Online (Sandbox Code Playgroud)
现在考虑这段代码:
(defun st (the-string)
(string-trim '(#\Newline #\Space) the-string))
(princ "\"")
(princ (st " abcdefgh "))
(princ "\"")
(terpri)
Run Code Online (Sandbox Code Playgroud)
它产生:
"abcdefgh"
Run Code Online (Sandbox Code Playgroud)
但请考虑以下代码:
(defconstant +asc-lf+ #\Newline)
(defconstant +asc-space+ #\Space)
(defun st (the-string)
(string-trim '(+asc-lf+ +asc-space+) the-string))
(princ "\"")
(princ (st " abcdefgh "))
(princ "\"")
(terpri)
Run Code Online (Sandbox Code Playgroud)
当您使用sbcl加载它时,它会为您提供:
While evaluating …Run Code Online (Sandbox Code Playgroud) 在完成CLRS Intro to Algorithms一书并试图在常见的lisp中实现红黑二叉搜索树时,我遇到了以下问题:圆形指针:
(defstruct node (ptr nil))
(defparameter *x* (make-node))
(defparameter *y* (make-node :ptr *x*))
(setf (node-ptr *x*) *y*)
Run Code Online (Sandbox Code Playgroud)
此代码导致堆耗尽错误,可能是由于指针指向指向该指针的指针等引起的无限递归.
有没有办法防止这种无限递归发生,同时保持这里给出的指针结构?
我知道还有其他方法可以实现红黑树(例如,不使用setf),但我有兴趣在CLRS中复制命令式样式,因为常见的lisp是一种多范式语言.
PS.除了通常的左子指针和右子指针之外,CLRS中的BST还有父指针.
因此,我正在通过Paul Graham的Common Lisp工作,并且有一个问题要求创建一个union函数,该函数维护列表中元素的组合顺序.为此,我写了以下函数:
(defun new-union (listA listB)
(setq retset (list (car listA)))
(loop for el in (append (cdr listA) listB)
do (if (not(member el retset))
(push el (cdr (last retset)))))
(return-from new-union retset))
Run Code Online (Sandbox Code Playgroud)
这将返回每个列表的唯一元素,同时保持顺序,因此如果我创建并运行:
(setq listA '(a b c a))
(setq listB '(c d e))
(new-union listA listB)
Run Code Online (Sandbox Code Playgroud)
回报是:
(A B C D E)
Run Code Online (Sandbox Code Playgroud)
所以第一件事是我得到一个编译器警告:"undefined variable: RETSET"在这一行:(setq retset (list (car listA))).另一件事是上面的方法似乎是一种更"面向对象"的做事方式而不是LISP方式的return-from陈述.
是否可以在没有编译器错误的情况下以更"适合"的方式编写此代码?
*编辑:使用@Sylwester的答案我已经重写了如下函数并且没有错误:
(defun new-union (listA listB)
(let ((retset (list (car listA))))
(loop for …Run Code Online (Sandbox Code Playgroud) 我一直在阅读GNU Emacs Calculator手册,以寻找如何以编程方式调用lisp程序中现有函数的说明.
我已经检查了"编程"一节,但它似乎与扩展计算器有关,而不是使用计算器进行编程.有一个名为"从你的Lisp程序调用Calc"的部分讨论了calc-eval程序员可用的函数,但到目前为止,我还没能在SBCL中调用该函数.
似乎可以从Emacs Lisp以编程方式调用计算器函数,但我很想知道SBCL中是否也有类似的功能.
如果我在没有自定义包的 REPL 中运行它,以下来自 Paul G 的OnLisp 的代码工作正常。当我定义一个包并与它一起使用时(in-package :mypackage)它不起作用——它总是t在case语句中采用这种情况:
(defun run-node (name)
(let ((n (gethash name *nodes*)))
(cond ((node-yes n)
(format t "~A~%>> " (node-contents n))
(case (read)
(yes (run-node (node-yes n))) ; never hits this in package
(t (run-node (node-no n)))))
(t (node-contents n)))))
Run Code Online (Sandbox Code Playgroud) 有人能指出 Lisp 的保留字符列表吗?我正在尝试启动一些用于学习目的的重要程序。我能找到一个已经使用emacs存在的功能,但我无法找到的保留字符和字符串像一个汇总列表`,,和#\。
大多数教程倾向于仅在它们适用于特定示例时才谈论它们,或者它们谈论高级表达式语法。
在下面的代码中,我收到一个Required argument is not a symbol错误。
(defconstant +localhost+ (vector 127 0 0 1))
(defun ip-from-hostname (hostname)
(sb-bsd-sockets:host-ent-addresses
(sb-bsd-sockets:get-host-by-name hostname)))
(defun test-connect
(let ((ip (car (ip-from-hostname "www.google.com")))
(socket (make-instance 'sb-bsd-sockets:inet-socket :type :stream :protocol :tcp)))
(sb-bsd-sockets:socket-bind socket +localhost+ 8080)
(sb-bsd-sockets:socket-connect socket ip)
(sb-bsd-sockets:socket-send socket "GET / HTTP/1.1" nil)
(write-line (sb-bsd-sockets:socket-receive socket nil 2048))))
(test-connect)
Run Code Online (Sandbox Code Playgroud)
更完整的错误信息:
Required argument is not a symbol: ((IP
(CAR
(IP-FROM-HOSTNAME "www.google.com")))
(SOCKET
(MAKE-INSTANCE
'SB-BSD-SOCKETS:INET-SOCKET :TYPE
:STREAM :PROTOCOL :TCP)))
Run Code Online (Sandbox Code Playgroud)
我已经将问题缩小到调用部分ip-from-hostname,但奇怪的是在 REPL 中 let 绑定的简化版本:
(let …Run Code Online (Sandbox Code Playgroud) 我有以下功能:
(defun transform-matrix (matrix)
(let ((res (map 'vector
(lambda (x)
(map 'vector
(lambda (ix)
(if ix
'(t 0) ; --> Problem happens here
0))
x))
matrix)))
res))
Run Code Online (Sandbox Code Playgroud)
此函数将接受一个二维矩阵,其中每个元素可以是 t 或 nil。然后它将转换 t -> '(t 0) 和 nil -> 0。
结果数组有一个问题是每个 (t 0) cons 现在都指向相同的内存位置。例如,如果我将结果数组保存在res变量中并执行以下操作:
(eq (aref (aref res 0) 0)
(aref (aref res 1) 1))
Run Code Online (Sandbox Code Playgroud)
*假设 res[0][0] 和 res[1][1] 是 '(t, 0) 节点。
这将导致 T。但这样做是导致 nil:
(eq '(t 0) '(t 0))
Run Code Online (Sandbox Code Playgroud)
我能问一下使创建的 cons 指向相同内存位置的变换矩阵会发生什么吗?
我在 SBCL …
在我的一本书中,我有这个方案代码,并想将其转换为 Common Lisp:
(define (make-account balance)
(define (withdraw amount)
(if (>= balance amount)
(begin (set! balance (- balance amount))
balance)
"Insufficient funds"))
(define (deposit amount)
(set! balance (+ balance amount))
balance)
(define (dispatch m)
(cond
((eq? m 'withdraw) withdraw)
((eq? m 'deposit) deposit)
(else (error "Unknown request -- MAKE-ACCOUNT" m))))
dispatch)
Run Code Online (Sandbox Code Playgroud)
然后我将使用以下命令创建它:
(define acc (make-account 1500))
Run Code Online (Sandbox Code Playgroud)
然后调用deposit或withdraw:
((acc 'withdraw) 50)
或者
((acc 'deposit) 75)
据我了解,
acc被函数替换dispatch并返回withdrawordeposit
然后计算表达式,例如:
((acc 'withdraw) 50) …
common-lisp ×13
sbcl ×13
lisp ×8
clisp ×2
emacs ×2
arrays ×1
cons ×1
flush ×1
loops ×1
mit-scheme ×1
package ×1
scheme ×1
slime ×1
user-input ×1