首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这两个印的东西是一样的?

为什么这两个印的东西是一样的?
EN

Stack Overflow用户
提问于 2015-09-25 22:18:43
回答 1查看 64关注 0票数 1

我真的很好奇为什么使用“删除”并不是真正从列表中删除,如果我在一个变量中声明它,但是我有另一个变量要处理,这一切变得非常混乱,他是我的代码;

代码语言:javascript
复制
    ;;;;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)))

我得到的输出是:

代码语言:javascript
复制
(#\d #\r #\o #\w)
(#\d #\r #\o #\w)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-26 02:29:03

(我原以为以前也会问过这个问题,而且堆栈溢出上当然也有相关的内容,但我没有找到合适的副本。)

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

remove,remove-if,remove--如果--不返回与序列类型相同的序列,该序列具有相同的元素,除了在子序列中以开始和结束为界并满足测试要求的序列已被删除。,这是一种非破坏性的操作.如果需要删除任何元素,结果将是一个副本。删除的结果可能与序列共享;如果不需要删除元素,则结果可能与输入序列相同。

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

代码语言:javascript
复制
(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单元格。有关这方面的更多信息,请参见,例如:

还值得注意的是,许多通用Lisp函数都对序列进行操作,而不仅仅是在列表上操作。序列包括向量,其中字符串是子类型。例如,(反向"word")将返回"drow"。类似地,您可以在序列上使用位置-if。这意味着一个简单的猪拉丁函数可以通过这样的方式来完成:

代码语言:javascript
复制
(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"
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32791443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档