我可以使用关联列表中的"get"功能吗?

0 lisp common-lisp

我有以下代码:

(setq months '((january 1) (february 2) ...))
Run Code Online (Sandbox Code Playgroud)

get可以使用此列表作为地图(使用键和值)

喜欢:

(get 'months 'january)
Run Code Online (Sandbox Code Playgroud)

并得到结果:1

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

(setf (get 'months 'january) 1)
(setf (get 'months 'february) 2)
...
Run Code Online (Sandbox Code Playgroud)

如果在Common Lisp中这是不可能的,那么Lisp的任何其他方言都有可能吗?

Jos*_*lor 5

没有.说明get用法的文件

获取符号指示符和可选的默认值=>值

get在属性指示符与指标相同的符号的属性列表中查找属性,并返回其对应的属性值.如果有多个属性1具有该属性指示符,则get使用第一个此类属性.如果没有具有该属性指示符的属性,则返回default.

一个属性列表被定义为:

财产清单 1.包含偶数个元素的列表,这些元素是交替的名称(有时称为指示符或键)和值(有时称为属性).如果属性列表中存在多个具有相同名称的名称和值对,则第一个此类对确定该属性.2.(符号)包含属性列表的符号的组件.

您的数据采用关联列表的形式:

协会名单 表示键与值的关联的conses列表,其中每个cons的汽车是键,cdr是与该键相关联的值.

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

协会名单

CL-USER> (defparameter *months-alist*
           '((january . 1)
             (february . 2)
             (march . 3)))


*MONTHS-ALIST*
CL-USER> (cdr (assoc 'february *months-alist*))
2
Run Code Online (Sandbox Code Playgroud)

物业清单

CL-USER> (defparameter *months-plist*
           '(january 1 february 2 march 3))
*MONTHS-PLIST*
CL-USER> (getf *months-plist* 'march)
3
Run Code Online (Sandbox Code Playgroud)

符号的属性列表(不常见)

CL-USER> (setf (get '*months* 'january) 1
               (get '*months* 'february) 2
               (get '*months* 'march) 3)
3
CL-USER> (get '*months* 'january)
1
Run Code Online (Sandbox Code Playgroud)

其他方法

当然,您也可以使用哈希映射,或者在订购事物的数据的情况下,您可以找到元素的位置:

哈希表

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
Run Code Online (Sandbox Code Playgroud)

位置

CL-USER> (defparameter *months-sequence* 
           #(january february march april may june july august september))
*MONTHS-SEQUENCE*
CL-USER> (1+ (position 'april *months-sequence*))
4
Run Code Online (Sandbox Code Playgroud)