3

我是 LISP 的新手,这是我对它的全局变量的疑问。

我想做的是创建一个“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 的问题:
有没有办法通过键查找列表中的元素?
例如,对于上面的列表,如何使用 keyapple找到其对应的 value fruit

谢谢你

4

2 回答 2

4

该函数acons没有副作用,即不修改*x*.

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

(setq *x* (acons 'apple 'fruit *x*))
于 2012-10-22T03:12:27.430 回答
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。它不被存储。

(defun compute-price-sums (data sums)
  (if (null data)
      sums
    (compute-price-sums (rest (rest data))
                        (note-category-price (first data)
                                             (second data)
                                             sums))))

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

例子:

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))
于 2012-10-22T14:37:11.603 回答