我看到 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) 只是为了好玩(Project Euler#65)我想实现这个公式
n_k = a_k*n_k-1 + n_k-2
以有效的方式.a_k是1或者(* 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但速度很慢 …
我想做一些整数运算,并在检查SBCL是否可以提高速度(如果我提供有关所type使用的值的明确信息)。虽然我很容易declare在中使用defun或let直接使用它,但是我不知道将语句放在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?
我正在考虑超级规范中common-lisp描述的不同映射函数.我非常习惯并认为这是最容易理解的.但是使用什么是现实世界的例子?在我得到它的情况下,它用于副作用的例子.但为什么它会返回列表参数?mapcarmapchyperspec
当这样的映射在使用loop等的迭代上是有利的时,是否存在一般规则?
我正在使用来自外部库的函数返回四个数字的向量,我想直接访问这些值,就像使用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)
如果我coerce在vector为list这是可能的,并且表现在这里是没有问题的,这是可能的罚款。但我想知道是否有更简单的方法?
restart-case我想在丢失输入文件期间向用户提供附加信息。
有没有一种便携式方法可以打印当前目录中的文件?
我有两个相同长度的字符串,它们只有一个字符不同,我想要一个相等的所有字符的字符串.所以基本上这样的东西,它评估一个字符串而不是一个字符列表:
(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是不是一个字符时a和b不相等.
是否有一个更优雅的习惯用法来迭代一个字符串并获得一个字符串?
我有几个包含简单,正整数的长度不同的列表,(2 4 1 3)我希望在列表排序后检查所有数字是否相互跟随.这意味着订单本身无关紧要,但不允许存在间隙.
(2 4 1 3) 是正确的
(2 4 1 5) 不正确
在我开始重新发明轮子之前,我想知道是否有替代方法对列表进行排序,然后检查第一个和第二个(等等......)元素的差异是否为1.
编辑
我的例子没有显示完整的任务.该列表不必1每次都开始,即(6 8 7 9)也可以是有效输入.
我想打印几个数字作为罗马数字但是
(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的罗马数字?