; Operational semantics for binary numbers, patterned after the attribute ; grammar and denotational definitions in ; ../semantics-expamples/binary-numbers{attr,deno}, q.q.v. ; ; Syntactically, a binary number is represented as a list of 0's and 1's, with ; an optional decimal point. E.g., ( 1 1 0 1 \. 0 1 ). (defun main () (let ((number (read))) (eval-binary-number number) ) ) (defun eval-binary-number (number) (let* ((integer-value (eval-integer-part number 0)) (number (move-upto-dot number)) (fractional-value (eval-fractional-part number 0))) (+ integer-value fractional-value) ) ) (defun eval-integer-part (number val) (cond ( (or (null number) (eq (car number) '\.)) val ) ( t (let* ((val (+ (* 2 val) (car number)))) (eval-integer-part (cdr number) val)) ) ) ) (defun eval-fractional-part (number val) (cond ( (null number) val ) ( t (let* ((val (/ (eval-fractional-part (cdr number) val) 2.0))) (+ (/ (car number) 2.0) val)) ) ) ) (defun move-upto-dot (number) (cond ( (null number) nil ) ( (eq (car number) '\.) (cdr number) ) ( (or (eq (car number) 0) (eq (car number) 1)) (move-upto-dot (cdr number)) ) ) )