小编Aad*_*hah的帖子

是否有可能在JavaScript中实现动态范围而无需使用eval?

JavaScript具有词法作用域,这意味着从函数内访问的非局部变量将被解析为定义时该函数的父项范围内存在的变量.这与动态范围形成对比,在动态范围中,从函数内访问的非局部变量在被调用时被解析为该函数的调用范围中存在的变量.

x=1
function g () { echo $x ; x=2 ; }
function f () { local x=3 ; g ; }
f # does this print 1, or 3?
echo $x # does this print 1, or 2?
Run Code Online (Sandbox Code Playgroud)

上面的程序以词法范围的语言打印1然后打印2,并以动态范围的语言打印3然后打印1.由于JavaScript是词法范围的,它将打印1然后2,如下所示:

var print = x => console.log(x);

var x = 1;

function g() {
    print(x);
    x = 2;
}

function f() {
    var x = 3;
    g();
}

f();           // prints 1

print(x);      // prints 2
Run Code Online (Sandbox Code Playgroud)

虽然JavaScript不支持动态范围,但我们可以使用eval以下方法实现它:

javascript eval dynamic-scope

26
推荐指数
2
解决办法
6586
查看次数

为什么JavaScript中的逻辑运算符是关联的?

逻辑AND和OR运算是在JavaScript中只有懒运营三元一起条件运算符.他们使用以下规则进行短路评估测试:

false && anything === false
true || anything === true
Run Code Online (Sandbox Code Playgroud)

这与在Haskell中实现的方式相同:

(&&) :: Bool -> Bool -> Bool
False && _ = False
True  && x = x

(||) :: Bool -> Bool -> Bool
True  || _ = True
False || x = x
Run Code Online (Sandbox Code Playgroud)

但是根据MDN,JavaScript中的逻辑运算符是左关联的.这是违反直觉的.在我的拙见中,他们应该是正确的联想.Haskell做对了.Haskell中的逻辑运算符是正确的关联:

infixr 3 &&
infixr 2 ||
Run Code Online (Sandbox Code Playgroud)

考虑Haskell中的以下表达式:

False && True && True && True
Run Code Online (Sandbox Code Playgroud)

因为&&在Haskell中是正确关联的,所以上面的表达式相当于:

False && (True && (True && True))
Run Code Online (Sandbox Code Playgroud)

因此,表达式 …

javascript haskell logical-operators associativity ecmascript-5

25
推荐指数
2
解决办法
1684
查看次数

如何读取node.js中的整个文本流?

在RingoJS中有一个叫做的函数read,它允许你读取整个流,直到到达终点.这在您创建命令行应用程序时很有用.例如,您可以编写如下tac 程序:

#!/usr/bin/env ringo

var string = system.stdin.read(); // read the entire input stream
var lines = string.split("\n");   // split the lines

lines.reverse();                  // reverse the lines

var reversed = lines.join("\n");  // join the reversed lines
system.stdout.write(reversed);    // write the reversed lines
Run Code Online (Sandbox Code Playgroud)

这允许您启动shell并运行tac命令.然后根据需要输入任意数量的行,完成后可以按Ctrl+ D(或Windows上的Ctrl+ Z)表示传输结束.

我想在node.js中做同样的事情,但我找不到任何会这样做的函数.我想用的readSync 功能,fs图书馆到模拟如下,但无济于事:

fs.readSync(0, buffer, 0, buffer.length, null);
Run Code Online (Sandbox Code Playgroud)

对标准输入文件描述符(第一个参数)是0.所以它应该从键盘读取数据.相反,它给了我以下错误:

Error: ESPIPE, invalid seek …
Run Code Online (Sandbox Code Playgroud)

javascript stdin stream node.js ringojs

22
推荐指数
4
解决办法
2万
查看次数

在一个函数中返回两个变量

请考虑以下代码(演示):

function test(){
   var h = 'Hello';
   var w = 'World';
   return (h, w);

}

var test = test();

alert(test);
Run Code Online (Sandbox Code Playgroud)

执行时,该函数test仅返回第二个值(即'World').如何让它返回多个值?

javascript function

20
推荐指数
3
解决办法
9万
查看次数

Haskell中Futamura预测的证明

我读了Dan Piponi关于Futamura 医生的三个预测的优秀博客文章.在文章的最后,他有一个附录,其中包含了Haskell中Futamura投影的证明.但是,我发现他的文章缺乏有关所涉及语言的信息.为了使Futamura预测有效,专业化师的源语言,目标语言和对象语言必须具备哪些内容?例如,如果我在Haskell中将Haskell写入LLVM专用器,那么Futamura投影会起作用吗?如果您编写一个Haskell程序来证明这一点就像Dan Piponi在他的文章中所做的那样会很有帮助.

compiler-construction interpreter haskell

20
推荐指数
1
解决办法
597
查看次数

我成功编译了我的程序.现在我该如何运行它?

我想解决Project Euler 问题1:

如果我们列出10以下的所有自然数是3或5的倍数,我们得到3,5,6和9.这些倍数的总和是23.

求出1000以下3或5的所有倍数的总和.

这是我的代码:

