ShikiPLはアスキーアートで書かれた数式を計算します。
ShikiPLはアスキーアートからJavaScriptのコードに変換します。

インストール

以下のように入力することでnpmからインストールすることができます。

$ npm install -g shikipl

使用方法

JavaScriptに埋め込みたいアスキーアートは\[…​\]内に記述します。

var f = \[
a = 1

         2
f(x) = 2x  + 1
\]

上記の例では、変数fは2つのプロパティを持ちます。
1つは定数値1を持つプロパティa、もう1つは引数を1つ持つ関数のプロパティfです。

ShikiPLにより生成されたオブジェクトは以下のように使用します。

console.log(f.f(2));  // outputs 9

ShikiPLコードが埋め込まれたJavaScriptファイルをJavaScriptコードに変換するには以下のコマンドを打ちます。

$ shikipl filename.js.shikipl

コードの詳細

定数と関数

左辺の変数がf(x)、またはsubscriptがあるときは関数、単純な変数名のときは定数になります。
関数の引数はカンマで区切ることで複数与えられます。

// f.aは定数、f.f、f.gは関数
var f = \[
a = 27

f(x) = x + 1

f  = x + 1
 x
\]

下に書かれた式は上に書かれた定数、関数の内容を参照できます。

var f = \[
a = 27

f(x) = x + a
\]
console.log(f.f(2));  // outputs 29

加算・減算

加算・減算は+,-を使用します。

var f = \[
f(x) = 2x + 1
\]
console.log(f.f(2));  // outputs 5

乗算

乗算は数または変数を並べて書きます。

var f = \[
f(x) = 2x
\]
console.log(f.f(3));  // outputs 6

乗算は加算より高い優先順位を持ちます。括弧を使えば優先順位を変えられます。

var f = \[
f(x) = 2x + 1

g(x) = 2(x + 1)
\]
console.log(f.f(3));  // outputs 7
console.log(f.g(3));  // outputs 8

べき乗

べき乗は数の右上に乗数を記述します。

var f = \[
        2
f(x) = x
\]
console.log(f.f(3));  // output 9

べき乗は乗算より高い優先順位を持ちます。括弧を使えば優先順位を変えられます

var f = \[
         2
f(x) = 2x

           2
g(x) = (2x)
\]
console.log(f.f(3));  // outputs 18
console.log(f.g(3));  // outputs 36

分数

分数は分子と分母の式をハイフンで上下に区切って記述します。

var f = \[
        x + 1
f(x) = -------
          2
\]
console.log(f.f(1));  // outputs 1

平方根

平方根は対象の式を根号で囲みます。以下の例は2次方程式の解の1つを求めます。

var f = \[
                     ________
                    / 2
              -b + v b  - 4ac
f(a, b, c) = -----------------
                     2a
\]
console.log(f.f(2, -4, 2));  // outputs 1

絶対値

絶対値は|…​|で囲みます。

var f = \[
f(x) = |x|
\]
console.log(f.f(-1));  // outputs 1

三角関数

三角関数はsin, cos, tanの後に対象の数を記述します。
sin a sin bと書いたときは(sin a)(sin b)の意味になります。

var f = \[
f(a) = sin a
\]
console.log(f.f(Math.PI / 2));  // outputs 1

sin, cos, tanの右上に乗数を記述することでべき乗を記述できます。

var f = \[
          2        2
f(a) = sin  a + cos  a
\]
console.log(f.f(8.765346283));  // outputs 1

乗数を-1にすることで逆三角関数を計算できます。

var f = \[
          -1
f(x) = tan   x
\]
console.log(4 * f.f(1));  // outputs 3.14159...

角度

数の右上にoを記述することで角度からラジアンに変換することができます。

var f = \[
            o
f(x) = sin x
\]
console.log(f.f(90));  // outputs 1

指数関数

指数関数はexpの後に対象の数を指定します。

var f = \[
f(x) = exp x
\]
console.log(f.f(1));  // outpus 2.71828...

対数関数

対数関数はlog, lnの後に対象の数を指定します。

var f = \[
f(a) = log a
\]
console.log(f.f(Math.E));  // outputs 1

logの右下に数を指定することで底を指定できます。lnではできません。

var f = \[
f(a) = log  a
          2
\]
console.log(f.f(8));  // outputs 3

定期済みの定数

e,π(\pi)は定義済みです。

var f = \[
a = e

b = π
\]
console.log(f.a);  // outputs 2.71828...
console.log(f.b);  // outputs 3.14159...

球面メルカトル図法

経緯度から球面メルカトル図法へ変換する式は以下のように与えられます。

tex
tex

ここで、φ は緯度(独:Breite)、λは経度(独:Länge)です。
ShikiPLで経度の投影をするには以下のようにします。

var f = \[
                      o
               \pi   b
y(b) = ln tan (--- + --)
                4    2
\]
console.log(f.y(27));  // outputs 0.48971537442745056

Haversine公式

2つの経緯度座標からその距離を得るには、以下に示すhaversine公式を使用します。

tex

ここで、Rは地球の半径、φ は緯度(独:Breite)、λは経度(独:Länge)です。
ShikiPLで距離を求めるには以下のようにします。

var f = \[
r = 3956

                             ____________________________________________
                            /       o   o                         o   o
                      -1   /    2  B - b          o      o    2  L - l
d(B, b, L, l) = 2r sin    /  sin  -------- + cos B  cos b  sin  --------
                         v           2                             2
\]
console.log(f.d(3.046685, 3.146685, 100.686656, 101.686656));  // outputs 69.2892623017496