我需要在列表末尾附加一个新项目。这是我试过的:
(define my-list (list '1 2 3 4))
(let ((new-list (append my-list (list 5)))))
new-list
我希望看到:
(1 2 3 4 5)
但我收到了:
让:(let((new-list(append my-list(list 5))))中的语法错误(缺少绑定pair5s或body)
答案 0 :(得分:1)
你的问题主要是语法性的。 Scheme中的let
表达式的格式为(let (binding pairs) body)
。在您的示例代码中,虽然您确实有一个应该有效的绑定,但您没有正文。要使其正常工作,您需要将其更改为
(let ((new-list (append my-list (list 5))))
new-list)
在我的DrRacket 6.3中,这会评估您的期望:'(1 2 3 4 5)
。
答案 1 :(得分:0)
let
生成一个在let
表单的持续时间内存在的局部变量。因此
(let ((new-list (append my-list '(5))))
(display new-list) ; prints the new list
) ; ends the let, new-list no longer exist
new-list ; error since new-list is not bound
您的错误消息告诉您let
正文中没有表达要求。因为我在我的代码中添加了一个它是允许的。但是,现在您在尝试评估new-list
时收到错误,因为它不在let
表单之外。
这是Algol等价物(特别是在JS中)
const myList = [1,2,3,4];
{ // this makes a new scope
const newList = myList.concat([5]);
// at the end of the scope newList stops existing
}
newList;
// throws RefereceError since newList doesn't exist outside the block it was created.
由于您已尝试使用define
,您可以改为使用它,它将在全局或函数范围内创建变量:
(define my-list '(1 2 3 4))
(define new-list (append my-list (list 5)))
new-list ; ==> (1 2 3 4 5)