首页 > 其他分享 >无涯教程-LISP - 集合(Set)

无涯教程-LISP - 集合(Set)

时间:2024-01-14 11:02:22浏览次数:35  
标签:Set terpri LISP myset 无涯 列表 write key test

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

相关文章

  • 无涯教程-LISP - 数字(Numbers)
    CommonLisp number数据类型包括LISP支持的各种数字。LISP支持的数字类型是-IntegerRatiosFloatComplex下图显示了LISP中可用的数字层次结构和各种数字数据类型-数字类型下表描述了LISP中可用的各种数字类型数据-Sr.No.Datatype&描述1fixnum此数据类型表示......
  • 无涯教程-LISP - 函数声明
    函数是一起执行任务的一组语句。定义函数名为defun的宏用于定义函数,defun宏需要三个参数-函数名称函数参数函数主体defun的语法是-(defunname(parameter-list)"Optionaldocumentationstring."body)让我们用简单的示例来说明这个概念。函数-示例1让我们编写......
  • 无涯教程-LISP - 循环语句
    在某些情况下,您需要执行一段代码次数,循环语句使我们可以多次执行一个语句或一组语句,以下是大多数编程语言中循环语句的一般形式。LISP提供以下类型的构造来处理循环需求。单击以下链接以查看其详细信息。Sr.No.Construct&描述1loop以最简单的形式,它允许您重复执行某些语......
  • 无涯教程-LISP - 条件判断
    以下是大多数编程语言中常见的典型决策结构的一般形式-LISP提供以下类型的决策构造,单击以下链接以查看其详细信息。Sr.No.Construct&描述1cond此构造用于检查多个判断操作子句。2ifif构造具有多种形式。3when如果test子句的判断输出为true,则执行test操作,否则,对后......
  • 无涯教程-LISP - 运算符
    运算符是一个符号,告诉编译器执行特定的数学或逻辑操作。LISP允许对数据进行大量操作,并由各种函数,宏和其他构造支持。允许对数据进行的操作可以归类为-算术运算比较操作逻辑运算按位运行算术运算下表显示了LISP支持的所有算术运算符。假设变量A=10,变量B=20,然后-运算符......
  • 无涯教程-LISP - 常量声明
    在LISP中,常量是在程序执行期间永不更改其值的变量,常量使用defconstant构造进行声明。以下示例显示了声明全局常量PI并随后在名为area-circle的函数中使用此值来计算圆的面积的情况。defun构造用于定义一个函数,我们将在Function一章中对其进行研究。创建一个名为main.l......
  • 无涯教程-LISP - 宏(Macros)
    宏允许您扩展标准LISP的语法。定义宏在LISP中,使用另一个名为defmacro的宏定义了一个命名宏,定义宏的语法为-(defmacromacro-name(parameter-list))"Optionaldocumentationstring."body-form宏定义由宏的名称,参数列表,可选的文档字符串和Lisp表达式主体组成。让我们编写......
  • 无涯教程-LISP - 环境变量
    Lisp执行器CLISP是用于在Windows中设置LISP的GNU通用LISP多体系结构编译器,Windows版本使用Windows下的MingW模拟Unix环境,安装程序会处理此问题,并自动将clisp添加到WindowsPATH变量。您可以从此处获取最新的WindowsCLISP-https://sourceforge.net/projects/clisp/files/late......
  • Controller(StatefulSet)-部署有状态应用,部署守护进程,一次任务和定时任务
    Controller(StatefulSet)-部署有状态应用在Kubernetes中,StatefulSet是一种用于部署有状态应用的控制器。与无状态应用不同,有状态应用需要保持持久性和可识别的网络标识。在有状态应用中,每个Pod都有一个唯一的标识符,并且Pod的创建和删除顺序是有序的。在StatefulSet中创建的Pod具有以......
  • 无涯教程-LISP - 简介
    Lisp(历史上拼写为LISP)是具有悠久历史的计算机编程语言家族,有独特和完全括号的前缀符号表示法。起源于公元1958年,是现今第二悠久而仍广泛使用的高端编程语言。只有FORTRAN编程语言比它更早一年。Lisp编程语族已经演变出许多种方言。现代最著名的通用编程语种是Clojure、CommonLis......