将新项目附加到方案列表的末尾

时间:2017-07-14 05:02:59

标签: 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((new-list(append my-list(list 5))))中的语法错误(缺少绑定pair5s或body)

2 个答案:

答案 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)