前置記法と中置記法
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
◆ 演算子が関数(メソッド)な言語風に前置記法と中置記法で書いてみる
中置記法というのは普通の数式
みたいなの
数字と数字の間に演算子があります
前置記法はスタック使って四則演算するときとかにでてくるやつです
みたいなの
Lisp だと 関数がこんなふうになっています
ideone で確認してます
これを JavaScript でやってみます
見た目をこんなふうにします
どことなくそんな感じになりました
Function["+"] は () で囲む必要ないはありませんが a と b に合わせて囲んでます
見やすく書いてみるとこうなります
やってることはこれと一緒です
そのままでいいのでは?と思いますが 前置記法の時みたいに関数にして自分で定義できるようにします
これも a に () してるのは見た目の都合です
やってることはこれと同じです
思いつきでやってみましたがこんなことができる自由度が JavaScript の良いところですね
こんな書き方普段しないですけど
1 + 3
みたいなの
数字と数字の間に演算子があります
前置記法はスタック使って四則演算するときとかにでてくるやつです
+ 2 3
みたいなの
Lisp だと 関数がこんなふうになっています
; your code goes here
(print (+ 1 3))
// 4
(print (+ 1 3))
// 4
ideone で確認してます
これを JavaScript でやってみます
見た目をこんなふうにします
前置記法
Function["+"] = a => b => a + b
var a = 2
var b = 3
var r0 = (Function["+"]) (a) (b)
console.log(r0)
// 5
var a = 2
var b = 3
var r0 = (Function["+"]) (a) (b)
console.log(r0)
// 5
どことなくそんな感じになりました
Function["+"] は () で囲む必要ないはありませんが a と b に合わせて囲んでます
見やすく書いてみるとこうなります
やってることはこれと一緒です
Function.plus = function(a){
return function(b){
return a + b
}
}
Function.plus(2)(3)
// 5
return function(b){
return a + b
}
}
Function.plus(2)(3)
// 5
中置記法
では次に中置記法そのままでいいのでは?と思いますが 前置記法の時みたいに関数にして自分で定義できるようにします
Object.assign(Number.prototype, {
"+"(x) {return this + x},
"-"(x) {return this - x},
"*"(x) {return this * x},
"/"(x) {return this / x},
"%"(x) {return this % x},
"**"(x) {return Math.pow(this, x)},
"&"(x) {return this & x},
"|"(x) {return this | x},
"^"(x) {return this ^ x},
"&&"(x) {return this && x},
"||"(x) {return this || x},
})
var a = 3
var b = 4
var r1 = (a) ["+"] (b)
var r2 = (a) ["-"] (b)
var r3 = (a) ["*"] (b)
var r4 = (a) ["/"] (b)
var r5 = (a) ["%"] (b)
var r6 = (a) ["**"] (b)
var r7 = (a) ["&"] (b)
var r8 = (a) ["|"] (b)
var r9 = (a) ["^"] (b)
console.log(r1,r2,r3,r4,r5,r6,r7,r8,r9)
// 7 -1 12 0.75 3 81 0 7 7
"+"(x) {return this + x},
"-"(x) {return this - x},
"*"(x) {return this * x},
"/"(x) {return this / x},
"%"(x) {return this % x},
"**"(x) {return Math.pow(this, x)},
"&"(x) {return this & x},
"|"(x) {return this | x},
"^"(x) {return this ^ x},
"&&"(x) {return this && x},
"||"(x) {return this || x},
})
var a = 3
var b = 4
var r1 = (a) ["+"] (b)
var r2 = (a) ["-"] (b)
var r3 = (a) ["*"] (b)
var r4 = (a) ["/"] (b)
var r5 = (a) ["%"] (b)
var r6 = (a) ["**"] (b)
var r7 = (a) ["&"] (b)
var r8 = (a) ["|"] (b)
var r9 = (a) ["^"] (b)
console.log(r1,r2,r3,r4,r5,r6,r7,r8,r9)
// 7 -1 12 0.75 3 81 0 7 7
これも a に () してるのは見た目の都合です
やってることはこれと同じです
Number.prototype.plus = function(x){
return this + x
}
Number.prototype.minus = function(x){
return this - x
}
var a = 3
var b = 4
a.plus(b)
// 7
a.minus(b)
// -1
return this + x
}
Number.prototype.minus = function(x){
return this - x
}
var a = 3
var b = 4
a.plus(b)
// 7
a.minus(b)
// -1
思いつきでやってみましたがこんなことができる自由度が JavaScript の良いところですね
こんな書き方普段しないですけど