gpt4 book ai didi

lisp - 为什么这两个打印相同的东西?

转载 作者:太空宇宙 更新时间:2023-11-03 18:50:09 24 4
gpt4 key购买 nike

我真的很好奇为什么使用“删除”实际上并没有从列表中删除,如果我在一个变量中声明它,它会,但后来我有另一个变量要处理,这一切都变得非常困惑,他是我的代码;

    ;;;;Pig latin
(defun pig-latin ()
(let ((word (read-line)))
(setf ind-characters (loop for char across word
collect char))
(setf first-char (car ind-characters))
(setf reversed-word (reverse ind-characters));flips the
(remove (last reversed-word) reversed-word)
(print reversed-word)))

我得到的输出是:

(#\d #\r #\o #\w)
(#\d #\r #\o #\w)

我原以为 #\w 会从输出的第二部分中删除,但除非我在变量中声明它,否则不会。如何在不声明大量变量的情况下只处理单个数据并删除/添加我需要的内容?

最佳答案

(我以为这个问题之前有人问过,Stack Overflow 上肯定有相关的东西,但我没有找到合适的副本。)

问题是 remove 返回一个新列表;它不会修改现有列表。 remove 的 HyperSpec 条目中的相关部分(强调):

remove, remove-if, remove-if-not return a sequence of the same type as sequence that has the same elements except that those in the subsequence bounded by start and end and satisfying the test have been removed. This is a non-destructive operation. If any elements need to be removed, the result will be a copy. The result of remove may share with sequence; the result may be identical to the input sequence if no elements need to be removed.

这意味着您需要使用remove 返回的值。例如,您可以返回它,将它绑定(bind)到一个变量,或者将它分配给一个变量:

(defun remove-1 (list)
(remove 1 list)) ; return the result

(let ((list-without-ones (remove 1 list))) ; bind the result
...)

(setf list (remove 1 list)) ; update a variable

请注意,该语言还包含一个删除 功能,该功能可能具有破坏性。但是请注意,这并不能消除保存结果的需要。这意味着可以修改列表结构。不过,您仍然需要保存结果,因为旧列表中第一个的 cons 单元可能不是新列表中第一个的 cons 单元。有关更多信息,请参见,例如:


还值得注意的是,许多 Common Lisp 函数对序列 进行操作,而不仅仅是列表。序列包括向量,字符串是向量的一个子类型。例如,(reverse "word") 将返回 "drow"。同样,您可以对序列使用 position-if。这意味着一个简单的 pig latin 函数可以像这样完成:

(defun vowelp (char)
(position char "aeiou" :test 'char-equal))

(defun pig-latin (word)
(let ((i (position-if 'vowelp word))) ; position of first vowel
(if (null i) word ; if no vowels, return word
(concatenate 'string ; else, concatenate parts:
(subseq word i) ; * "ord"
(subseq word 0 i) ; * "w"
"ay")))) ; * "ay"

关于lisp - 为什么这两个打印相同的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32791443/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com