List 将新项追加到方案中列表的末尾

List 将新项追加到方案中列表的末尾,list,scheme,let,List,Scheme,Let,我需要在列表的末尾添加一个新项目。以下是我尝试过的: (define my-list (list '1 2 3 4)) (let ((new-list (append my-list (list 5))))) new-list 我希望看到: (1 2 3 4 5) 但我收到: let:let((新列表(附加我的列表(列表5 '))))中的错误语法(缺少绑定pair5或body) 你的问题主要是句法性质的。Scheme中的let表达式的形式为(let(绑定对)体)。在您的示例代码中,虽然您有一

我需要在列表的末尾添加一个新项目。以下是我尝试过的:

(define my-list (list '1 2 3 4))
(let ((new-list (append my-list (list 5)))))
new-list
我希望看到:

(1 2 3 4 5)
但我收到:

let:let((新列表(附加我的列表(列表5 '))))中的错误语法(缺少绑定pair5或body)


你的问题主要是句法性质的。Scheme中的
let
表达式的形式为
(let(绑定对)体)
。在您的示例代码中,虽然您有一个应该可以工作的绑定,但您没有主体。要使其工作,您需要将其更改为

(let ((new-list (append my-list (list 5))))
    new-list)

在我的DrRacket 6.3中,它的计算结果与您所期望的一样:
(1 2 3 4 5)
A
let
生成一个局部变量,该变量在
let
表单期间存在。因此

(让((新列表(附加我的列表)(5)))
(显示新列表);打印新列表
) ; 结束let,新列表不再存在
新名单;错误,因为新列表未绑定
错误消息告诉您,
let
正文中没有表达式,这是一项要求。因为我在代码中添加了一个,所以它是允许的。但是,现在当您尝试评估
新列表时,会出现一个错误,因为它不存在于
let
表单之外

这里是Algol等价物(特别是JS)

constmylist=[1,2,3,4];
{//这将创建一个新的作用域
const newList=myList.concat([5]);
//在作用域的末尾,newList停止存在
}
新名单;
//抛出RefereceError,因为newList在创建它的块之外不存在。
由于您已经尝试使用
define
,您可以改为使用,它将在全局或函数范围内创建一个变量:

(定义我的列表’(1234))
(定义新列表(附加我的列表(列表5)))
新列表;==>(1 2 3 4 5)