相关疑难解决方法(0)

比函数(){return x}更简洁的延迟评估?

我正在移植一些很大程度上依赖于延迟评估的Python代码.这是通过thunks完成的.更具体地说,任何<expr>需要延迟评估的Python表达式都包含在Python"lambda表达式"中,即lambda:<expr>.

AFAIK,最接近的JavaScript等价物function(){return <expr>}.

由于我正在使用的代码绝对充斥着这样的thunk,我想让它们的代码更加简洁,如果可能的话.这样做的原因不仅在于保存字符(当涉及到JS时不可忽略的考虑因素),而且还使代码更具可读性.要了解我的意思,请比较此标准JavaScript表单:

function(){return fetchx()}
Run Code Online (Sandbox Code Playgroud)

\fetchx()
Run Code Online (Sandbox Code Playgroud)

在第一种形式中,实质性信息,即表达fetchx(),在印刷中被周围的function(){return...... 掩盖}.在第二种形式1中,只有一个(\)字符用作"延迟评估标记".我认为这是最佳方法2.

AFAICT,此问题的解决方案将分为以下几类:

  1. 使用eval模拟延迟评价.
  2. 一些我不了解的特殊JavaScript语法,它完成了我想要的.(我对JavaScript的无知使得这种可能性对我来说非常真实.)
  3. 在一些非标准的JavaScript中编写代码,以编程方式处理成正确的JavaScript.(当然,这种方法不会减少最终代码的占用空间,但至少可以在可读性方面保留一些增益.)
  4. 以上都不是.

我对听到最后三个类别的回答特别感兴趣.


PS:我知道使用eval(上面的选项1)在JS世界中被广泛弃用,但是,FWIW,下面我给出了这个选项的玩具插图.

我们的想法是定义一个私有包装类,其唯一目的是将纯字符串标记为用于延迟评估的JavaScript代码.然后使用具有短名称的工厂方法(例如C,用于"CODE")来减少例如,

function(){return fetchx()}
Run Code Online (Sandbox Code Playgroud)

C('fetchx()')
Run Code Online (Sandbox Code Playgroud)

首先,工厂C和辅助函数的定义maybe_eval:

var C = (function () {
  function _delayed_eval(code) { this.code = code; }
  _delayed_eval.prototype.val = function () { return eval(this.code) };
  return function (code) { …
Run Code Online (Sandbox Code Playgroud)

javascript lazy-evaluation thunk

3
推荐指数
1
解决办法
1120
查看次数

标签 统计

javascript ×1

lazy-evaluation ×1

thunk ×1