\documentclass[10pt,a4paper]{article}
\usepackage{hyperref}
\newcommand*\rfrac[2]{{}^{#1}\!/_{#2}}
\title{Solution to Project Euler Problem 1}
\author{Aadit M Shah}
\begin{document}
\maketitle
We want to find the sum of all the multiples of 3 or 5 below 1000. We can use the formula of the $n^{th}$ triangular number\footnote{\url{http://en.wikipedia.org/wiki/Triangular_number}} to calculate the sum of all the multiples of a number $m$ below 1000. The formula of the $n^{th}$ triangular number is:

\begin{equation}
T_n = \sum_{k = 1}^n k = 1 + …
Run Code Online (Sandbox Code Playgroud)

javascript pdf compilation

19
推荐指数
1
解决办法
541
查看次数

理解Hindley-Milner型推理中的多义性

我正在阅读有关Hindley-Milner Type Inference的维基百科文章,试图从中找出一些意义.到目前为止,这是我所理解的:

  1. 类型分为单型或多型.
  2. Monotype进一步分为类型常量(如intstring)或类型变量(如??).
  3. 类型常量可以是具体类型(如intstring)或类型构造函数(如MapSet).
  4. 类型变量(如??)表现为具体类型(如intstring)的占位符.

现在我在理解多类型方面遇到了一些困难,但在学习了一些Haskell之后,我就是这样做的:

  1. 类型本身有类型.正式类型的类型称为种类(即,存在不同类型的类型).
  2. 具体类型(如intstring)和类型变量(如??)都是实物*.
  3. 类型构造函数(如MapSet)是类型的lambda抽象(例如Set,种类* -> *Map类型* -> * -> *).

我不明白的是限定词表示什么.例如,什么??.?代表?我似乎无法做出它的正面或反面,我阅读下面的段落越多,我得到的就越混乱:

相反,具有多型∀α.α - >α的函数可以将相同类型的任何值映射到其自身,并且该同一性函数是该类型的值.另一个例子是∀α.(Setα) - > int是将所有有限集映射到整数的函数的类型.成员数是此类型的值.注意,限定符只能出现在顶级,即类型 …

haskell type-systems type-inference lambda-calculus hindley-milner

18
推荐指数
1
解决办法
1729
查看次数

如何在javascript中打印功能签名

我有一个功能:

fs.readFile = function(filename, callback) {
    // implementation code.
};
Run Code Online (Sandbox Code Playgroud)

一段时间后,我想在调试过程中看到函数的签名.

当我尝试时,console.log(fs.readFile)我得到了[ FUNCTION ].

那不给我任何信息.

如何获得该功能的签名?

javascript debugging node.js

17
推荐指数
2
解决办法
1万
查看次数

在JavaScript中使用Function.call.apply的目的是什么?

当我偶然发现用于创建"快速,未绑定的包装器"的Function.call.apply hack时,我正在浏览JavaScript Garden.它说:

另一个技巧是同时使用call和apply来创建快速,未绑定的包装器.

function Foo() {}

Foo.prototype.method = function(a, b, c) {
    console.log(this, a, b, c);
};

// Create an unbound version of "method" 
// It takes the parameters: this, arg1, arg2...argN
Foo.method = function() {

    // Result: Foo.prototype.method.call(this, arg1, arg2... argN)
    Function.call.apply(Foo.prototype.method, arguments);
};
Run Code Online (Sandbox Code Playgroud)

我不明白的是,当Function.apply足够时,为什么还要使用Function.call.apply.毕竟,它们都在语义上是等价的.

javascript

16
推荐指数
1
解决办法
2802
查看次数

在JavaScript中定义属性和命名约定

我是一名优秀的JavaScript程序员,并且遵守道格拉斯·克罗克福德所征集的编码惯例.然而,JavaScript从那时起已经发展,我相信命名约定现在已经过时了.

例如Crockford说:

不要使用_(下划线)作为名称的第一个字符.它有时用于表示隐私,但实际上并不提供隐私.如果隐私很重要,请使用提供私人会员的表格.避免表现出缺乏能力的惯例.

但是,JavaScript现在允许您创建不可枚举的属性.因此,有意义的是(至少对我来说 - 你被允许不同意)使用下划线为非可枚举属性添加前缀以指示该属性是不可枚举的.

你为什么要这样做?

  1. 因为视觉反馈很重要(向下滚动到链接文章中的可读性部分).
  2. 向后兼容性.您可以过滤出以for in循环中的下划线开头的属性.

让我们再举一个Crockford所说的例子:

全局变量应该全部上限.(JavaScript没有宏或常量,因此使用全部大写来表示JavaScript没有的功能没有多大意义.)

正如我所看到的,以下约定存在两个问题:

  1. 大多数JavaScript程序员不会在全部大写中编写全局变量.这不自然.
  2. JavaScript现在允许您创建不可写属性.因此,对于这些属性使用全部大写是有意义的,其原因与我上面针对不可枚举的属性所述的相同.

一切都很好,但你问的真正问题是什么?看看这个Object.defineProperties功能.问题是您需要为要定义的每个属性提供属性描述符.这太冗长了.例如:

var o = {}, x = 0;

Object.defineProperties(o, {
    E: {
        value: Math.E,
        enumerable: true,
        configurable: true
    }
    x: {
        enumerable: true,
        configurable: true,
        get: function () {
            return x;
        },
        set: function (y) {
            x = y;
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

相反,如果您只是这样做会更好:

var o = {}, x = 0;

define(o, …
Run Code Online (Sandbox Code Playgroud)

javascript coding-style naming-conventions

16
推荐指数
1
解决办法
1350
查看次数