[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 );
}

C#

C# はではどうしたらよいだろう。え〜い。クラスにしちゃえ。
本家も class にしていた、、、
以下を参照。
Program Files/Microsoft Visual Studio .NET 2003/SDK/v1.1/Tool Developers Guide/Samples/clisp