Conad Barski 的 lisp 函数中的条件是多余的吗?
The conditional in Conad Barski's lisp function is redundant?
此问题与 Conrad Barski's Book 的第 6 章代码有关,Land of Lisp
。
代码如下
(defun tweak-text (lst caps lit)
(when lst
(let ((item (car lst))
(rest (cdr lst)))
(cond ((eq item #\space) (cons item (tweak-text rest caps lit)))
((member item '(#\! #\? #\.)) (cons item (tweak-text rest t lit)))
((eq item #\") (tweak-text rest caps (not lit)))
(lit (cons item (tweak-text rest nil lit)))
((or caps lit) (cons (char-upcase item) (tweak-text rest nil lit)))
(t (cons (char-downcase item) (tweak-text rest nil nil)))))))
现在看看 (lit ..)
部分及其下面的内容.. ((or caps nil) ..)
,所以我的问题如下
- 如果
lit
永远为真,它将在前面陈述的表达式中进行评估
- 如果它不是 true,后一个表达式将始终计算为
(or caps false)
=> (or caps false)
这几乎没用?
所以后一个表达式不应该只是 (caps (cons (char ...))
吗?
这本书已经被成千上万的人阅读了,所以我一定有什么地方是错的,我不是约翰·贝尔。
是的,更简单的表达式是等价的。它在第 97 页勘误表中提到 http://landoflisp.com/errata.html
其中一个问题是递归的使用,它限制了函数能够处理的列表的长度。
(defun tweak-text (list &aux (caps t) (lit nil))
(mapcon (lambda (c)
(case c
(#\space (list c))
((#\! #\? #\.)
(setf caps t)
(list c))
(#\"
(setf lit (not lit))
())
(otherwise
(cond (lit (setf caps nil) (list c))
(caps (setf caps nil) (list (char-upcase c)))
(t (setf caps nil lit nil)
(list (char-downcase c)))))))
list))
此问题与 Conrad Barski's Book 的第 6 章代码有关,Land of Lisp
。
代码如下
(defun tweak-text (lst caps lit)
(when lst
(let ((item (car lst))
(rest (cdr lst)))
(cond ((eq item #\space) (cons item (tweak-text rest caps lit)))
((member item '(#\! #\? #\.)) (cons item (tweak-text rest t lit)))
((eq item #\") (tweak-text rest caps (not lit)))
(lit (cons item (tweak-text rest nil lit)))
((or caps lit) (cons (char-upcase item) (tweak-text rest nil lit)))
(t (cons (char-downcase item) (tweak-text rest nil nil)))))))
现在看看 (lit ..)
部分及其下面的内容.. ((or caps nil) ..)
,所以我的问题如下
- 如果
lit
永远为真,它将在前面陈述的表达式中进行评估 - 如果它不是 true,后一个表达式将始终计算为
(or caps false)
=>(or caps false)
这几乎没用?
所以后一个表达式不应该只是 (caps (cons (char ...))
吗?
这本书已经被成千上万的人阅读了,所以我一定有什么地方是错的,我不是约翰·贝尔。
是的,更简单的表达式是等价的。它在第 97 页勘误表中提到 http://landoflisp.com/errata.html
其中一个问题是递归的使用,它限制了函数能够处理的列表的长度。
(defun tweak-text (list &aux (caps t) (lit nil))
(mapcon (lambda (c)
(case c
(#\space (list c))
((#\! #\? #\.)
(setf caps t)
(list c))
(#\"
(setf lit (not lit))
())
(otherwise
(cond (lit (setf caps nil) (list c))
(caps (setf caps nil) (list (char-upcase c)))
(t (setf caps nil lit nil)
(list (char-downcase c)))))))
list))