Javascript 需要帮助理解这个lisp函数吗

Javascript 需要帮助理解这个lisp函数吗,javascript,c#,Javascript,C#,我无法理解此函数中的返回线 我正在用C#创建一个解析器,并找到了这个用Javascript编写的教程()。我无法理解函数的返回行 function is_punc(ch) { var tok = input.peek(); return tok && tok.type == "punc" && (!ch || tok.value == ch) && tok; } 我相信如果:tok不为null,其类型为punc和(char ch不

我无法理解此函数中的返回线

我正在用C#创建一个解析器,并找到了这个用Javascript编写的教程()。我无法理解函数的返回行

function is_punc(ch) {
    var tok = input.peek();
    return tok && tok.type == "punc" && (!ch || tok.value == ch) && tok;
}
我相信如果:tok不为null,其类型为punc和(char ch不为null或tok的值等于ch),并且tok不为null,则返回true


如果我读对了,为什么他要两次计算tok不为null。

这在本文中没有意义,但JavaScript中的逻辑运算符与Python和Lisp中的逻辑运算符类似(在这个问题中,与Lisp的唯一连接)

也就是说,
a和&b
如果是“false-y”,则返回
a
,否则返回
b

类似地,
a | | b
如果是“truth-y”,则返回
a
,否则返回
b

示例(来自我的Firefox控制台):

“&&23 < "" > 0 && 23 < 0 > 1 && 23 < 23 >1&&“你好” <“你好” >“你好”| |“世界” <“你好” >0 | |“世界” <“世界”
这意味着,如果所有其他条件都是真值y,则最终的
tok
使函数返回标记本身。

您可以使用超过
true/false
的值来表示布尔逻辑,一些语言利用此值从布尔运算符返回更多信息。例如,在JS控制台中,您可以编写以下内容:

> x = 10
10
> (x < 100) && x
10
>x=10
10
>(x<100)和&x
10
在布尔上下文中使用时,像10这样的整数属于真值集。因此,结果是10。 同样的情况也发生在Lisp中,
(或者(首先尝试这个)(可能是那个))
的计算结果是第一个正确的表达式


在您的情况下,最后一个术语是函数返回令牌所必需的。

您显示的代码不是lisp。。。它似乎是JS。我也找不到你在链接中显示的功能。在页面底部附近有一个标记为“显示代码”的按钮。你的权利是Javascript,你是对的
tok
无需检查两次。您的评估在我看来是正确的:最终的
和&tok
没有任何作用
> x = 10
10
> (x < 100) && x
10