Lisp 我可以使用这个功能吗;获得;有助理名单吗?

Lisp 我可以使用这个功能吗;获得;有助理名单吗?,lisp,common-lisp,Lisp,Common Lisp,我有以下代码: (setq months '((january 1) (february 2) ...)) 我可以使用get将此列表用作地图(带键和值)吗 比如: (get 'months 'january) 并得到结果:1 是否可以在Lisp中执行此操作而不显式设置如下属性: (setf (get 'months 'january) 1) (setf (get 'months 'february) 2) ... 如果这在通用Lisp中不可能,那么在Lisp的任何其他方言中也可能吗?您将其

我有以下代码:

(setq months '((january 1) (february 2) ...))
我可以使用
get
将此列表用作地图(带键和值)吗

比如:

(get 'months 'january)
并得到结果:1

是否可以在Lisp中执行此操作而不显式设置如下属性:

(setf (get 'months 'january) 1)
(setf (get 'months 'february) 2)
...
如果这在通用Lisp中不可能,那么在Lisp的任何其他方言中也可能吗?

您将其用作实现关联映射的数据结构。它具有O(n)复杂度(线性),因此对于大型贴图来说不是一个好的结构

CommonLisp有一个丰富的库,其中包含容器,请参见其。它们可能更相关。如果您认为a列表非常短(例如,使用公共Lisp函数),则仍然可以使用a列表。你也可以考虑…

你正在使用数据结构来实现关联映射。它具有O(n)复杂度(线性),因此对于大型贴图来说不是一个好的结构

CommonLisp有一个丰富的库,其中包含容器,请参见其。它们可能更相关。如果您认为a列表非常短(例如,使用公共Lisp函数),则仍然可以使用a列表。你也可以考虑……< P > >不。 获取符号指示器&可选默认值=>value

get在其属性为的符号的属性列表中查找属性 指示器与指示器相同,并返回其对应的 属性值。如果有多个具有该属性的属性 指示器,get使用第一个这样的属性。如果没有财产 使用该属性指示符,将返回默认值

A的定义如下:

财产清单。1.包含偶数个元素的列表 是交替的名称(有时称为指示符或键)和值 (有时称为属性)。当有多个名称和 属性列表中具有相同名称的值对,第一个 对确定属性。2.(指符号)符号的组成部分 包含属性列表的符号

您的数据采用以下格式:

协会名单。代表一个行业协会的行业列表 带值的钥匙,其中每个cons的汽车为钥匙,cdr为 与该键关联的值

因此,您可以使用访问其中的值。您可以使用属性列表,在这种情况下,如果不是符号的属性列表,则使用;如果是符号的属性列表,则使用
get
(如上所述)。以下是所有三种方法的示例

关联列表 财产清单 符号的属性列表(不常见) 其他方式 当然,您也可以使用散列映射,或者对于排序的数据,您可以找到元素的位置:

散列表 位置
CL-USER>(定义参数*月份序列*
#(1-2-3-4-5-6-7-8-9))
*月序列*
CL-USER>(1+(职位“四月*月份序列*))
4.
否。说明用法为

获取符号指示器&可选默认值=>value

get在其属性为的符号的属性列表中查找属性 指示器与指示器相同,并返回其对应的 属性值。如果有多个具有该属性的属性 指示器,get使用第一个这样的属性。如果没有财产 使用该属性指示符,将返回默认值

A的定义如下:

财产清单。1.包含偶数个元素的列表 是交替的名称(有时称为指示符或键)和值 (有时称为属性)。当有多个名称和 属性列表中具有相同名称的值对,第一个 对确定属性。2.(指符号)符号的组成部分 包含属性列表的符号

您的数据采用以下格式:

协会名单。代表一个行业协会的行业列表 带值的钥匙,其中每个cons的汽车为钥匙,cdr为 与该键关联的值

因此,您可以使用访问其中的值。您可以使用属性列表,在这种情况下,如果不是符号的属性列表,则使用;如果是符号的属性列表,则使用
get
(如上所述)。以下是所有三种方法的示例

关联列表 财产清单 符号的属性列表(不常见) 其他方式 当然,您也可以使用散列映射,或者对于排序的数据,您可以找到元素的位置:

散列表 位置
CL-USER>(定义参数*月份序列*
#(1-2-3-4-5-6-7-8-9))
*月序列*
CL-USER>(1+(职位“四月*月份序列*))
4.

我的问题是:是否有任何方法可以使用GET,如(GET'months'一月),从列表中获取我想要的结果?我的问题是:是否有任何方法可以使用GET,如(GET'months'一月),从列表中获取我想要的结果?为什么不使用
ASSOC
从ASSOC列表中访问元素?为什么要使用
GET
?这有什么好处?GET用于符号属性列表,而不是assoc列表。@RainerJoswig我是LISP的初学者。我不知道ASSOC。这是我一直在寻找的答案。谢谢如果你把你的评论作为答案,我会把它标记为被接受的答案。作为一个初学者没什么错。首先询问Emacs非常有帮助,有两种方式:(1)快速获得答案,(2)了解Emacs。它们之间的关联在于,当Emacs回答您时,它会使用自己的术语,帮助您下次甚至更好地询问它(或在这里)。向Emacs询问有关
assoc
的信息:
M-x apropos RET assoc RET
。或者尝试
M-x apropos RET关联列表RET
。(尝试
C-hc apropos选项卡
查看其他apropos命令的列表。)为什么不使用
ASSOC
从ASSOC列表访问元素?为什么是我们
CL-USER> (defparameter *months-alist*
           '((january . 1)
             (february . 2)
             (march . 3)))


*MONTHS-ALIST*
CL-USER> (cdr (assoc 'february *months-alist*))
2
CL-USER> (defparameter *months-plist*
           '(january 1 february 2 march 3))
*MONTHS-PLIST*
CL-USER> (getf *months-plist* 'march)
3
CL-USER> (setf (get '*months* 'january) 1
               (get '*months* 'february) 2
               (get '*months* 'march) 3)
3
CL-USER> (get '*months* 'january)
1
CL-USER> (defparameter *months-hash* (make-hash-table :test 'eq))
*MONTHS-HASH*
CL-USER> (setf (gethash 'january *months-hash*) 1
               (gethash 'february *months-hash*) 2
               (gethash 'march *months-hash*) 3)
3
CL-USER> (gethash 'february *months-hash*)
2 ; the value
T ; it was present in the table