我在理解此功能中的返回线时遇到麻烦。
我正在用C#创建一个解析器,并找到了用Java脚本编写的本教程(http://lisperator.net/pltut/parser/the-parser)。我不明白该函数的返回行
function is_punc(ch) {
var tok = input.peek();
return tok && tok.type == "punc" && (!ch || tok.value == ch) && tok;
}
我相信,如果:tok不为null并且其类型为punc AND(字符ch不为null或tok的值等于ch)并且tok不为null,则它将返回true。
如果我没看错,为什么他两次评估tok不为null。
答案 0 :(得分:1)
在这种情况下这没有意义,但是JavaScript中的逻辑运算符的工作方式类似于Python和Lisp(此问题中与Lisp的唯一连接)。
也就是说,如果a && b
为“ false-y”,则返回a
,否则返回b
。
同样,如果a || b
为“真”,则返回a
,否则返回b
。
示例(在我的Firefox控制台中):
> "" && 23
< ""
> 0 && 23
< 0
> 1 && 23
< 23
> 1 && "hello"
< "hello"
> "hello" || "world"
< "hello"
> 0 || "world"
< "world"
这意味着如果所有其他条件均为真,则最后一个tok
使函数返回令牌本身。
答案 1 :(得分:0)
您可以使用多于true/false
来表示布尔逻辑,并且某些语言利用该逻辑从布尔运算符返回更多信息。例如,在JS控制台中,您可以编写以下代码:
> x = 10
10
> (x < 100) && x
10
在布尔上下文中使用时,像10这样的整数属于 True 值的集合。结果是10。
在Lisp中也是如此,其中(or (try-first-this) (maybe-that))
的值等于第一个为true的表达式。
在您的情况下,函数必须返回最后一项才能返回令牌。