template string の tag のみで関数呼び出しする
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
◆ いつものよくわからないやつ
◆ 使いみちはないので 真面目な記事を求めてる人はタブを閉じましょう
◆ 使いみちはないので 真面目な記事を求めてる人はタブを閉じましょう
定期的に作りたくなる template string の tag 機能を使った変なもの(過去の例)
今回は独自記法 (タグ関数呼び出しのみ) でプログラムが書けるものです
事前にこういう関数を準備しておきます
でメインの処理はこう書きます
template string のタグ機能を使って関数を実行します
単純に `` に書くと文字列になるので ${} を使った埋め込み部分に引数の値を渡します
`` の中に複数値を書けるのですべての引数はリストということにします
`` をつなげることで複数の引数を取ります
結果をさらに引数にするときに区切りが必要だからと () をつけることにしたのですが よくよく考えてみると 関数呼び出しはリテラルの `` である必要があるので () いらなかったです
ただ なんか JavaScript とは別言語風に見えるのであえて残しておきます
lisp ぽい?
関数呼び出しのネストはこうなります
ちょっと複雑です
内側 add は ${} で区切られるので () は必須ではないです
`` の中の ${} の外の文字列部分は関数呼び出しの処理では使わないので コメントとして使えます
型書いておくのもいいかもしれません
型チェック機能はいれてないですが 構文を決めてしまって型指定できるように拡張するのもありかも?
print 関数もあります
add は引数 2 を取る作りでしたが print は一つのみで受け取ったリストを console.log で出力します
複数の値を出力するにはこうします
add などと組み合わせると
関数定義もあります
def 関数の 1 つ目の引数が引数の名前のリスト
2 つ目の引数に関数のボディです
作った関数は fns のプロパティになります
実行はこういう風にできます
今回は独自記法 (タグ関数呼び出しのみ) でプログラムが書けるものです
事前にこういう関数を準備しておきます
const print = (_, ...x) => console.log(x)
const add = (_, ...x) => (_, ...y) => x[0] + y[0]
const includes = (_, ...x) => (_, ...y) => x.includes(y[0])
const fns = {}
const def = (_, ...x) => (_, ...y) => (_, ...z) => {
const name = x[0]
const args = y
const body = z[0]
const exp = args.map(e => `(_, ...${e}) => `).join("") + body
fns[name] = eval(exp)
}
でメインの処理はこう書きます
(add `${1}` `${2}`)
// 3
template string のタグ機能を使って関数を実行します
単純に `` に書くと文字列になるので ${} を使った埋め込み部分に引数の値を渡します
`` の中に複数値を書けるのですべての引数はリストということにします
`` をつなげることで複数の引数を取ります
結果をさらに引数にするときに区切りが必要だからと () をつけることにしたのですが よくよく考えてみると 関数呼び出しはリテラルの `` である必要があるので () いらなかったです
ただ なんか JavaScript とは別言語風に見えるのであえて残しておきます
lisp ぽい?
関数呼び出しのネストはこうなります
(add `${5}` `${(add `${1}` `${2}`)}`)
// 8
ちょっと複雑です
内側 add は ${} で区切られるので () は必須ではないです
`` の中の ${} の外の文字列部分は関数呼び出しの処理では使わないので コメントとして使えます
型書いておくのもいいかもしれません
(add `num: ${1}` `num: ${2}`)
// 3
型チェック機能はいれてないですが 構文を決めてしまって型指定できるように拡張するのもありかも?
print 関数もあります
(print `${1}`)
// [1]
add は引数 2 を取る作りでしたが print は一つのみで受け取ったリストを console.log で出力します
複数の値を出力するにはこうします
(print `${1} ${2}`)
// [1, 2]
add などと組み合わせると
(print `${(add `${10}` `${10}`)} ${(add `${"a"}` `${"b"}`)}`)
// [20, "ab"]
;;;;
(print `${(includes `${1} ${2} ${3}` `${2}`)}`)
// [true]
関数定義もあります
(def `${"muldiv"}` `${"a"} ${"b"} ${"c"}` `${"a * b / c"}`)
def 関数の 1 つ目の引数が引数の名前のリスト
2 つ目の引数に関数のボディです
作った関数は fns のプロパティになります
実行はこういう風にできます
(print `${(fns.muldiv `${10}` `${20}` `${5}`)}`)
// [40]