spinozaとは
これを見てください。
改造する
本家のコードではうまく動かないことがあったので自分好みに改造しました。
spinoza.js
const spinoza = {};
(function() {
function create_$(ary) {
function _$(arg) {
if (typeof arg === 'function') {
ary = ary.map(e => arg(e));
return create_$(ary);
}
ary.push(arg);
return create_$(ary);
};
_$.ary = ary;
return _$;
}
spinoza.$ = function $(arg) {
if (
typeof arg === 'function' &&
arg.name === '_$' || arg.name === '_$$' ||
arg.name === '$' || arg.name === '$$'
) {
return arg.ary ? create_$(arg.ary) : create_$([]);
}
const _$ = create_$([]);
return _$(arg);
};
function create_$$(ary) {
function _$$(arg) {
if (typeof arg === 'function') {
ary = arg(ary);
return create_$$(ary);
}
ary.push(arg);
return create_$$(ary);
};
_$$.ary = ary;
return _$$;
}
spinoza.$$ = function $$(arg) {
if (
typeof arg === 'function' &&
arg.name === '_$' || arg.name === '_$$' ||
arg.name === '$' || arg.name === '$$'
) {
return arg.ary ? create_$$(arg.ary) : create_$$([]);
}
const _$$ = create_$$([]);
return _$$(arg);
}
spinoza.out = function(arg) {
console.log(arg);
return arg;
}
})();
if (typeof module !== 'undefined' && module.exports) {
module.exports = spinoza;
}
基本的には本家と同じですが
\$は引数の関数に配列の要素を渡す
\$\$は引数の関数に配列自体を渡す
という仕様に変えました。
サンプル
sample.js
const spinoza = require('./spinoza');
const $ = spinoza.$;
const $$ = spinoza.$$;
const out = spinoza.out;
$$(1)(out); // [ 1 ]
$$(1)(2)(out) // [ 1, 2 ]
$$(1)(2)(3)(out); // [ 1, 2, 3 ]
function plus10(num) {
return num + 10;
}
$$($(1)(2)(3)(plus10))(out); // [ 11, 12, 13 ]
$$('hello')(out)(out);
// [ 'hello' ]
// [ 'hello' ]
FizzBuzz
fizzbuzz.js
const spinoza = require('./spinoza');
const $ = spinoza.$;
const $$ = spinoza.$$;
const out = spinoza.out;
// 中身がJSなので普通にJSでFizzBuzzを書けばいいが、
// それだとつまらないのでspinoza君をなるべく活躍させる
function createArray(ary) {
const [start, end] = ary;
function _createArray(ary, num = start) {
if (num > end) {
return ary;
}
ary.push(num);
return _createArray(ary, ++num);
}
return _createArray([], start);
}
function fizzbuzz(num) {
if (num % 15 === 0) {
return 'fizzbuzz';
}
else if (num % 3 === 0) {
return 'fizz';
}
else if (num % 5 === 0) {
return 'buzz';
}
else {
return num;
}
}
$($$(1)(100)(createArray))(fizzbuzz)(out);
感想
逆ポーランド記法みたいだなーって思った。(小並感)
現状ほぼJSなところが残念さん。
逐次は分かるけど、分岐、反復はどうやるのだろう。
話がずれるけど、やっぱLispは面白かったなあ。
特にかー&くだーは素晴らしくて、
これのおかげで再帰処理が書きやすかったんだなあ。と再度体感できた。
Lispはマトリョーシカみたいに全体がリストなのが面白いんだよなあ。