为什么(列表'引用1)评估为' 1而不是1?

时间:2018-04-29 03:32:06

标签: lisp

我需要对<ul class="navbar-nav ml-auto"> <!-- Authentication Links --> @guest <li><a class="nav-link" href="{{ route('login') }}">{{ __('Login') }}</a></li> @else <li class="nav-item dropdown"> <a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre> {{ Auth::user()->name }} <span class="caret"></span> </a> <div class="dropdown-menu" aria-labelledby="navbarDropdown"> <a class="dropdown-item" href="{{ route('logout') }}" onclick="event.preventDefault(); document.getElementById('logout-form').submit();"> {{ __('Logout') }} </a> <form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;"> @csrf </form> </div> </li> @endguest </ul> list的综合运用有所启发。

以下是我看到的内容:

quote

足够公平。 [1]> (list '1) (1) 变为(list '1),其评估为"('1)",因为(1)只会返回其后的内容。

'

为什么不[2]> (list 'quote 1) '1 ,为什么1在这里没有评估,因为:

'

作为一般性问题,我错了,评估过程会尝试解决递归发现的所有问题吗?

2 个答案:

答案 0 :(得分:3)

由于list应该构造一个参数列表,如果它返回一个数字就很奇怪了。实际上,'1是一个两元素列表,其中包含符号quote和数字1:

CL-USER> (first (list 'quote 1))
QUOTE
CL-USER> (second (list 'quote 1))
1

它显示为'1而不是(QUOTE 1)的原因是因为您的Lisp系统打印了特别以quote开头的单元素列表。

  

(list '1)变为"('1)",评估为(1)

这不正确。由于list是普通函数,因此对其参数形式进行求值以给出每个参数的值。在这种情况下,表单'1将被评估为值1list将作为其单个参数接收。没有评估返回值。

答案 1 :(得分:2)

注意,我在这里假设Common Lisp。

首先是几个定义/注释

  • 类似(list 1)的内容称为表单表单是一个要评估的Lisp对象。
  • 由于它是一个列表,因此称为复合形式
  • 由于复合形式的第一个元素是list,它代表一个函数,因此它被称为函数形式
  • 函数表单的第一个元素是函数,其余元素是参数

打印报价表

'foo(quote foo)相同,因为 quote 字符是 reader宏,它会转换'foo形式在阅读时间(quote foo)

但它是如何打印的?可以取决于变量*print-pretty*的值。如果此变量的值为T,则打印机使用漂亮的打印机

* *print-pretty*

T
* '(quote 1)

'1

但是当我们不使用漂亮的打印机打印结果值时:

* (setf *print-pretty* nil)

NIL
* '(quote 1)

(QUOTE 1)

因此,Lisp可以以不同的方式打印相同的内容,具体取决于其配置。

评估功能表格

当评估函数形式时,我们已经知道第一个元素是一个函数,其余元素是参数。

因此在(list '1)我们看到:

  • list是函数
  • '1是唯一的参数

现在每个参数都被评估为值:

  • '1评估为1,因为quote 运算符只返回包含的对象。因此结果值为1

由于评估了所有参数,我们可以使用参数值list调用1

然后返回(1),因为list返回所有提供的参数值的列表。

第二个例子

现在让我们看看第二个例子:(list 'quote 1)

我们再次使用函数list的函数表单。但现在我们有两个参数'quote1

我们需要从左到右评估每个参数。

'quote评估为符号quote

1评估为1,因为数字与大多数对象一样是自我评估的(例外是符号和列表)。

因此,我们使用参数值listquote调用函数1

List列出其参数值。因此结果是(quote 1)

现在请记住:(quote 1)'1)相同。因此,打印机可以打印后一种变体。

因此我们有一个列表作为结果,可以打印为(quote 1)'1。但这没有区别:

CL-USER 7 > (equal (quote (quote 1)) ''1)
T

评估一次

  

作为一般性问题,我错误的是评估过程会尝试解决递归发现的所有问题吗?

不再评估表单的结果。评估只进行一次:评估表格本身。