【问题标题】:Cannot create a list with list in Lisp无法在 Lisp 中创建带有列表的列表
【发布时间】:2016-07-09 05:46:52
【问题描述】:

我正在尝试使用以下命令创建带有内部列表的列表,但它不起作用:

(list 1 2 3 (list a b c))

*** - SYSTEM::READ-EVAL-PRINT:变量 B 没有值

我不确定这里哪个是变量 B。

编辑:我重新启动了 clisp 并再次尝试。这次是变量A!

$ clisp 
  i i i i i i i       ooooo    o        ooooooo   ooooo   ooooo
  I I I I I I I      8     8   8           8     8     o  8    8
  I  \ `+' /  I      8         8           8     8        8    8
   \  `-+-'  /       8         8           8      ooooo   8oooo
    `-__|__-'        8         8           8           8  8
        |            8     o   8           8     o     8  8
  ------+------       ooooo    8oooooo  ooo8ooo   ooooo   8

Welcome to GNU CLISP 2.49 (2010-07-07) <http://clisp.cons.org/>

Copyright (c) Bruno Haible, Michael Stoll 1992, 1993
Copyright (c) Bruno Haible, Marcus Daniels 1994-1997
Copyright (c) Bruno Haible, Pierpaolo Bernardi, Sam Steingold 1998
Copyright (c) Bruno Haible, Sam Steingold 1999-2000
Copyright (c) Sam Steingold, Bruno Haible 2001-2010

Type :h and hit Enter for context help.

[1]> (list 1 2 3 (list a b c))

*** - SYSTEM::READ-EVAL-PRINT: variable A has no value
The following restarts are available:

我尝试设置变量 a、b、c 的值,但仍然不起作用。

[5]> (let ((a 1)(b 2)(c 3)))
NIL
[6]> (list 1 2 3 (list a b c))

*** - SYSTEM::READ-EVAL-PRINT: variable A has no value
The following restarts are available:
USE-VALUE      :R1      Input a value to be used instead of A.
STORE-VALUE    :R2      Input a new value for A.
ABORT          :R3      Abort main loop
Break 1 [7]> 

【问题讨论】:

  • 你为什么不像我之前提议的那样做一个 Lisp 介绍,而不是随机试验?
  • 调试此类奇怪事物的技巧:先尝试更简单的事物。如果(list 1 2 3 (list a b c)) 给您带来问题 - 请先尝试(list 1 2 3)(list a b c)。如果更简单的东西起作用,那么就建立复杂的表达式。如果您设置变量的操作似乎不起作用,请了解有关设置变量的更多信息(因为它似乎不起作用)...

标签: lisp common-lisp


【解决方案1】:

您需要先分配变量,然后才能使用它们。

(defvar a 10)
(defvar b 20)
(defvar c 30)
(list 1 2 3 (list a b c))

这应该返回:

(1 2 3 (10 20 30))

当您使用LET 时,它会创建本地 变量,它们的作用域就是LET 的主体。

(let ((a 1) (b 2) (c 3))
  (list 1 2 3 (list a b c)))
=> (1 2 3 (1 2 3))

【讨论】:

  • 实际上我只使用了这个命令并且它不起作用 - 请参阅上面我编辑的问题。我也尝试过更改括号并错误地将其发布在这里。
  • 你设置变量abc了吗?
  • 没有。一定是这个原因。
  • LET 用于创建局部变量,而不是全局变量。
  • 我现在已经掌握了大部分内容。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多