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 2Run Code Online (Sandbox Code Playgroud)
虽然JavaScript不支持动态范围,但我们可以使用eval以下方法实现它:
var print …Run Code Online (Sandbox Code Playgroud)该逻辑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
在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) 请考虑以下代码(演示):
function test(){
var h = 'Hello';
var w = 'World';
return (h, w);
}
var test = test();
alert(test);
Run Code Online (Sandbox Code Playgroud)
执行时,该函数test仅返回第二个值(即'World').如何让它返回多个值?
我读了Dan Piponi关于Futamura 医生的三个预测的优秀博客文章.在文章的最后,他有一个附录,其中包含了Haskell中Futamura投影的证明.但是,我发现他的文章缺乏有关所涉及语言的信息.为了使Futamura预测有效,专业化师的源语言,目标语言和对象语言必须具备哪些内容?例如,如果我在Haskell中将Haskell写入LLVM专用器,那么Futamura投影会起作用吗?如果您编写一个Haskell程序来证明这一点就像Dan Piponi在他的文章中所做的那样会很有帮助.
我想解决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) 我正在阅读有关Hindley-Milner Type Inference的维基百科文章,试图从中找出一些意义.到目前为止,这是我所理解的:
int或string)或类型变量(如?和?).int和string)或类型构造函数(如Map和Set).?和?)表现为具体类型(如int和string)的占位符.现在我在理解多类型方面遇到了一些困难,但在学习了一些Haskell之后,我就是这样做的:
int和string)和类型变量(如?和?)都是实物*.Map和Set)是类型的lambda抽象(例如Set,种类* -> *和Map类型* -> * -> *).我不明白的是限定词表示什么.例如,什么??.?代表?我似乎无法做出它的正面或反面,我阅读下面的段落越多,我得到的就越混乱:
相反,具有多型∀α.α - >α的函数可以将相同类型的任何值映射到其自身,并且该同一性函数是该类型的值.另一个例子是∀α.(Setα) - > int是将所有有限集映射到整数的函数的类型.成员数是此类型的值.注意,限定符只能出现在顶级,即类型 …
haskell type-systems type-inference lambda-calculus hindley-milner
我有一个功能:
fs.readFile = function(filename, callback) {
// implementation code.
};
Run Code Online (Sandbox Code Playgroud)
一段时间后,我想在调试过程中看到函数的签名.
当我尝试时,console.log(fs.readFile)我得到了[ FUNCTION ].
那不给我任何信息.
如何获得该功能的签名?
当我偶然发现用于创建"快速,未绑定的包装器"的Function.call.apply hack时,我正在浏览JavaScript Garden.它说:
另一个技巧是同时使用call和apply来创建快速,未绑定的包装器.
Run Code Online (Sandbox Code Playgroud)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); };
我不明白的是,当Function.apply足够时,为什么还要使用Function.call.apply.毕竟,它们都在语义上是等价的.
我是一名优秀的JavaScript程序员,并且遵守道格拉斯·克罗克福德所征集的编码惯例.然而,JavaScript从那时起已经发展,我相信命名约定现在已经过时了.
例如Crockford说:
不要使用
_(下划线)作为名称的第一个字符.它有时用于表示隐私,但实际上并不提供隐私.如果隐私很重要,请使用提供私人会员的表格.避免表现出缺乏能力的惯例.
但是,JavaScript现在允许您创建不可枚举的属性.因此,有意义的是(至少对我来说 - 你被允许不同意)使用下划线为非可枚举属性添加前缀以指示该属性是不可枚举的.
你为什么要这样做?
for in循环中的下划线开头的属性.让我们再举一个Crockford所说的例子:
全局变量应该全部上限.(JavaScript没有宏或常量,因此使用全部大写来表示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 ×8
haskell ×3
node.js ×2
coding-style ×1
compilation ×1
debugging ×1
ecmascript-5 ×1
eval ×1
function ×1
interpreter ×1
pdf ×1
ringojs ×1
stdin ×1
stream ×1
type-systems ×1