需要帮助来了解此Lisp功能

时间:2019-06-01 09:08:30

标签: javascript c#

我在理解此功能中的返回线时遇到麻烦。

我正在用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。

2 个答案:

答案 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的表达式。

在您的情况下,函数必须返回最后一项才能返回令牌。