- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试通过在 LISP 中使用以下代码添加到一个空列表来构造一个唯一的元素列表:
;;;MEMSET - return T if an atom is a top-level member of a set, else NIL
;;;This is needed for the makeset function
(DEFUN MEMSET (ATM L)
(COND ( ( NULL L) NIL )
( (EQL ATM(CAR L)) T )
( T (MEMSET ATM (CDR L)) )
)
)
(DEFUN MAKESET(SET1)
(DO ((UNIQ ()))
( (NULL SET1) UNIQ)
(COND ( (NOT (MEMSET (CAR SET1) UNIQ))
(CONS (CAR SET1) UNIQ)
)
)
(SETF SET1 (CDR SET1))
)
)
当我调用 (makeset '(a b b a c d b a)) 时,这个特定代码导致 NIL - 它应该导致 (a b c d),不考虑顺序) - 但在我看来它应该从 SET1 添加一个原子还没有在每次迭代中出现在 UNIQ 中。您不能添加到在 do 循环中声明的空列表中,还是我遇到了其他问题?顺便说一下,我正在使用 clisp。
最佳答案
<强>1。使用正确的格式
询问有关 Common-Lisp 的问题时,请使用正确的格式。例如,请参阅谷歌搜索返回的前三页 "common lisp formatting conventions" .
以下是应用于您的函数的常规范式示例:
;;; Memset - return T if an atom is a top-level member of a set, else NIL
;;; This is needed for the makeset function
(defun memset (atm l)
(cond ((null l) nil)
((eql atm (car l)) t)
(t (memset atm (cdr l)))))
(defun makeset (set1)
(do ((uniq ()))
((null set1) uniq)
(cond ((not (memset (car set1) uniq))
(push (car set1) uniq)))
(setf set1 (cdr set1))))
<强>2。尽可能使用原始函数
你的两个函数在 Common-Lisp 中都是原始的。
remove-duplicates
返回没有重复元素的列表,member
检查一个元素是否属于一个集合。
<强>3。你的函数中的错误
如果您仍然想使用您的函数,而不是 remove-duplicates
,这就是其中的问题。
如果你想修改一个列表,你应该使用一个修改某些东西的函数。 cons
函数构建一个新的对,但不不修改任何内容。因此,在您的表单 (cons (car set1) uniq)
中,您向 uniq
添加了一个新元素,因为您获得了一个新列表 (car set1)
作为第一个元素,unique
的元素作为列表的其余部分,但是这个新列表会立即被丢弃,因为它没有分配给任何东西。
您可以使用宏 setf
来更改它。以这种方式将新值分配给局部变量 uniq
:
(setf uniq (cons (car set1) uniq))
或者您可以通过使用宏 push
来编写等效的形式:
(push (car set1) uniq)
最后,请注意 makeset
函数中的 cond
可以替换为更简洁的 when
,从而产生此函数:
(defun makeset (set1)
(do ((uniq nil))
((null set1) uniq)
(when (not (memset (car set1) uniq))
(push (car set1) uniq))
(setf set1 (cdr set1))))
关于LISP:为什么我不能在空列表上使用 cons?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35977484/
我想在 Lisp 中创建以下列表。 ((lambda(x) (cons x x)) (cons'A 'B)) 创建这个列表,但是 ((lambda(x y) (cons x y)) (cons'A '
(免责声明 - 我知道 Seqs 在 Clojure 中的重要性) 在普通的 lisp 中,cons 函数可用于将两个符号组合成一个列表: (def s 'x) (def l 'y) (cons s
有什么区别: (cons 'a (cons 'b 'c)) ;; (A B . C) 和 (cons 'a '(b.c)) ;; (A B.C) 我需要使用 cons 创建以下列表 ((a.b).c)
我们可以写3 + 4或 (+) 3 4在 F# 中并获得相同的结果,这适用于大多数运算符。 为什么是 cons 运算符 ::表现不同?例如。如果我跑(::) 1 [2;3]我明白了error FS00
$dml = "insert into table ..."; mysql_query($dml,$con); 上面的插入一些东西到一个表中。然后你可以检查它是否成功 if('' == mysql_e
使用 cons 将元素组合到列表和使用 cons 将列表组合到 scheme 中的元素有什么区别? 此外,缺点究竟是如何工作的?它是将元素添加到列表的末尾还是开头? 谢谢! 最佳答案 原始 cons
在命令提示符下,您可以通过执行以下操作来创建内联文本文件: copy con file.txt Hello World ^Z 或者: type con > file.txt Hello World ^
我正在下载一系列 JSON 文件的 url 到列表列表中,稍后进行分析。 baseurl = 10000){ message("Retrieving page ", i)
我想通过打开一个进程并运行 plink 从 c# 打开 SSH 连接。应收集所有输出,并根据结果,程序将触发对 ssh 的操作。我的大问题是,我正在使用几个不同的脚本并且我需要(自动)用户交互。因此我
我得到了许多我解析的平面文件提要。其中一个提要有一个经常包含双引号的评论字段。 这没什么大不了的,除了文件是管道分隔的双引号合格文件之外!! 下面我概述了我得到的字符串。 0|0.9|""|"M"|"
我很困惑 Cons()函数确实如此,在 from 的函数定义中。 最佳答案 什么 Stream代表是lazy和潜在的无限列表。由于 SML 是 eager ,这需要以稍微迂回的方式完成。 我们先来看看
马丁·奥德斯基在他的书中写道: Class ::, pronounced “cons” for “construct,” represents non-empty lists. 和 The list
#lang racket 我需要从一个元素和一个列表创建一对 但是,当我执行 (cons 2 (list 1 2 3)) 时,我得到 (2 (1 2 3)),我想得到 ( 2 .(1 2 3))如何输
当我创建一个Java列表并且我希望头部是一个列表时,它应该打印[[-1,0],1,2,3,4]还是可以,它只保留子列表[-1 , 0] 作为两个独立的元素,例如 [-1, 0, 1, 2,3,4],以
我正在尝试使用 LINQ 按语句进行分组。我收到错误名称“con”在当前上下文中不存在。 在选择后的代码中,我试图获取 ActivityID 值,但列表“con”不可用。 List contribut
我想做的是让我的 html/php 代码在表格中显示来 self 的 MySQL 的数据。 它只连接到数据库,但我想我在以下位置遇到错误:$resultt=$con->query("SELECT Di
以下代码在 Green Hills C 编译器中导致错误(错误:type int * is incompatible with argument type const int*),而它仅产生警告并使用
我正在尝试通过在 LISP 中使用以下代码添加到一个空列表来构造一个唯一的元素列表: ;;;MEMSET - return T if an atom is a top-level member
嗯,最近开始学习lisp,在做一个小程序的时候发现了一点问题。问题是编写一个函数,如果名称还没有标题,则将其添加到名称中。我的代码是: (setf *man-names* '(carlos pablo
如何设置变量指向列表单元格? 我正在尝试编写一个宏来将列表中的所有值乘以一个值。这是我目前拥有的: (defmacro scale (areas scale) `(dotimes (n (list
我是一名优秀的程序员,十分优秀!