common-lisp - 为什么 SBCL(或一般的 Common lisp?)不喜欢我的循环?
问题描述
递归 find-dir-upwards 按预期工作,但 find-dir-upwards-loop 拒绝编译,抱怨 SBCL(Win64、Portacle 1.4、SBCL 2.0.0)下的类型不匹配(即使添加了类型注释)。
我做错了什么 ?
(defun find-dir-upwards-loop (dir marker-file)
(loop for prev = nil then curr
for curr = dir then (uiop:pathname-parent-directory-pathname curr)
until (equal curr prev)
with f = (merge-pathnames marker-file curr)
when (uiop:file-exists-p f) return curr))
(defun find-dir-upwards (dir marker-file)
(let ((f (merge-pathnames marker-file dir)))
(if (uiop:file-exists-p f)
dir
(let ((parent (uiop:pathname-parent-directory-pathname dir)))
(unless (equal dir parent)
(find-dir-upwards parent marker-file))))))
解决方案
FOR部分答案之后的WITH :
(loop for x = 0 then (+ x 1)
with y = (+ x 1)
when (> x 10) return (list x y))
这是一系列事件:
X
变量将被建立Y
变量将被建立并初始化为(+ x 1)
- 该
X
变量将设置为0
- ...
如您所见,在操作 1) X
中将是一个变量,但它不会被初始化为0
. 这将发生在操作 3)中。因此在操作 2) X
中不会被初始化为0
-> 它的值可能是NIL
. 添加1
到NIL
是一个错误。
推荐阅读
- typo3 - Typo3:页面树中缺少根页面图标(Typo3 版本 9.5.1)
- combinatorics - 如何在 R 中进行最佳组合选择
- javascript - 在JavaScript(NodeJs)中调用对象内部的函数名称时有所不同
- mysql - 如何从 Google Cloud 的 VM 转储和下载 mysql
- javascript - 异步函数在另一个函数中调用时不等待 Promise
- mysql - SELECT 的奇怪回答行为
- java - 通过 Payara 4 诊断与 Oracle 的 XA 连接
- xaml - XAML:ImageBrush 水平平铺
- angular - 我可以将一个应用程序的组件用于另一个应用程序吗?
- mysql - 具有非 utf8 编码的 MySQL SUBSTRING()