2012-10-22 118 views
2

我是LISP的新手,这里是我的全局变量问题。LISP global alist变量

我想要做的是创建一个可以在结构中存储键值对的“alist”。下面是我的示例代码:

(setq *x* '()) 

(acons 'apple 'fruit *x*) 

*x* 

(first *x*) 

我想我的输出看起来像,之后我加入(apple.fruit)对,x((apple.fruit)),但这里是我得到(在上面的代码加载)

CL-USER> 
NIL 
((APPLE . FRUIT)) 
NIL <--- this is still nil? 
NIL 

任何人都可以请帮我这个,因为我不知道为什么我不能为变量x增值。

另外,我还有一个关于alist的问题:
有没有一种方法可以通过键在列表中查找元素?
例如,对于上面的列表,我如何使用密钥apple找到它的对应值fruit

谢谢

+1

欢迎计算器!当人们发布有用的答案时,您应该通过点击该答案的复选标记来选择最有用的答案作为“已接受”答案。 – mbeckish

回答

4

功能acons没有副作用,即它不修改*x*

你必须setq结果得到acons的结果*x*坚持:

(setq *x* (acons 'apple 'fruit *x*)) 
+0

并且为了检索,可以使用'assoc':'(cdr(assoc'apple * x *)) ==> FRUIT'。 –

1

如果你想要做函数式编程,那么易变的全局变量是绝对不会很长的路要走。

函数式编程主要关注通过调用带参数的函数进行计算。

解决方案通常是递归的。

比方说,我们有一份水果及其价格清单,我们希望每种水果类别的价格总和。让我们尝试使用ACONS的递归解决方案。

(defun note-category-price (type price sums) 
    (let ((pair (assoc type sums))) 
    (if pair 
     (progn (incf (cdr pair) price) sums) 
     (acons type price sums)))) 

在上面的函数,你可以看到,函数直接返回调用ACONS的结果。它不存储。

在上面的函数中,扩展数据结构将用于递归调用。

例子:

CL-USER 22 > (compute-price-sums 
       '(apple 10 orange 20 banana 10 apple 20 
       grape 5 orange 75 apple 30 peach 30 
       orange 90 apple 20) 
       nil) 

((PEACH . 30) (GRAPE . 5) (BANANA . 10) (ORANGE . 185) (APPLE . 80))