Functional programming LISP全局变量

Functional programming LISP全局变量,functional-programming,lisp,common-lisp,Functional Programming,Lisp,Common Lisp,我是LISP新手,下面是关于它的全局变量的问题 我想做的是创建一个可以在结构中存储键值对的“列表”。以下是我的示例代码: (setq *x* '()) (acons 'apple 'fruit *x*) *x* (first *x*) 我希望我的输出看起来像,在我添加(apple.fruit)对之后,x应该是((apple.fruit)),但下面是我得到的(加载上述代码时): CL-USER> 无 ((苹果、水果)) NIL该函数没有副作用,即它不会修改*x* 您必须setq结果才能获得

我是LISP新手,下面是关于它的全局变量的问题

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

(setq *x* '())

(acons 'apple 'fruit *x*)

*x*

(first *x*)
我希望我的输出看起来像,在我添加
(apple.fruit)
对之后,
x
应该是
((apple.fruit))
,但下面是我得到的(加载上述代码时):

CL-USER>
无
((苹果、水果))
NIL该函数没有副作用,即它不会修改
*x*

您必须
setq
结果才能获得
acons
的结果,才能坚持
*x*

(setq *x* (acons 'apple 'fruit *x*))
如果你想做函数式编程,那么可变的全局变量肯定不是一个好办法

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

通常,解决方案是递归的

比如说,我们有一个水果及其价格的清单,我们希望每个水果类别有一个价格总和。让我们使用
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))

对于检索,可以使用
assoc
(cdr(assoc'apple*x*)===>水果
。欢迎使用StackOverflow!当人们发布有用的答案时,您应该单击该答案的复选标记,选择最有用的答案作为“已接受”答案。
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))