Lisp示例冗余之地?
我读了很多关于它的好东西,所以我想我可能会通过它来看看有什么可以看的Lisp示例冗余之地?,lisp,common-lisp,clisp,land-of-lisp,Lisp,Common Lisp,Clisp,Land Of Lisp,我读了很多关于它的好东西,所以我想我可能会通过它来看看有什么可以看的 (取消调整文本(第一个大写字母点亮) (当lst (出租((项目(车辆lst)) (其余(cdr lst))) (续) ;如果item=space,则从ret开始递归调用 ;然后,在结果前面加上空格。 ((eq项#\space)(cons项(调整文本剩余大写))) ;如果项目是感叹号。请确保 ;下一个非空格大写。 ((成员项“(#\!#\?#\)(cons项(调整文本rest t lit))) ;if item=“然后切换我们
(取消调整文本(第一个大写字母点亮)
(当lst
(出租((项目(车辆lst))
(其余(cdr lst)))
(续)
;如果item=space,则从ret开始递归调用
;然后,在结果前面加上空格。
((eq项#\space)(cons项(调整文本剩余大写)))
;如果项目是感叹号。请确保
;下一个非空格大写。
((成员项“(#\!#\?#\)(cons项(调整文本rest t lit)))
;if item=“然后切换我们是否处于文字模式
((eq项“\”)(调整文本静止大写(未点亮)))
;如果是文字模式,只需按原样添加项并继续
(亮起(cons项(调整文本静止无亮起)))
;如果caps或literal mode=true,是否将其大写?
((或大写字母亮起)(cons(字符大写项目)(调整文本剩余零亮起)))
;否则小写。
(t(cons(char downcase项)(调整文本rest nil nil()()())))
(这些评论是我的)(仅供参考——方法签名是
(符号列表bool是否大写bool是否按字面处理)
,但作者将其缩短为(lst caps lit)
)
但无论如何,问题是:这里面有
(cond…(lit…(或caps lit…)
。我的理解是,这将转换为C风格语法中的if(lit){…}else if(caps | | lit){…}
。那么,or语句不是多余的吗?是否存在这样一种情况,即如果caps为nil
,将调用(或caps点亮)
条件?确实,您是正确的。请看这本书
第97页:函数tweak text有两个小问题,尽管它在大多数Lisp实现中运行正常。首先,它使用eq函数来比较字符-根据ANSI规范,字符应始终与其他函数(如eql或char equal)进行检查。此外,还可以将不必要的检查(或大写字母点亮)简化为大写字母
我将这样写:
(defun tweak-text (list caps lit)
(when list
(destructuring-bind (item . rest) list
(case item
((#\space) (cons item (tweak-text rest caps lit)))
((#\! #\? #\.) (cons item (tweak-text rest t lit)))
((#\") (tweak-text rest caps (not lit)))
(otherwise (cond (lit (cons item (tweak-text rest nil lit)))
(caps (cons (char-upcase item)
(tweak-text rest nil lit)))
(t (cons (char-downcase item)
(tweak-text rest nil nil)))))))))
CASE语句发送到角色上。COND语句然后处理其他条件。CASE与EQL进行了比较。这意味着CASE也适用于字符,甚至可以与多个项目进行比较。我也是一个代码布局风格的爱好者,它可以排列相应的表达式——这只适用于单间距字体。这有助于我直观地检测代码中的模式,并有助于检测可以简化的代码
DESTRUCTURING-BIND将列表拆分
为了好玩,使用循环重写:
(defun tweak-text (list)
(loop with caps and lit
for item in list
when (eql item #\space)
collect item
else when (member item '(#\! #\? #\.))
collect item and do (setf caps t)
else when (eql item #\")
do (setf lit (not lit))
else when lit
collect item and do (setf caps nil)
else when caps
collect (char-upcase item) and do (setf caps nil)
else
collect (char-downcase item) and
do (setf caps nil lit nil)))
谢谢我开始觉得我疯了(下次我会记得先检查勘误表),((书中有几件事我注意到我会做得不一样(他在这里有一点递归,迭代更干净,而且(在我看来)更容易掌握))(但是(我在遵循示例(以防万一)(他有一个比我想出的(()()))更好的计划)(Lisp会说英语)。