小编Mar*_*ann的帖子

Lisp 网络故事:如何修复 blogdemo 示例(第 4 章)?

我看到 Pavel 的关于使用 CL 和RESTAS作为框架编写 Web 应用程序的教程。虽然简单的例子有效。我无法运行第 4 章中的博客示例。Hello, World!

使用(restas:debug-mode-on)我最终得到以下回溯:

invalid number of arguments: 0
  [Condition of type SB-INT:SIMPLE-PROGRAM-ERROR]

Restarts:
 0: [ABORT] abort thread (#<THREAD "hunchentoot-worker-127.0.0.1:59876" RUNNING {1009975FD3}>)

Backtrace:
  0: (BLOGDEMO::HTML-FRAME) [tl,external]
  1: (RESTAS::ROUTE-RENDER-METHOD #<RESTAS:ROUTE {100A16FE53}>)
  2: ((:METHOD RESTAS:PROCESS-ROUTE (RESTAS:ROUTE T)) #<RESTAS:ROUTE {100A16FE53}> NIL) [fast-method]
  3: ((FLET CALL-NEXT-METHOD :IN "C:/Users/martin_b/portacle/quicklisp/dists/quicklisp/software/restas-20170124-git/src/route.lisp"))
  4: ((:METHOD RESTAS:PROCESS-ROUTE :AROUND (ROUTES:BASE-ROUTE T)) #<RESTAS:ROUTE {100A16FE53}> NIL) [fast-method]
  5: (RESTAS::RESTAS-DISPATCH-REQUEST #<RESTAS:RESTAS-ACCEPTOR (host *, port 8080)> #<RESTAS::RESTAS-REQUEST {1003E5B383}>)
  6: ((:METHOD HUNCHENTOOT:ACCEPTOR-DISPATCH-REQUEST …
Run Code Online (Sandbox Code Playgroud)

common-lisp

5
推荐指数
1
解决办法
221
查看次数

是否存在具有两个累积变量的tco模式?

只是为了好玩(Project Euler#65)我想实现这个公式

n_k = a_k*n_k-1 + n_k-2

以有效的方式.a_k1或者(* 2 (/ k 3)),取决于k.

我从一个递归的解决方案开始:

(defun numerator-of-convergence-for-e-rec (k)
  "Returns the Nth numerator of convergence for Euler's number e."
  (cond ((or (minusp k)) (zerop k) 0)
        ((= 1 k) 2)
        ((= 2 k) 3)
        ((zerop (mod k 3)) (+ (* 2 (/ k 3) (numerator-of-convergence-for-e-rec (1- k)))
                              (numerator-of-convergence-for-e-rec (- k 2))))
        (t (+ (numerator-of-convergence-for-e-rec (1- k))
              (numerator-of-convergence-for-e-rec (- k 2))))))
Run Code Online (Sandbox Code Playgroud)

显然,它适用于小型k但速度很慢 …

recursion common-lisp tail-call-optimization

5
推荐指数
1
解决办法
73
查看次数

如何声明循环变量的类型

我想做一些整数运算,并在检查SBCL是否可以提高速度(如果我提供有关所type使用的值的明确信息)。虽然我很容易declare在中使用defunlet直接使用它,但是我不知道将语句放在loop构造中的什么位置。

我遇到了iterate提供此类可能性的软件包文档,但希望暂时坚持使用。

一个存根示例可能如下所示:

(loop :for i from 1 upto 100 :collect
  (loop :for j from i upto 100
    :collect (* i j)))
Run Code Online (Sandbox Code Playgroud)

我怎样才能告诉Lisp i并且j是类型fixnum

loops common-lisp type-declaration

3
推荐指数
2
解决办法
709
查看次数

使用mapc的一个现实例子是什么?

我正在考虑超级规范中common-lisp描述的不同映射函数.我非常习惯并认为这是最容易理解的.但是使用什么是现实世界的例子?在我得到它的情况下,它用于副作用的例子.但为什么它会返回列表参数?mapcarmapchyperspec

当这样的映射在使用loop等的迭代上是有利的时,是否存在一般规则?

mapping common-lisp

3
推荐指数
1
解决办法
72
查看次数

向量的解构

我正在使用来自外部库的函数返回四个数字的向量,我想直接访问这些值,就像使用destructuring-bind. 看这个毫无意义的例子:

(defun a-vector ()
  (vector 1 2 3 4))

(defun a-list ()
  (list 1 2 3 4))

(destructuring-bind (a b c d)
    (a-list)
  (format t "~D ~D ~D ~D~%" a b c d))

(destructuring-bind (a b c d)
    (coerce (a-vector) 'list)
  (format t "~D ~D ~D ~D~%" a b c d))
Run Code Online (Sandbox Code Playgroud)

如果我coercevectorlist这是可能的,并且表现在这里是没有问题的,这是可能的罚款。但我想知道是否有更简单的方法?

vector common-lisp destructuring

3
推荐指数
1
解决办法
149
查看次数

显示当前目录内容的便携方式

restart-case我想在丢失输入文件期间向用户提供附加信息。

有没有一种便携式方法可以打印当前目录中的文件?

common-lisp

2
推荐指数
1
解决办法
1111
查看次数

迭代字符串

我有两个相同长度的字符串,它们只有一个字符不同,我想要一个相等的所有字符的字符串.所以基本上这样的东西,它评估一个字符串而不是一个字符列表:

(loop for a across "abcd"
      for b across "abce"
      when (char= a b) collect a)
Run Code Online (Sandbox Code Playgroud)

虽然性能在这里不是问题,但我发现(coerce ... 'string)围绕它表现很麻烦.

所以我想出了类似的东西

(loop with result = ""
      for a across "abcd"
      for b across "abce"
      when (char= a b)
        do (setf result (concatenate 'string result (string a)))
      finally (return result))
Run Code Online (Sandbox Code Playgroud)

这工作但看起来不是很优雅.

(map 'string (lambda (a b) (when (char= a b) a)) "abcd" "abce")
Run Code Online (Sandbox Code Playgroud)

看起来更好,但不是因为工作NIL是不是一个字符时ab不相等.

是否有一个更优雅的习惯用法来迭代一个字符串并获得一个字符串?

string iteration loops common-lisp

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

如何检查列表中的所有数字是否稳步增加?

我有几个包含简单,正整数的长度不同的列表,(2 4 1 3)我希望在列表排序后检查所有数字是否相互跟随.这意味着订单本身无关紧要,但不允许存在间隙.

(2 4 1 3) 是正确的

(2 4 1 5) 不正确

在我开始重新发明轮子之前,我想知道是否有替代方法对列表进行排序,然后检查第一个和第二个(等等......)元素的差异是否为1.

编辑

我的例子没有显示完整的任务.该列表不必1每次都开始,即(6 8 7 9)也可以是有效输入.

numbers list common-lisp

2
推荐指数
1
解决办法
89
查看次数

如何打印大于3,999的罗马数字?

我想打印几个数字作为罗马数字但是

(format t "~@R~%" 4000)
Run Code Online (Sandbox Code Playgroud)

导致SBCL 1.3.20中的以下错误以及使用ccl的类似错误:

Number too large to print in Roman numerals: 4,000
   [Condition of type SIMPLE-ERROR]

Restarts:
 0: [RETRY] Retry SLIME REPL evaluation request.
 1: [*ABORT] Return to SLIME's top level.
 2: [ABORT] abort thread (#<THREAD "new-repl-thread" RUNNING {100503D2B3}>)
Run Code Online (Sandbox Code Playgroud)

我没有在Hyperspec中找到有关此限制的任何信息,也不知道罗马人的数字只有3,999.

是否有现成的解决方案可以打印大于3,999的罗马数字?

format common-lisp roman-numerals

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