SICPを読む(3) 問題1.1

まだ手続きの意味がよくわからない。

特殊形式(define,and,not)は手続きではないと書いてあった。ますます意味不明。

それでは、ようやく練習問題。

10        ; 10
(+ 5 3 4) ; 12
(- 9 1)   ; 8
(/ 6 2)   ; 3
(+ (* 2 4) (- 4 6)) ; 6

(define a 3)        ; a
(define b (+ a 1))  ; b
(+ a b) ; 7
(= a b) ; #f
(+ a b (* a b)) ; (+ 3 4 12) -> 19

(if (and (> b a) (< b (* a b)))
     a
     b) ; (if (and #t #t) ...) -> 3

(cond ((= a 4) 6)
      ((= b 4) (+ 6 7 a))
      (else 25)) ; (+ 6 7 a) -> 16

(+ (cond ((> a b) a)
         ((< a b) b)
         (else -1))) ; 4
  • vim上で()範囲デバッグ出来るのでらくちん。GaucheよりMzSchemeを使うかもしれない。
  • ifとcondで括弧の使い方が違うので迷った。まだ括弧に慣れない。

今日のSchemeリンク。

『計算機プログラムの構造と解釈』について

僕のレベルは、まさにコレ。

あんな括弧の多い言語、 IQの高い人間じゃないと理解できないに違いない、そもそも実用性がないんじゃないか

しばらくやった人の言葉。こう言いたい。こうなりたい。

なんでこんなにすごいんだ? 何より楽しい。

そして、神レベル。

えっ? カッコ? あ、そうか。そんなものもあったな。いやあ、 すっかり忘れておったわ

こうなる日はこないだろうな・・・。

SICPを読む(4) 問題1.2 - 1.5

問題1.2

(/ (+ 5 4 (- 2 (- 3 (+ 6 (/ 4 5)))))
  (* 3 (- 6 2) (- 2 7))) ; -37/150

4/5でもOK。

問題1.3

(define (square-3 x y z)
 (if (> x y)
  (sum-of-squares x (if (> y z) y z))
  (sum-of-squares y (if (> z x) z x))))
(square-3 2 3 2)

アンサーブックを見たら問題を読み間違えてたので、修正。

問題1.4

(define (a-plus-abs-b a b)
 ((if (> b 0) + -) a b))
(a-plus-abs-b 1 -2) ; 3

面白い。振舞いをを変更出来てしまう。

問題1.5

(define (p) (p))
(define (test x y)
 (if (= x y) 0 y))
(test 0 (p))

Schemeは作用的順序なので、無限ループ。

(test 0 (p))
; ->0を評価->(test 0 (p))
; ->pを評価->(test 0 (p))
; ->pを評価->(test 0 (p))...

つまり、"引数の中"を先に評価する。括弧の中ではないらしい。

OSS WEB|SICP|ex-1.5

「新次元」のプログラミング言語、Befungeについて。

「新次元」のプログラミング言語Befungeが凄い。

WikipediaのHello,Worldが美しい。

v @_       v
>0"!dlroW"v 
v  :#     < 
>" ,olleH" v
   ^       <

目が慣れると普通に読めるようになるのが不思議。