Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lisp示例冗余之地?_Lisp_Common Lisp_Clisp_Land Of Lisp - Fatal编程技术网

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会说英语)。