什么是JavaScript`_ | _`?
当我看到这个expression式时,我正在通过javascript解决问题,即将stringparsing为其组成名称,运算符和括号。
return accept(")") ? _|_ : e;
那是什么_|_
? 那是使用节点的_
function吗? 我查找了文档,但没有find任何。
当我尝试使用它时,会发生这种情况:
> 5 5 > true ? _|_ : 0 ReferenceError: _ is not defined at eval:1:1 at eval at n.<anonymous>
作为一个澄清,variables_
没有在代码中的任何地方定义。
这是在节点v8.1.3上运行,但也适用于Chrome本地浏览器JS。
这里是代码:
function tokenise(string) { const tokens = string.match( /[az]+|\(|\)|[!#$%&*+\-\/<=>@^_.,;]+/gi ) || []; const accept = s => s===tokens[0] && tokens.shift() ; const unaccept = s => s!==tokens[0] && tokens.shift() ; const singles = (e) => ( e = unaccept(")") ) ? [ e, ...brackets() ] : [] ; const brackets = (e) => accept("(") ? ( e = brackets(), accept(")") || _|_ , [ e, ...brackets() ] ) : singles() ; try { let e = brackets(); return accept(")") ? _|_ : e ; } catch(_) { return null; } }
_|_
在JavaScript中没有特殊含义,只是一个|
( 按位或 )与标识符_
两侧的expression式。
该代码检查调用accept
的结果,如果它真的,则返回|
的结果 操作; 如果不是,则返回e
的值。
那是使用节点的
_
function吗?
_
在节点代码中并不特殊。 在REPL(only)中,它是一个接收最近评估expression式的结果的variables; 细节在这里 。
作为一个澄清,variables
_
没有在代码中的任何地方定义。
这意味着如果accept(")")
返回一个真值,代码将抛出一个ReferenceError
因为_
是一个未声明的标识符。 如果这是作者的意图,那么就不需要|
但是在一个现在被删除的答案中,georg指出他们可能已经使用_|_
来表示底部 (“一种从未成功完成的计算”)的math概念,其符号为⊥
。 在任何情况下,作者似乎都使用它来在expression式上下文中强制执行exception(因为throw
是一个语句;尽pipe如此,有人可能会在expression式语境中允许它)。
它需要一个variables_
并使用按位或|
本身。
结果,你得到一个32位的整数。
除了这里已经详细解释的内容之外,你的代码是相当普通的JavaScript,没有什么特别的。
我用一种以上的编程语言编写过相似的代码,当使用语法冗长来生成类似于文字艺术(又称ASCII艺术)的假想的滑稽表情时,那些使代码看起来很奇怪的代码也是100%有效的代码。
你的代码示例提醒了那些愚蠢的笑话之一,就像有人引入了一个带有段落名称的函数一样。