[SICP] self-evaluating?
scheme で評価されたときに 3 は数字の 3 と評価されたい。"abc" の文字列は "abc" と評価されたい。eval で最初に検査されるのがそのような、自分自身を返すかどうか?というチェックである self-evaluating? だ。
(defun self-evaluating? (exp) (cond ((numberp exp) t) ((stringp exp) t) (t nil)))
scheme-eval 関数をものすごく簡単にすると
(defun scheme-eval (exp env) (cond ((self-evaluating? exp) exp) (t (format t "Unkown expression:~a~%" exp))))
実行してみよう。3 は 3と評価され "abc" は "abc" と評価される。それ以外はエラーだ。今、環境は nil にして実行する。
[4]> (format t "~a~%" (scheme-eval 3 nil)) 3 NIL [5]> (format t "~a~%" (scheme-eval "abc" nil)) abc NIL [6]> (format t "~a~%" (scheme-eval 'a nil)) *** - Unkown expression The following restarts are available: ABORT :R1 Abort main loop Break 1 [7]> [8]> (format t "~a~%" (scheme-eval '(a b c) nil)) *** - Unkown expression The following restarts are available: ABORT :R1 Abort main loop Break 1 [9]>
C で書くと
C ではよく下位数ビットをフラグにして、ポインターは4あるいは8バイトバウンダリにし、ポインターであれば Cell であると解釈する。
bool self_evaluating_p(Expression exp) { int tag, type; tag = getTag(exp.tag); if ( tag == ATOM_SHORT_NUM ) { return true; } if ( tag != EX_ATOM ) { return false; } // ex_atom type = getTag(exp.tag); return ( type == STRING ); }