プログラミング言語I

副作用注意

マイル数を入力して キロメートル数を 返す手続き

1マイルは
1.6093 キロメートル

変換する手続きを
ml2km とすると

ml2km は例えば


(define ml2km 
   (lambda (x) 
      (* 1.6093 x)))

これは 数を値として返す

人間にとっては
ちょっと不親切


(define ml2km (lambda (x) 
  (display x)
  (display "マイルは")
  (display  (* 1.6093 x))
  (display "キロメートルです") 
))


(define ml2km (lambda (x) 
  (print x "マイルは" 
        (* 1.6093 x) "キロメートルです")
 )

とかすると判りやすい

注意

この ml2km は

値は #<undef>

値を利用できない


(+ (ml2km 10) 100)

とか できない

できるようにするには

数を返すようにする


(define ml2km
  (lambda (x) 
    (display x)
    (display "マイルは")
    (display  (* 1.6093 x))
    (display "キロメートルです")
    (* 1.6093 x)
))


(define ml2km
  (lambda (x) 
    (print x "マイルは" 
      (* 1.6093 x) "キロメートルです")
  (* 1.6093 x) ))

define は 最後に評価した式の 値を値として返す

忘れないでね

追加(その1)
手続き newline
副作用として 改行コードを 出力
newline 値は #<undef>
追加(その2)
文字列中で \n は display,print すると改行

(display "this is \n a pen")
this is
a pen
#<undef>
(print "this is \n a pen")
 this is
 a pen
#<undef>
			    
追加(その2)

(display "this is \t a pen")
			    
文字列中で \t は display,print するとタブ

副作用として 入力する手続

(read)
(read) は、評価すると、 標準入力から 式を1つ読んで、その式 そのまま値として返す
標準入力から 式を1つ読む というのが、ポイント
他のプログラミング言語では 面倒なことが、回避できます。
試してみよう
(read)
(read) は値を返すだけなので 単独では使わない
入力した値を使うには (define hoge (read)) とかして hogeを使う
define はシンボルに新しく 値をバインドする
すでにバインドされている 値を更新する set!

set! は define されていることが前提

			      (define ten 10)
			      (print ten)
			      (set! ten 20)
			      (print ten)
			    
いきなり (set! nine 9) は エラー
もちろん set! も スペシャル 理由は?