将值添加到方案

时间:2016-10-23 04:44:30

标签: scheme lisp

我正在试图做的事情如下:

我必须创建一个向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)))
    )
)

1 个答案:

答案 0 :(得分:0)

在Scheme中,大多数列表操作都是&#34;修改&#34;一个列表(例如: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是一种函数式编程语言,其功能与您习惯使用的方式不同。