ProgrammingのTipなど

演算・判定・論理

Schemeの演算関数は一度に複数の引数をとれるものが多い
ただし引数が多すぎると読みにくくなりやすいこともあるので注意

論理

論理演算には 
and or not
があります
and 論理積 かつ
a b c ...以下が全てtrueならtrueを返す
論理記号では∧
(and a b c ...)
or 論理和 または
a b c ...以下で一つでもtrueがあればtrueを返す
論理記号では∨
(or a b c ...)
not 否定
aがfalseならtrueを返す
論理記号では¬
(not a)

数値演算

四則演算
+ - * / remainder(余り)
四則演算も3つ以上の複数の引数を処理できる
(+ 5 2 5)
>12
絶対値
(abs a)
最小最大
(min a b c ..) 最小値を返す
(max a b c ..) 最大値を返す

比較関数

数値比較関数
Schemeには等号関数はあるが不等号関数は組み込みにはない。ここはcommonlispなどと違うので注意
(< a b)  より大きい
(> a b) より小さい
(<= a b) 以上
(>= a b) 以下
(= a b) 等号
比較関数も一度に複数の引数を処理できるが
読みにくくなるので注意
(< 1 2 3)

判定関数

数値関係の判定関数
(even? x) 偶数判定
(odd? x) 奇数判定
(number? x) 数であるかどうか判定
一般判定関数
eq?
eq?は2つのアトムを比較して同値か判定する
=は数値だけしか判定できないがeq?は数値を含めてアトムを比較できる
(eq? "a" "a")
(eq? 7 7)
equal?
eq?とほぼ同じ挙動だが
リストに対する判定で違いがある
(define l1 '(1 2 3))
(define l2 '(1 2 3))

(eq? l1 l2)
>#f
(equal? l1 l2)
>#t
eq?やeqv?はリストの変数が違えば
中身のデータ内容が同じでもfalseになるが
equal?は変数が違っても中身のデータ内容が同じならtrueにする

このeq?の挙動の違いは
リストに対してだけであり
通常の変数では同じである
(define a1 100)
(define b1 100)

(eq? a1 b1)
>#t
(equal? a1 b1)
>#t
pair?
ペアであるかどうかを判定
(pair? x)
null?
対象が空リストかどうか判定します
(define ar1 '(1 2 5))
(null? ar1)
>>#f

非組み込み判定関数

組み込まれていないが
一般的にSchemeではよく使われる判定関数
atom?
アトムかどうかを判定する。リストだとfalseを返す
リストであるかどうかの判定に使える
(define atom? (lambda (a)
                (and (not (pair? a)) (not (null? a))))
  )
lat?
lat(アトムだけが入っているリスト)であるかどうかの判定
(define lat? (lambda (la)
               (cond
                 ((null? la) #t)
                 ((atom? (car la)) (lat? (cdr la)))
                 (else #f)
                 )
               ))
member?
リスト内にそのアトムがあるかどうか判定
(define member? 
  (lambda (x l)
     (cond
       ((null? l) #f)
           (else (or (eq? (car l) x)
               (member? x (cdr l)))))))
               
(define l1 (list 1 2 3))
(define l2 (list 'a 'b 'c))
(print (member? 2 l1))
(print (member? 'b l2))

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

メニュー2

開くメニュー

閉じるメニュー

  • アイテム
  • アイテム
  • アイテム
【メニュー編集】

管理人/副管理人のみ編集できます