Functional programming LISP全局变量
我是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结果才能获得
(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))