【问题标题】:Why do these both print the same thing?为什么这两个打印相同的东西?
【发布时间】:2015-09-25 22:18:43
【问题描述】:

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

    ;;;;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 从输出的第二部分中删除,但除非我在变量中声明它,否则它不会。如何在不声明大量变量的情况下只使用一条数据并删除/添加我需要的内容?

【问题讨论】:

  • 为什么大部分变量都是未定义的?例如first-char?它在哪里定义?你为什么打电话给remove,却从不使用结果?变量first-char 是干什么用的?没用过? last 函数返回什么?
  • 因为它不完整,我遇到了一个问题,这是我的问题,我只是添加了所有代码以便更容易理解上下文。

标签: lisp common-lisp clisp


【解决方案1】:

(我以为之前会问这个问题,Stack Overflow上肯定有相关的东西,但是我没有找到合适的重复。)

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

remove、remove-if、remove-if-not 返回一个相同类型的序列 具有相同元素的序列,除了 以 start 和 end 为界且满足测试的子序列是 删除。 这是非破坏性操作。如果有任何元素需要 被删除,结果将是一个副本。删除的结果可能会共享 有顺序;如果没有,结果可能与输入序列相同 元素需要被移除。

这意味着您需要使用 remove 返回的值。例如,您可以将其返回、将其绑定到变量或将其分配给变量:

(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

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


同样值得注意的是,许多 Common Lisp 函数在序列上运行,而不仅仅是列表。序列包括向量,其中字符串是一个子类型。例如,(reverse "word") 将返回 "drow"。同样,您可以在序列上使用 position-if。这意味着一个简单的猪拉丁函数可以用这样的东西来完成:

(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"

【讨论】:

  • 感谢您的回答:D 您提供的关于如何执行猪拉丁功能的示例已经超出了我的想象,当我到达时我会越过那座桥。谢谢!
猜你喜欢
  • 2011-03-17
  • 2017-08-07
  • 1970-01-01
  • 2013-04-06
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多