标签: sbcl

Common Lisp:DO的空变量列表

根据HyperSpec,其页面DO(由我提供的重点):

do接受任意数量的迭代变量,这些变量在迭代中绑定并并行执行.

但似乎DO无法接受空变量列表,例如:

(do (())
    ((cond n) (end-result))
  (cond-1..
  (cond-2..))
Run Code Online (Sandbox Code Playgroud)

是不是真的DO不能接受空的var列表?是否有一个原因?(我想总有LOOP).

我正在运行SBCL.

lisp loops sbcl common-lisp

0
推荐指数
1
解决办法
323
查看次数

slime仅在被调用函数结束时打印my(format ...)调用

我安装了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相关的东西.我该如何解决?

emacs sbcl flush common-lisp slime

0
推荐指数
1
解决办法
203
查看次数

如何在Lisp中将所有可被3或5整除的数字加起来?

我昨天开始在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 sbcl common-lisp

0
推荐指数
2
解决办法
1354
查看次数

在常见的lisp中加入一系列路径组件

如何在常见的lisp中加入一系列路径组件?

在python中,我能做到,

`os.path.join("/home/", username, "dira", "dirb", "dirc");`
Run Code Online (Sandbox Code Playgroud)

常见的lisp中的等价物是什么?

当然我可以编写自己的函数,但我怀疑我应该能够使用内置函数.

sbcl common-lisp

0
推荐指数
1
解决办法
602
查看次数

sbcl(和clisp):什么时候字符不是字符?(使用defconstant)

这个问题是关于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)

lisp clisp sbcl common-lisp

0
推荐指数
2
解决办法
262
查看次数

lisp中的循环指针

在完成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还有指针.

lisp clisp sbcl common-lisp circular-reference

0
推荐指数
1
解决办法
125
查看次数

LISP从函数中返回值的适当方法

因此,我正在通过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)

functional-programming sbcl common-lisp

0
推荐指数
1
解决办法
779
查看次数

带有SBCL的GNU Emacs计算器

我一直在阅读GNU Emacs Calculator手册,以寻找如何以编程方式调用lisp程序中现有函数的说明.

我已经检查了"编程"一节,但它似乎与扩展计算器有关,而不是使用计算器进行编程.有一个名为"从你的Lisp程序调用Calc"的部分讨论了calc-eval程序员可用的函数,但到目前为止,我还没能在SBCL中调用该函数.

似乎可以从Emacs Lisp以编程方式调用计算器函数,但我很想知道SBCL中是否也有类似的功能.

emacs sbcl common-lisp

0
推荐指数
1
解决办法
141
查看次数

带有自定义包的 `read` 上的 Common Lisp `case`

如果我在没有自定义包的 REPL 中运行它,以下来自 Paul G 的OnLisp 的代码工作正常。当我定义一个包并与它一起使用时(in-package :mypackage)它不起作用——它总是tcase语句中采用这种情况:

(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 user-input sbcl common-lisp package

0
推荐指数
1
解决办法
59
查看次数

Lisp:在哪里可以找到 sbcl 的保留字符列表?

有人能指出 Lisp 的保留字符列表吗?我正在尝试启动一些用于学习目的的重要程序。我能找到一个已经使用emacs存在的功能,但我无法找到的保留字符和字符串像一个汇总列表`,#\

大多数教程倾向于仅在它们适用于特定示例时才谈论它们,或者它们谈论高级表达式语法。

lisp sbcl common-lisp reserved-words

0
推荐指数
1
解决办法
104
查看次数

let 绑定中的“必需参数不是符号”错误

在下面的代码中,我收到一个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)

sbcl common-lisp

0
推荐指数
1
解决办法
55
查看次数

在 Common Lisp 中映射数组时,两个缺点指向相同的内存

我有以下功能:

(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 …

lisp arrays sbcl common-lisp cons

0
推荐指数
1
解决办法
96
查看次数

将 MIT Scheme 代码逻辑转换为 Common Lisp

在我的一本书中,我有这个方案代码,并想将其转换为 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)

然后调用depositwithdraw

((acc 'withdraw) 50) 或者

((acc 'deposit) 75)

据我了解, acc被函数替换dispatch并返回withdrawordeposit 然后计算表达式,例如: ((acc 'withdraw) 50) …

lisp scheme sbcl common-lisp mit-scheme

0
推荐指数
1
解决办法
106
查看次数