向列表添加参数会导致错误

时间:2010-11-12 23:14:22

标签: scheme racket

我尝试了一个示例,我们需要将列表作为参数传递,如果条件成功,我想将结果添加到新列表中。

以下是代码:

(define get-description
  (lambda (codeValue newList)
    (cond
      ((= (car codeValue) 1) (cons "A" newlist))
      ((= (car codeValue) 2)(cons "B" newlist))      
      ((= (car codeValue) 3) "C")
      (else "Negative numbers are not valid"))))

我将其作为函数调用传递:

(get-description (list 1 2 3) (list))

我得到输出:

(cons "A" empty)

输出应该只显示:(A)

我正在使用DrRacket编写我的程序,并选择语言模式为:Beginning Student。

为什么我的cons中的A""获得了emptynewlist

2 个答案:

答案 0 :(得分:2)

请不要在Racket中使用“Beginning Student”作为语言类型。这是专门为HtDP书制作的子集。语言“racket”,“r5rs”,“相当大”,更像是真正的方案,应该都适用于The Little Schemer。

在你的参数列表中,你有(codeValue newList ),但在程序正文中你引用了 newlist 。我使用的所有方案都是区分大小写的。将您的newList更改为newlist会使您的计划在Chez Scheme和Guile上运行得非常好。

修改:为了澄清,"A"字符串。 Scheme还有 symbol 的附加数据类型,它只是一个名称而没有其他内容(可能就是你想要的)。如果您期望(cons 'A newlist),则可能需要(cons "A" newlist)而不是(A)

答案 1 :(得分:-1)

其他方案只打印("A")。这样的输出显然是Racket语言的特质。

至于为什么A在引号中,那是因为它是一个字符串对象,而这就是字符串对象的打印方式。但是如果你要显示这样一个对象,你就会得到A的寂寞。