- *搜索“ Mond”会得到一个结果(尽管有此答案),但这是一个误报,实际上并未提及该语言。
- Rosetta代码页。这实际上是在发布挑战后创建的,但是自2014年9月以来,已经存在QuickSort任务的解决方案。
- 尽管mond看起来与JavaScript非常相似(实际上,编写Mond / JS polyglots很容易),但它不是子集,超集或重新实现。这是它自己独特的语言。
在浏览器中尝试
全面披露:我在一定程度上参与了Mond的开发和设计过程,并亲自实现了几种主要语言功能,包括在任务3和4中演示的用户定义的运算符。
任务1
管道运算符(|>
)是语法糖,它将右侧的函数调用转换为以左侧的值作为第一个参数插入的函数调用。foo |> bar()
与相同bar( foo )
。
"Simple, elegant scripting language implemented in C# for .NET/Mono" |> printLn();
任务2
"Hello World! This is written in Mond." |> printLn();
任务3
该任务的代码假定了几件事:
- 数字范围将单行输入
- 上下限之间用一个空格隔开
- 给定的数字是以10为底的整数,并且仅包含字符
0-9
在这里尝试
// parse a string to a number
fun toNumber( str ) {
var n = 0, pow = str.length();
for( var i = 0; i < str.length(); ++i )
n += ( str.charCodeAt( i ) - 48 ) * ( 10 ** --pow );
return n;
}
fun map( arr, fn ) {
var ret = [ ];
foreach( var item in arr )
fn( item ) |> ret.add();
return ret;
}
// user-defined operator to create an upper-bound inclusive range a-la Ruby
// (i.e. 1 .. 5 produces [ 1, 2, 3, 4, 5 ])
seq( .. )( start, end ) {
for( var i = start; i <= end; ++i )
yield i;
}
// read a line from STDIN, trim leading and trailing whitespace,
// split the string to an array, map the array to parse all strings to numbers.
var nums = readLn().trim().split( " " ) |> map( toNumber );
// nums[0] .. nums[1] makes use of the user-defined operator declared on line 22.
// nums[0] is the lower bound, nums[0] is the upper bound.
foreach( var n in nums[0] .. nums[1] ) {
if( n % 2 != 0 ) printLn( n );
}
任务4
此任务演示了用户定义的运算符,该运算符使程序员可以像定义函数一样定义任意运算符(只要它尚不存在),并像使用其他运算符一样使用它。它们具有一元和二元风味。
在这里尝试。
// forward function compositing user-defined operator.
// the function on the right-hand side is called with
// the result of the function on the left-hand side.
fun( >>> )( fn1, fn2 ) {
return fun( ...args ) {
return fn1( ...args ) |> fn2();
};
}
// the mythical "goes down to" operator of legend.
// a lazy sequence that returns all numbers starting from 'hi'
// down to (and including) 'lo'
seq( --> )( hi, lo ) {
for( var i = hi; i >= lo; --i )
yield i;
}
seq map( iterable, callback ) {
foreach( var item in iterable )
yield item |> callback();
}
// doubles the value of n
fun double( n ) -> n * 2;
// squares the value of n (** is the power operator, a-la Python or Ruby)
fun square( n ) -> n ** 2;
// gets the sequence for 10 down to 0, passes it into
// map, which maps it through the composited function of
// double and square, which first doubles the given value
// then squares it.
var nums = ( 10 --> 0 ) |> map( double >>> square );
foreach( var n in nums )
printLn( n );
and/or
;)