星田さんの記事に対するコメント。
そのためにはリストにしたリストを表示できないといけないのだけど・・・なんか再帰で表示できない?なんだこのエラーは・・単体の「display (car maplist)」なら表示できるのに・・これは再帰を理解できてないかdisplayがこの形では受け取れないのか・・
再帰関係ないですね。
単にdisplayが一引数の関数なのに、二つ引数を渡してるからエラーが起きてるだけです。
displayは便利なんだけど非力なんで、for-eachと組み合わせるのがTipsです。これは良くやります。
また、Schemeの仕様だと改行命令はnewlineといいます(Ansi Common Lispではterpriと言う)。
多分こういう事がやりたいんじゃないかな。
#lang racket
(define a (make-list 14 0))
(define b (make-list 14 1))
(define c (make-list 14 2))
(define d (make-list 14 3))
(define-values (e f g h i j k l m n o p)
(values a b c d a b c d a b c d))
(define maplist (list a b c d e f g h i j k l m n o p))
(for-each (lambda (x)
(display x)
(newline)) maplist)
上のコードには、他にも
Tips 1: 長さを指定して同じ要素のリストを作りたい場合はmake-listを使え。
Tips 2: 複数の変数を同時に定義したい場合はdefine-valuesを使え。
実は2番目のdefine-valuesはRacket依存の機能ですが、構わんでしょう。
こういう機能はCommon Lisp制定前のLispにはあった機能です。特にXerox社のInterlispのdefineqはある意味有名でした。複数の変数の同時定義や複数の関数の同時定義が出来た。
Racketのdefine-valuesはSchemeの多値の機能を利用して作られたマクロです。他のScheme処理系でも作ろうと思ったら作れるんで、使って構いません。
この二つで、
- リストを短く定義して
- 1.のリストを使って他のリストを一気に定義する
と言うショートカットが可能になるのです。