adjoin 函数首先在给定列表中查找该元素(如果找到),然后返回原始列表,否则,它将创建一个新的cons单元格,其 car 作为元素,而 cdr 指向原始列表,并返回此新列表。
adjoin 函数还使用:key 和:test 关键字参数。
adjoin 函数不会修改原始列表,因此要更改列表本身,您必须将adjoin返回的值分配给原始列表,或者可以使用 pushnew 宏将一个元素添加到集合中。
Set集合 - 示例
创建一个名为main.lisp的新源代码文件,然后在其中键入以下代码。; creating myset as an empty list (defparameter *myset* ()) (adjoin 1 *myset*) (adjoin 2 *myset*) ; adjoin did not change the original set ;so it remains same (write *myset*) (terpri) (setf *myset* (adjoin 1 *myset*)) (setf *myset* (adjoin 2 *myset*)) ;now the original set is changed (write *myset*) (terpri) ;adding an existing value (pushnew 2 *myset*) ;no duplicate allowed (write *myset*) (terpri) ;pushing a new value (pushnew 3 *myset*) (write *myset*) (terpri)
当您执行代码时,它返回以下输出-
NIL (2 1) (2 1) (3 2 1)
函数的元素组使您可以检查元素是否为集合的元素,以下是这些函数的语法-
member item list &key :test :test-not :key member-if predicate list &key :key member-if-not predicate list &key :key
这些函数在给定列表中搜索满足测试要求的给定元素。如果找不到此类元素,则函数返回 nil。否则,返回以元素为第一个元素的列表尾部。
创建一个名为main.lisp的新源代码文件,然后在其中键入以下代码。
(write (member 'zara '(ayan abdul zara riyan nuha))) (terpri) (write (member-if #'evenp '(3 7 2 5/3 'a))) (terpri) (write (member-if-not #'numberp '(3 7 2 5/3 'a 'b 'c)))
当您执行代码时,它返回以下输出-
(ZARA RIYAN NUHA) (2 5/3 'A) ('A 'B 'C)
Set Union
以下是这些函数的语法-
union list1 list2 &key :test :test-not :key nunion list1 list2 &key :test :test-not :key
union - 函数采用两个列表,并返回一个新列表,其中包含两个列表中的任何一个元素。
nunion - 函数执行相同的操作,但可能会破坏参数列表。
创建一个名为main.lisp的新源代码文件,然后在其中键入以下代码。
(setq set1 (union '(a b c) '(c d e))) (setq set2 (union '(#(a b) #(5 6 7) #(f h)) '(#(5 6 7) #(a b) #(g h)) :test-not #'mismatch) ) (setq set3 (union '(#(a b) #(5 6 7) #(f h)) '(#(5 6 7) #(a b) #(g h))) ) (write set1) (terpri) (write set2) (terpri) (write set3)
当您执行代码时,它返回以下输出-
(A B C D E) (#(F H) #(5 6 7) #(A B) #(G H)) (#(A B) #(5 6 7) #(F H) #(5 6 7) #(A B) #(G H))
Set Intersection
以下是这些函数的语法-
intersection list1 list2 &key :test :test-not :key nintersection list1 list2 &key :test :test-not :key
这些函数接受两个列表,并返回一个新列表,其中包含两个参数列表中存在的所有元素。
创建一个名为main.lisp的新源代码文件,然后在其中键入以下代码。
(setq set1 (intersection '(a b c) '(c d e))) (setq set2 (intersection '(#(a b) #(5 6 7) #(f h)) '(#(5 6 7) #(a b) #(g h)) :test-not #'mismatch) ) (setq set3 (intersection '(#(a b) #(5 6 7) #(f h)) '(#(5 6 7) #(a b) #(g h))) ) (write set1) (terpri) (write set2) (terpri) (write set3)
当您执行代码时,它返回以下输出-
(C) (#(A B) #(5 6 7)) NIL
Set Difference
以下是这些函数的语法-
set-difference list1 list2 &key :test :test-not :key nset-difference list1 list2 &key :test :test-not :key
Set Difference 函数将返回第一个列表中未出现在第二个列表中的元素的列表。
创建一个名为main.lisp的新源代码文件,然后在其中键入以下代码。
(setq set1 (set-difference '(a b c) '(c d e))) (setq set2 (set-difference '(#(a b) #(5 6 7) #(f h)) '(#(5 6 7) #(a b) #(g h)) :test-not #'mismatch) ) (setq set3 (set-difference '(#(a b) #(5 6 7) #(f h)) '(#(5 6 7) #(a b) #(g h))) ) (write set1) (terpri) (write set2) (terpri) (write set3)
当您执行代码时,它返回以下输出-
(A B) (#(F H)) (#(A B) #(5 6 7) #(F H))
参考链接
https://www.learnfk.com/lisp/lisp-set.html
标签:Set,terpri,LISP,myset,无涯,列表,write,key,test From: https://blog.51cto.com/u_14033984/9239198