【问题标题】:Is it possible to define a new statement?是否可以定义一个新的语句?
【发布时间】:2014-08-12 04:40:25
【问题描述】:

我希望能够在 javascript 中定义一个语句。例如,我想定义 一个名为 file 的语句,其工作方式类似于一个类。

function file() {
 //code goes here
}

我希望将其用作声明,例如ifforreturn

file filename(filename,purpose) {
 //code goes here
}

我需要构建一个单独的编译器还是有可能? 如果有更好的表达方式,请更改标题。

【问题讨论】:

  • 不,你不能这样做。查看高阶函数,特别是函数装饰器。还可以查看 SweetJS。
  • 构建编译器毫无意义,因为 javascript 主要用于客户端,因此除非人们完全使用您的解决方案,否则制作不兼容的 js 代码将不起作用。但是,functions/objects can worklike classes
  • 所以简而言之,你可以做到somefile = new file();

标签: javascript syntax


【解决方案1】:

你想完成什么?

您可以使用Revealing Module Pattern

在 JavaScript 中模拟 一些 类结构

另外,我从未见过像您所描述的那样工作的类——通常您实例化一个类的对象,然后访问该对象的公共属性。这可以在 JavaScript 中完成('cept 对象是动态创建的)。例如:

// file 'class'
var file = function () {

  var a; // private variable

  function filename(name, purpose) {
    // code goes here 
  }

  // return public members
  return {
    filename: filename
  };
};

// An object created from your 'class' with the member function 'filename()'
var aFile = file();

然后使用. 运算符调用您的成员函数,如下所示:aFile.filename(name, purpose);

【讨论】:

    【解决方案2】:

    这将是编写一种基于 Javascript 的新语言,类似于 Coffeescript 等。例如,这些语言需要在提供给 Web 浏览器之前将 编译为 JS。

    看一下 Coffeescript -> JS 解释器来了解如何去做。郑重声明,我认为这不是一个好方法。

    最后我要指出,像 Scala 这样的语言具有非常好的 DSL 支持,这意味着在该语言中添加功能很容易。例如,即使是 Scala 中的 + 也是库代码,而不是本机代码。 (从技术上讲,从语言的角度来看可以这样写。)

    【讨论】:

    • Javascript 在技术上可以做 Scala 所做的事情。只有 javascript 中的函数语法更加冗长,所以我们最终会产生更多的噪音和更少的 DSL 外观。尽管如此,javascript 中有很多类似 DSL 的库,例如 jQuery 和 Promise(技术上不是库,而是设计模式)。每次有人在 javascript 中提出类似 DSL 的库时,整个范例都会发生变化:)
    • @slebetman 是的,但它们也有点糟糕,正是因为你的不是重量更轻的 DSL。在 Promise 链中,这种冗长真的很糟糕。因此,为什么 ecma 6 引入了 lambdas 等。此外,生成器/产量支持可以更好地实现异步。
    【解决方案3】:

    我希望能够在 javascript 中定义一个语句。

    我希望将其用作语句,例如 if、for、andreturn。

    ,您不能这样做,因为 Javascript 解析器无法解析。

    如果你真的想这样做,你唯一的选择是创建你自己的语言,并编写一个从你的新语言到 Javascript 的转换器,正如@djechlin 所指出的那样。

    【讨论】:

      【解决方案4】:

      我相信您想要的是实现控制结构而不是语句,因为您给出的示例ifforreturn 是控制结构。如果这就是你真正的意思,那么是的,你可以用函数而不是你描述的语法来做到这一点。

      在 javascript 中,函数是第一类对象。也就是说,它们可以分配给变量并作为参数传递给其他函数。例如,这是一个不使用内置控制结构的if 的实现(没有ifwhileswitch 等,也没有三元运算符):

      function IF (condition, callback) {
          [function(){}, callback][+!!condition]();
      }
      

      你可以用上面的函数代替if,但是语法有点不合常规:

      IF ( a == b, function(){
          console.log('hello');
      });
      

      但是,如果您编写 javascript 的时间足够长,那么上述语法就会很熟悉,并且您会遇到许多类似的控制结构,这些控制结构实现为函数,例如 [].forEach()setTimeout()

      所以,例如,如果你想实现一个控制结构来解析一个文件,你可以这样做:

      function parseFile (filename, callback) {
          // code to process filename
          callback(result);
      }
      

      甚至是这样的:

      function eachLine (filename, callback) {
          // code to process filename
          for (var i=0; i<file_content.length; i++) {
              callback(file_content[i]);
          }
      }
      

      你可以这样使用:

      eachLine("some_file.txt",function(line){
          if (line.match(/hello/)) {
              console.log('Found hello! This file is friendly.');
          }
      });
      

      【讨论】:

        【解决方案5】:

        如果你不需要参数,你可以这样做:

        Object.defineProperty(window, 'newcmd', {
          get: () => console.log("hello")
        })
        
        newcmd

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-05
          • 1970-01-01
          相关资源
          最近更新 更多