我有以下代码:
(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的任何其他方言都有可能吗?
获取符号指示符和可选的默认值=>值
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)
归档时间: |
|
查看次数: |
144 次 |
最近记录: |