SICP読書女子会 2.3.1 (#25)

  • 1
    Like
  • 1
    Comment
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・

えええええ〜

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