星田さんの記事に対するコメント。
> 2021/11/02
キー入力の方法は調べないといかんなぁとか・・W+Enterとかじゃなくて1つのキーで移動するようにしたいねぇ。
多分、2htdpと言うライブラリを使えば何とかなるんじゃないかな。
ネットを探すと次のようなサンプルプログラムがありました。
#lang racket/gui
(require 2htdp/image)
(require 2htdp/universe)
(define (ball-image t)
(place-image (circle 10 "solid" "red")
(car t)
(cdr t)
(empty-scene 300 300)))
(define (change w a-key)
(cond
((key=? a-key "left") (cons (sub1 (car w)) (cdr w)))
((key=? a-key "right") (cons (add1 (car w)) (cdr w)))
((= (string-length a-key) 1) w)
((key=? a-key "up") (cons (car w) (sub1 (cdr w))))
((key=? a-key "down") (cons (car w) (add1 (cdr w))))
(else w]))
(big-bang '(150 . 150)
(to-draw ball-image)
(on-key change))
> 2021/11/03
得意な形の末尾再帰ばっかりじゃなくて名前付きLetとか普通の再帰も出来るようにならんといかんな・・
ん〜〜。
と言うか、名前付きletは末尾再帰する為にある、って言って良いです。
それと、そのページのfoldlは末尾再帰だけど、foldrは違うので、末尾再帰に書き換える練習にした方が良いかしらん。
(define (foldr f g ls)
(if (null? ls)
(reverse g)(foldr f (f (car ls) g) (cdr ls))))
また、実用的にはSRFI-1を(require srfi/1)して使った方が良いでしょう。
ライブラリ上はfoldlがfold、foldrがfold-rightになっています。
辞書みたいなことも出来るんですねぇ!
と言うより、辞書の元ネタが連想リストです。
連想リストを連想リスト用データ構造として、ハッシュ法と言うテクニックで検索時間を速めたモノをハッシュテーブル、と言います。
Pythonの辞書もハッシュテーブルの一種です。
実はRacketにはハッシュテーブルも用意されています。
> (define z (hash 'a 'b 'c 'd 'e 'f 'g 'h))
> (hash-ref z 'e #f)
'f
> (hash-ref z 'h #f)
#f
> (hash-set z 'x 1)
'#hash((a . b) (c . d) (e . f) (g . h) (x . 1))
>
また、ANSI Common Lispにもハッシュテーブルがあります。
CL-USER> (defparameter z (make-hash-table))
Z
CL-USER> (setf (gethash 'a z) 'b)
B
CL-USER> (setf (gethash 'c z) 'd)
D
CL-USER> (setf (gethash 'e z) 'f)
F
CL-USER> (setf (gethash 'x z) '1)
1
CL-USER> (gethash 'e z)
F
T
CL-USER> (gethash 'h z)
NIL
NIL
CL-USER>
加えて、ANSI Common Lispには連想リストによく似た属性リスト(p-listと俗称する)なるものがあって、これがANSI Common Lispの3番目の名前空間を形成しています。
CL-USER> (setf (get 'z :a) 'b)
B
CL-USER> (setf (get 'z :c) 'd)
D
CL-USER> (setf (get 'z :e) 'f)
F
CL-USER> (setf (get 'z :x) 1)
1
CL-USER> (get 'z :e)
F
CL-USER> (get 'z :h)
NIL
CL-USER> (symbol-plist 'z)
(:X 1 :E F :C D :A B)
CL-USER>
カリー化面白そう。名前が既に面白い(Haskellの人から来てるのかな)。
その通りです。数学者、ハスケル・カリーに両者とも因んで名付けられました。
ちなみに、プログラミング言語Haskellは、原理的には1引数関数しか作れないんですが、このカリー化で複数の引数を内部的には定義しています(要するに複数引数は構文糖衣になっている)。