是否可以制作正则表达式来确定函数的返回类型?

gue*_*314 2 javascript regex

鉴于以下功能的文字:

function f3() {
  return Math.random() > 0.5 ? Promise.resolve(true): 'naaah'
}
Run Code Online (Sandbox Code Playgroud)

是否可以编译正则表达式来确定f3()调用的返回类型,而不实际调用该函数?

Del*_*oth 11

给定代码,我们无法通过正则表达式确定此返回类型.矛盾证明:

  1. 假设我们可以使用正则表达式找到返回类型.

  2. 返回类型在最后一行中通过非确定性调用决定random(事先不知道).

  3. 正则表达式是确定性的 - 当在相同的输入上运行时,它们总是具有相同的输出.

  4. 因此,函数的返回类型必须是静态的,因为我们可以运行正则表达式并找到返回类型(并且该正则表达式将始终返回相同的内容).

  5. 矛盾:函数的返回类型必须是静态的,但函数的返回类型是可变的 random

注意:以上假设类型必须是单一类型,并且不会单独考虑Union类型.

另外,证明我们为什么总是不能这样做.

  1. 假设我们可以某种方式找出函数中使用的每种类型.

  2. 在某些时候,我们生成一个字符串 a="A"+Math.random()

  3. 稍后,我们生成一个字符串 b="class "+a+"{...}

  4. 在这个定义之后,我们执行c= eval("new "+a+"()").

  5. 当我们返回时c,没有正则表达式可以知道类型 - 函数中新命名的类型,随机确定并且对于每次执行都是不同的.

这假设问题是更一般的"可以javascript正则表达式找到泛型函数的返回类型." 请注意,如果可以找到返回类型,则可以告诉程序暂停(如果它没有停止则无法返回,如果它永远不会停止则返回类型必须是未定义的),停止问题仍未解决.


Hay*_*iff 6

不,只能使用RegEx以编程方式确定该函数的返回类型.为了理解该函数的作用,您需要解析其代码.但是,JavaScript是Chomsky Type 2语法(无上下文语法),RegEx是Chomsky Type 3语法(常规语法).从根本上说,使用RegEx解析JavaScript太复杂了.

如果您只是试图处理将函数作为文本并且需要对其进行求值的事实,则可以使用eval()函数.

  • 呃,但我认为你不能始终如一地将"常规语法"应用于正则表达式的语言实现.有很多功能被填充到语言正则表达式框架中(例如,外观),这些功能在理论正则表达式中没有定义. (2认同)