Edited at

SICP読書女子会 2.3.1 (#25)

More than 1 year has passed since last update.

せっかく勉強会の度に毎回まとめてるので、

勉強会中のためになった会話とか、

結局わかってない部分とかを追加で書いてみましたヽ(=´▽`=)ノ

コードはこちら

SICP/2.3.1.scm at master · cocodrips/SICP


2.3.1

(print "===2.3記号データ===")

(print "===2.3.1クォート===")

(define a 1)
(define b 2)

(print (list a b))
(print (list 'a 'b))

(newline)

(print "--'(a b c)")
(define quote-list '(a b c))
(print (car quote-list))
(print (cdr quote-list))
;a

(print "--空リスト")
(print '())

(print "--memq")
(define (memq item x)
(cond
((null? x) #f)
((eq? item (car x)) x)
(else (memq item (cdr x)))
))

(print (memq 'apple '(pear banana prune)))
(print (memq 'apple '(x (apple sauce) y apple pear)))

'a の aのことを、symbolって言うらしい

gosh> (symbol? 'a)

#t


(おまけ)シンボルについての会話

シンボルの使いみちがわかんなかった私と参加者の会話めも


しんぼるどんなときに使うんですか?

> 例えばハッシュのキーとか。

ほえー?

> 文字列だと、メモリ列をずずずーっとみて一致調べないとだけど、
シンボルは内部的には基本ただの整数値になってる

シンボルだとすぐ飛べる?
つまりdefine的な?

> そんなかんじー

'aがなにであるかは
とくに定義はどこにもしないんですよね?
かってに好きな値を割り当ててくれて
かぶらないようになる?

> そう〜
'a と 'b はかならず別の値になるようにしてくれるし、
'a と 'a なら、別のモジュールで使ってても同じ値になってくれる

ちなみに Perl は、文字列に対して内部でハッシュ値を計算して持ってたりする。
ハッシュキーにするときとか。

文字列をハッシュキーにするときに
その文字列を一旦ハッシュ化して、どこかにペアをつくっておいて、そのハッシュでアクセスする?

> そうそう。

ほえー! おもしろい!!

めも:

Gauche ユーザリファレンス: ペアとリスト


ex 2.53


(print "===Ex 2.53===")
(print (list 'a 'b 'c)) ;(a b c)
(print (list (list 'george))) ;((george))
(print (cdr '((x1 x2) (y1 y2)))) ;((y1 y2))
(print (cadr '((x1 x2) (y1 y2)))) ;(y1 y2)
(print (pair? (car '(a short list)))) ;#f
(print (memq 'red '((red shoes) (blue socks)))) ;#f
(print (memq 'red '(red shoes blue socks))) ;(red shoes blue socks)


ex 2.54

(print "===Ex 2.54===")

; 再帰的なequal?を定義する
(define _equal? equal?)

(print "もとからあるequal?")
(print (equal? '(this is a list) '(this (is a) list)))

(print "自作のequal?")
(define (equal? a b)
(cond
((and (null? a) (null? b)) #t)
((or (null? a) (null? b)) #f)
((and (pair? (car a)) (pair? (car b)))
(if
(equal? (car a) (car b))
(equal? (cdr a) (cdr b))
#f
))
((or (pair? (car a)) (pair? (car b))) #f)
(else
(if
(eq? (car a) (car b))
(equal? (cdr a) (cdr b))
#f
)
)
)
)

(print "hioさんのみて書き直し")
(define (equal? a b)
(cond
((eq? a b) #t) ; 追加
((and (null? a) (null? b)) #t)
((or (null? a) (null? b)) #f)
((and (pair? (car a)) (pair? (car b)))
(and (equal? (car a) (car b)) (equal? (cdr a) (cdr b))))
;((or (pair? (car a)) (pair? (car b))) #f) <= これはいらない。下のelseで吸収可能
(else
(and (eq? (car a) (car b)) (equal? (cdr a) (cdr b))))
)
)

(print (equal? '(this is a list) '(this (is a) list))) ;#f
(print (equal? '(this is a list) '(this is a list))) ;#t
(print (equal? (list (list 2 3) 'a) (list (list 2 3) 'b))) ;#f
(print (equal? 'a 'a))

めも:

pairとpairじゃないものは、勝手にeq?ではじける

gosh> (eq? (list 2) 1)

#f
gosh> (eq? (list 1) (list 1))
#f

|:--|:--|:---|

|


ex 2.55

(print (car ''abracadabra)) ; quote

; 'a => (quote a)

(print (quote a)) ;a
(print (quote (quote a))) ;'a
(print (car (quote (quote a)))) ;quote

'aの意味は(quote a) (脚注より)


(おまけ)クォートに関する会話めも

クォートとリスト


'(a b c) っていうのはシンボルなのに
(car (quote (a b c)))だとちゃんとaがとれてpairになってるんですねえ。

> `(a b c)` はシンボルじゃなくてリストかとおもう〜
(list? (quote (a b c))) は #t

ええ
じゃあ'(a b c)は、(list 'a 'b 'c) ???

> そんなかんじとおもう〜
けど教科書ばさばさよみかえしてみたけれど、詳しいことかいてないっぽい…
'(a "A" 1 (b "B" 2)) だと シンボル値になるところだけ適用してくれる感じ

数字のシンボル?

> gosh> (+ '1 '2)

3

何事もなく数字・x・

えええええ〜

> 挙動不思議…ッ>ω<;