我正在试图做的事情如下:
我必须创建一个向scheme中的字典添加值的函数 所以我将字典定义为列表,如下所示:
(define Dictionary '(("key 1" "value 1") ("key 2" "value")))
现在为添加值的函数:
首先,我检查元素是否为null,并且在尝试将其添加到列表之前元素具有键和值
(define (addElement element mylist)
(cond
((null? elemment) 'The_Element_Is_Null)
((null? (cdr element)) 'The_Element_is_singleTon)
(#t (cons element mylist))
)
)
尝试按照以下方式运行它:
(addElement '("key 3" "value 3") Dictionary)
和DrRacket执行打印以下内容的代码
(("key 3" "value 3") ("key 1" "value 1") ("key 2" "value"))
请注意,使用cons会显示该值,就好像它已添加到列表中但值不是,类似于其他可能打印类似于此内容的语言
int i = 1;
print("value = "+ i + 5);
程序应该打印
value = 6
但实际上变量的值是1,同样地,我的字典没有获得新值,执行此代码只是打印带有新元素的列表,但元素并没有真正添加到列表中
我试过的一个解决方案是使用方法集!尝试添加值,但我得到相同的结果
(define (addElement element mylist)
(cond
((null? elemment) 'The_Element_Is_Null)
((null? (cdr element)) 'The_Element_is_singleTon)
(#t (set! myList(cons element mylist)))
)
)
答案 0 :(得分:0)
在Scheme中,大多数列表操作都是"修改"一个列表(例如:cons
)不实际更新输入列表,而是创建一个新列表,并且您应该存储它或传递它。< / p>
如果您希望在程序退出后在程序中进行列表修改,则必须明确set!
修改后的列表 - 您的第二次尝试的目标是正确的方向,但您只需设置过程的参数,而不是原始列表。我提出两种选择:
; declare the list outside the procedure
(define Dictionary '())
; 1) either set! the list inside the procedure
(define (addElement element)
(cond
((null? element) 'The_Element_Is_Null)
((null? (cdr element)) 'The_Element_Is_Singleton)
(else (set! Dictionary (cons element Dictionary)))))
(addElement '("key 1" "value 1"))
; 2) or set! the list with the result of calling the procedure
(define (addElement element myList)
(cond
((null? element) 'The_Element_Is_Null)
((null? (cdr element)) 'The_Element_Is_Singleton)
(else (cons element myList))))
(set! Dictionary (addElement '("key 1" "value 1") Dictionary))
请注意,一般来说,使用set!
的这种程序编程风格是非常不鼓励的 - 您要做的是将修改列表的过程调用的结果传递给另一个过程(函数组合)或相同的过程(作为递归的一部分)并让它处理新的结果。请记住,Scheme是一种函数式编程语言,其功能与您习惯使用的方式不同。