0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

某氏が考えたプログラミング言語?spinozaを改造して遊んでみる

Last updated at Posted at 2024-04-17

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はマトリョーシカみたいに全体がリストなのが面白いんだよなあ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?