LoginSignup
0
1

More than 5 years have passed since last update.

演算子の結合規則

Posted at

Scheme (に限らずたいていの LISP 系言語も) では、原則として演算子の優先順位を考える必要がありません。手続き (関数) として提供され、手続きの規則に従うので、演算子に特有の規則は不要だからです。

しかし、結合規則についてはどうでしょうか。

結合規則によって意味が変わるような演算、たとえば割り算を考えてみます。

(/ 1 2 3)

この式は (1/2)/3 を意味します。 つまり、左結合的なふるまいをするわけです。

右結合的な動作をする手続きを書くこともできます。

#!r6rs
(import (rename (rnrs) (/ rnrs:/)))
(define (/ . args) (fold-right rnrs:/ 1 args)) ;; 右結合版の割り算を定義

(display (/ 1 2 3)) ;; => 3/2

つまり、ある手続きが左結合的に動作するか右結合的に動作するかはどちらも有りうるのです。 (Scheme が標準で提供している四則演算手続きに限ってはいずれも左結合的に動作しますが。)

Scheme (などの LISP 系言語) におけるこういった演算は便宜のために多くの引数を受け取れるようになっているだけで、やっていることは二項演算の連鎖に過ぎませんので (/ 1 2 3)(/ (/ 1 2) 3) と書けば結合規則に曖昧さは生じませんが、そこまで括弧で明示するなら中間記法で書くのと大差ありません。 S式は世間で思われているほど曖昧さを排除できているわけではないのかもしれません。

0
1
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
1