我需要对<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
在这里没有评估,因为:
'
作为一般性问题,我错了,评估过程会尝试解决递归发现的所有问题吗?
答案 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
将被评估为值1
,list
将作为其单个参数接收。没有评估返回值。
答案 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
的函数表单。但现在我们有两个参数'quote
和1
。
我们需要从左到右评估每个参数。
'quote
评估为符号quote
。
1
评估为1
,因为数字与大多数对象一样是自我评估的(例外是符号和列表)。
因此,我们使用参数值list
和quote
调用函数1
。
List列出其参数值。因此结果是(quote 1)
。
现在请记住:(quote 1)
与'1)
相同。因此,打印机可以打印后一种变体。
因此我们有一个列表作为结果,可以打印为(quote 1)
或'1
。但这没有区别:
CL-USER 7 > (equal (quote (quote 1)) ''1)
T
评估一次
作为一般性问题,我错误的是评估过程会尝试解决递归发现的所有问题吗?
不再评估表单的结果。评估只进行一次:评估表格本身。