【一日】CommonLisp【一門】

1デフォルトの名無しさん
るーる
・本スレに敬意を持つこと
・lisp最強
・括弧を崇めろ
・初心者を馬鹿にしない
・人に優しく
2デフォルトの名無しさん:05/01/25 02:27:43
門?
くぐってみろや
3デフォルトの名無しさん:05/01/25 02:35:34
肛門栗鼠プー
4デフォルトの名無しさん:05/01/25 06:02:07
#: ってどういう意味?
5デフォルトの名無しさん:05/01/25 11:36:22
これから井戸に入るかどうか迷っている2人を衛星高度から取った写真(画像処理済み)
6デフォルトの名無しさん:05/01/25 11:48:19
ああ、フラクタル圧縮だね。
7デフォルトの名無しさん:05/01/26 06:10:59
【問題001】
1~10までの値を表示せよ
8デフォルトの名無しさん:05/01/26 14:29:23
>>7
とりあえずはじめは、簡単にdoで。

(do ((i 1 (+ i 1))) ((> i 10)) (format t "~D~%" i))
9デフォルトの名無しさん:05/01/26 17:22:27
(format t "1 2 3 4 5 6 7 8 9 10")
真・スレッドストッパー。。。( ̄ー ̄)ニヤリッ
11デフォルトの名無しさん:05/01/26 20:04:56
(format t "1~~10までの値~%")
(values 1 2 3 4 5 6 7 8 9 10)
(dotimes (i 10) (print (1+ i)))
12デフォルトの名無しさん:05/01/26 20:05:04
a
13デフォルトの名無しさん:05/01/26 20:06:43
(loop for i from 1 to 10 do (print i))
14デフォルトの名無しさん:05/01/27 00:10:39
じゃ、dotimesで
(let ((output nil))
(dotimes (x 9 (reverse output))
(setq output (cons (1+ x) output))))
15デフォルトの名無しさん:05/01/27 08:53:20
【問題002】
引数を2倍する関数を作る関数を定義せよ
(併せてマクロも)

PS:私のLispの知識ってこれくらいで限界なので誰か問題作ってください
16デフォルトの名無しさん:05/01/27 09:58:21
>>15
(defun defun-square (sym) (eval `(defun ,sym (x) (* x x))))
(defmacro defsquare (name) `(defun ,name (x) (* x x)))

(defun-square 'foo)
(defsquare bar)

CommonLispには詳しくないので、
defun-squareの方は、もっといいコードがあるのかもしれません。詳しい人、教えて。
17デフォルトの名無しさん:05/01/27 10:14:34
2倍せよであって、2乗せよにあらずと思ふ。
(defun make-*2 ()
(lambda (x) (* 2 x)))
18デフォルトの名無しさん:05/01/27 10:16:01
(defun times (n) #'(lambda (x) (* x n)))
(defun double (times 2))
19デフォルトの名無しさん:05/01/27 10:18:30
(defun double () (times 2)) => DOUBLE
(funcall (double) 3) => 6
2016:05/01/27 10:31:33
>>17
あ…、lisp/Schemeといえばsquare関数なので、
その先入観でやっちまいました。ごめんなさい。
21デフォルトの名無しさん:05/01/27 10:38:55
>>15
せめて100門ぐらい作ってから言え
22デフォルトの名無しさん:05/01/27 10:53:11
xzyyzで

(defun func(x)
#'(lambda()(* x x))
)
func
(setq fff (func 12))
#<lexical-closure: (anonymous)>
(funcall fff)
144
23デフォルトの名無しさん:05/01/27 21:54:11
【問題003】
リストの終端にあるアトムを返す関数、last-atomを定義せよ。
(last-atom '(1 2 3)) => nil
(last-atom '(a b . z)) => z
24デフォルトの名無しさん:05/01/27 21:57:10
それはリストの終端にあるアトムとは言わんのじゃないかと思いつつ。
(defun last-atom (lis) (if (consp lis) (last-atom (cdr lis)) lis))
25デフォルトの名無しさん:05/01/27 22:04:31
ん? ANSI CLでのdotted listの定義が、a list which has a terminating atom that is not nil.
となっているんで、終端のアトムでいいと思ったけど、どこかおかしい?

26デフォルトの名無しさん:05/01/27 22:08:49
(defun terminating-atom (list)
  (if (atom list)
      list
      (terminating-atom (cdr list))))
27デフォルトの名無しさん:05/01/27 22:10:33
(defun terminating-atom (list) (last list 0))
28デフォルトの名無しさん:05/01/27 22:15:38
(defun terminating-atom (list)
  (loop for (element . rest) on list
        if (atom rest) do (return rest)))
29デフォルトの名無しさん:05/01/27 23:49:52
おれはlast-cdrと銘々するね
30デフォルトの名無しさん:05/01/28 02:19:03
reverseにドットペアを突っ込む終端のアトムがもげるのは仕様ですか?
31デフォルトの名無しさん:05/01/28 02:28:41
>>30
どうあるべきと思っているの?
32デフォルトの名無しさん:05/01/28 07:35:11
>>30 dotted listは、proper listではないので、仕様ではない。type-errorを発信するのが望ましい。
> Should be prepared to signal an error of type type-error if sequence is not a proper sequence.
33デフォルトの名無しさん:05/01/28 13:40:30
【問題004】
引数が循環リストかどうかを判定する関数circular-list-pを定義せよ。
(circular-list-p '#1=(a . #1#)) => true
(circular-list-p '(a . #1=(b c . #1#))) => true
(circular-list-p '(a b c)) => false
34デフォルトの名無しさん:05/01/28 14:04:26
xyzzyで

(defun func(x)
(if(atom (cdr x)) (cdr x)
(func (cdr x))))
func

(func '(1 2 . 3))
3
(func '(1 2 3))
nil
35デフォルトの名無しさん:05/01/28 16:20:02
(defun circular-list-p (lis)
(do ((うさこ (cdr lis) (cdr (cdr うさこ)))
(カメ吉 lis (cdr カメ吉)))
((or (null うさこ)
(eq うさこ カメ吉))
(not (null うさこ)))))
36デフォルトの名無しさん:05/01/28 21:20:57
>>35
(circular-list-p 'a) -> SIMPLE-TYPE-ERROR [CDR: A is not a LIST]
(circular-list-p '(a . b)) -> SIMPLE-TYPE-ERROR [CDR: B is not a LIST]
37デフォルトの名無しさん:05/01/29 00:29:15
>>36
(defun fool-proof-circular-list-p (lis) (ignore-errors (circular-list-p lis)))
38デフォルトの名無しさん:05/01/29 07:41:33
【問題005】
(a b (c d(e)))というリストがある。
(rester '(a b (c d(e))) )->(a b c d e)
になる関数を定義せよ
39デフォルトの名無しさん:05/01/29 10:17:12
(defun rester (x)
  (if (atom x)
      x
      (mapcan #'(lambda (y) (if (atom y) `(,y) (rester y))) x)))

(defun rester (x)
  (loop for y in x
        if (atom y) collect y
        else append (rester y)))

(defun rester (x) '(a b c d e))
40デフォルトの名無しさん:05/01/30 03:19:58
(defun rester (s)
(cond ((null s) nil)
((atom s) (list s))
(t (append (rester (car s))
(rester (cdr s))))))
41デフォルトの名無しさん:05/01/30 03:23:41
>>40とほぼ同じだが、こちらのほうが再帰が浅くすむ。
(defun rester (s)
(mapcan #'(lambda (e)
(cond ((null e) nil)
((atom e) (list e))
(t (rester e))))
s))
42デフォルトの名無しさん:05/01/30 05:50:34
(defun rester (x)
(if (atom x)
`(,x)
(mapcan #'rester x)))
43デフォルトの名無しさん:05/01/30 12:46:16
【問題006】getfの文法は getf plist indicator &optional default => value
だが、返り値valueだけでは、indicatorで指定されたプロパティが存在し、
その値がたまたまデフォルト値defaultと同じというケースと、プロパティ自体
が存在しないためデフォルト値が返されたケースの区別をすることは
できない。この区別ができるgetfに代わる関数を定義せよ。
44デフォルトの名無しさん:05/01/31 09:37:47
(defun getp (plist indicator &optional default)
  (multiple-value-bind (indicator value tail)
      (get-properties plist `(,indicator))
    (if tail
        (values value tail)
        (values default nil))))
45デフォルトの名無しさん:05/02/01 08:21:18
【問題007】整数を要素とするリストを引数として受け取り、奇数である要素
だけを集めてリストととして返す関数collect-odd-numbersを定義せよ。
46デフォルトの名無しさん:05/02/01 14:14:07
(defun collect-odd-numbers (integers)
  (cond
    ((null integers) '())
    ((oddp (car integers))
     (cons (car integers) (collect-odd-numbers (cdr integers))))
    (t (collect-odd-numbers (cdr integers)))))
47デフォルトの名無しさん:05/02/01 17:22:03
なんでわざわざ自分でイテレータ書くわけ?
便利関数使えよ
そういった楽をすることもスキルのうちでしょ
48デフォルトの名無しさん:05/02/01 18:18:57
わざわざ関数にしないだろ、こんなの。
(remove-if 'evenp '(1 2 3 4 5))
49デフォルトの名無しさん:05/02/01 21:57:57
【問題008】dotted listの終端のアトムをnilに破壊的操作で書き換える関数chop
を書きなはれ。
(defun chop (list) ...)
(let ((a (list* 0 1 2 3)))
  (chop a)
  a) => (0 1 2)
50デフォルトの名無しさん:05/02/01 22:18:42
(chop (list* 0 1 2)) => 2 という仕様がいいんでねぇの?
51デフォルトの名無しさん:05/02/02 01:27:52
nilが渡されたらどうすんの?
52デフォルトの名無しさん:05/02/02 08:48:38
(defun chop (list)
  (prog1 (last list 0)
    (nconc list nil)))

(defun chop (list)
  (let ((last (last list)))
    (prog1 (cdr last)
      (when last
        (rplacd last nil)))))

(chop nil) => nil
53デフォルトの名無しさん:05/02/03 09:52:01
【問題009】mapcanと同様な操作を非破壊的に行う関数mapappendを定義せよ。
54デフォルトの名無しさん:05/02/03 20:19:55
>>47 イテレータってなんどすか?
55デフォルトの名無しさん:05/02/04 00:21:14
>>53
(defun mapappend (fn &rest lsts) (apply #'append (apply #'mapcar fn lsts)))
56デフォルトの名無しさん:05/02/04 03:12:18
【問題010】
a) リストの先頭から要素をn個ずつリストにする関数sliceを定義せよ。
(slice 3 '(1 2 3 4 5 6 7 8 9)) => ((1 2 3) (4 5 6) (7 8 9))

b) リストの先頭から要素を2つずつconsにする関数slice-pairを定義せよ。
(slice-pair '(a b c d e f g h)) => ((a . b) (c . d) (e . f) (g . h)))

57デフォルトの名無しさん:05/02/04 08:36:36
>>54 反復子と訳すこともある。今回の場合は「繰り返し処理」くらいの意味。
58デフォルトの名無しさん:05/02/04 10:37:31
>>56
(defun slice (n lst)
(labels
((f1 (n)
(if (consp lst)
(if (> n 0)
(cons (car lst)
(progn (setq lst (cdr lst)) (f1 (- n 1)))))))
(f2 () (if (consp lst) (cons (f1 n) (f2)))))
(f2)))

(defun slice-pair (lst)
(if (consp lst)
(cons (cons (car lst) (cadr lst)) (slice-pair (safe-cddr lst)))))

うーん、へたれなので適当ですが。
これでは効率が悪いので、もっときちんとしたものは別の人が書いてちょうだい。
59デフォルトの名無しさん:05/02/04 11:30:14
>>56

(defun slice* (f n lis)
(reverse (apply #'mapcar f
(do ((in lis (nthcdr n in))
(out (make-list n) (mapcar #'cons (subseq in 0 n) out)))
((null in) out)))))

(defun slice (n lis) (slice* #'list n lis))
(defun slice-pair (lis) (slice* #'cons 2 lis))
60デフォルトの名無しさん:05/02/04 12:52:59
>>59
これ面白いですね。まずn本のリストに要素を分配し、
次にそれを薄くスライスして結果をつくるわけですね。
61デフォルトの名無しさん:05/02/05 03:19:57
>>57 わざわざありがとうございます。
62デフォルトの名無しさん:05/02/05 07:57:14
(defun nthcar (n l)
(cond ((null l) nil)
((<= n 0) nil)
(t (cons (car l)
(nthcar (- n 1)
(cdr l))))))
(defun slice (n l)
(if (null l) l
(cons (nthcar n l)
(slice n (nthcdr n l)))))
63デフォルトの名無しさん:05/02/05 08:09:02
(defun slice-pair (l)
(if (null l) l
(let ((p (nthcar 2 l)))
(cons (cons (car p) (cadr p))
(slice-pair (nthcdr 2 l))))))
;; or
(defun slice-pair (l)
(mapcar (lambda (p) (cons (car p) (cadr p)))
(slice 2 l)))
64デフォルトの名無しさん:05/02/05 13:09:39
Use the loop, Luke!
(defun slice (n list)
  (loop for list on list by #'(lambda (list) (nthcdr n list))
        collect (if (> (length list) n)
                    (subseq list 0 n)
                    list)))
(defun slice-pair (list)
  (loop for (a b) on list by #'cddr
        collect (cons a b)))
65デフォルトの名無しさん:05/02/06 04:58:17
スペースでインデントしても無駄なのね・・・
66デフォルトの名無しさん:05/02/06 09:37:44
&nbsp;でインデントすればいいんじゃなかったっけ。
全角スペースと違ってコピペにもやさしい。


 いうわけで
  テスト。
67デフォルトの名無しさん:05/02/06 09:38:24
スペースを に置換すべし。
6867:05/02/06 09:40:42
アフォなことしちまった。>>66の言う通り。
69デフォルトの名無しさん:05/02/06 09:49:19
【問題011】葉が実数である木から最大値を持つ葉を探して返す関数tree-maxを定義せよ。
(tree-max '(1 (2) ((3)) (4 5))) => 5
70デフォルトの名無しさん:05/02/06 11:19:51
(defun tree-max (l)
  (labels ((maxx (a b)
                 (cond ((not (realp a)) b)
                       ((not (realp b)) a)
                       (t (max a b)))))
    (if (null l) l
      (let ((i (car l)) (rest (cdr l)))
        (cond ((realp i) (maxx i (tree-max rest)))
              ((listp i) (maxx (tree-max i)
                               (tree-max rest)))
              (t (tree-max rest))))))
71デフォルトの名無しさん:05/02/06 13:46:54
(defun tree-max (list)
  (loop for elt in list
        if (realp elt) maximizing elt
        else if (consp elt) maximizing (tree-max elt)))
72デフォルトの名無しさん:05/02/06 13:56:22
>>71 (tree-max '(1 . 2)) -> error
73デフォルトの名無しさん:05/02/06 14:01:37
(defun tree-max (tree)
  (if (atom tree)
      tree
      (let ((l (tree-max (car tree)))
            (r (tree-max (cdr tree))))
        (if (realp l)
            (if (realp r)
                (if (< l r)
                    r
                    l)
                l)
            r))))
74デフォルトの名無しさん:05/02/09 01:47:45
【問題012】
JAVAやCにおけるfor文と似たようなforを定義してください
75デフォルトの名無しさん:05/02/09 03:02:50
もっとちゃんと定義しろよ。問題として不適切。
出題者が出題にふさわしいレベルに達していないと見た。
初心者が自分の使いたいマクロを作って欲しいだけだろ。
76デフォルトの名無しさん:05/02/09 12:40:41
(defmacro for (var test step &rest forms)
  (destructuring-bind (name value) var
    `(do ((,name ,value ,step))
      ((not ,test) nil)
      ,@forms)))
      
(for (i 0) (< i 10) (1+ i)
  (print i))
>> 0 
>> 1 
>> 2 
>> 3 
>> 4 
>> 5 
>> 6 
>> 7 
>> 8 
>> 9 
=> NIL
77デフォルトの名無しさん:05/02/09 15:45:23
【問題013】condを定義せよ。仕様は次のページを参照のこと。
http://www.lispworks.com/documentation/HyperSpec/Body/m_cond.htm
78デフォルトの名無しさん:05/02/09 22:38:04
(丸投げかよ)
79デフォルトの名無しさん:05/02/09 22:40:39
>>69 問題5で作った関数にmaxをapplyするのじゃだめなのか?
80デフォルトの名無しさん:05/02/09 22:52:55
condなんて元から定義されてるから何もしないのが答え。
81デフォルトの名無しさん:05/02/09 22:59:37
>>78 (バカかよ) 仕様書があればそれを使うのが一番いいだろ。
>>79 その場合の損得勘定を説明してみろ。
>>80 その程度しか言えないのなら、だまってろ。
82デフォルトの名無しさん:05/02/09 23:15:05
>>81
> >>78 (バカかよ) 仕様書があればそれを使うのが一番いいだろ。

その理屈でいうと元からあるものはそれを使うのが当然いいわけだが。バカすぎ。


83デフォルトの名無しさん:05/02/09 23:19:13
今度やるよ
84デフォルトの名無しさん:05/02/09 23:27:23
>> 82
> その理屈でいうと元からあるものはそれを使うのが当然いいわけだが。
論理のすり替えに聞こえます。

condを実装してみたからといって、その俺condをそれ以降使えとは誰も言っていません。
condを実装してみること、それ自体でCommon Lispに習熟するうえでプラスになる
ことがあるのではないですか? 言語機能を理解するうえで、自分で実装するとしたら
どうするかなと考えてみるのって、けっこう役にたちますよ。
85デフォルトの名無しさん:05/02/09 23:32:30
(defun 今度 (s)
  (cond ((null s) '今度)
        (t (今度 (cdr (s))))))
86デフォルトの名無しさん:05/02/10 00:49:20
>>84
そんなの勝手にやればいいことで、このスレ的に求めることではないと思うが。
早い話013は駄問。
87デフォルトの名無しさん:05/02/10 02:40:16
【問題014】
LISTの初めのelementを消し去る関数を定義してください。

例えば、
>(set x '(a b c))
>(deletecar x)
(b c)
>x
(b c)

みたいな。LISPの構造がよく分かる。
88デフォルトの名無しさん:05/02/10 03:54:41
なんか偉そうな奴だな。deque作れの方がマシと思うが。
89デフォルトの名無しさん:05/02/10 07:13:10
(defmacro cond (&rest clauses)
  (unless (endp clauses)
    (let ((clause (first clauses)))
      (let ((test (first clause))
            (forms (rest clause)))
        (if (endp forms)
            (let ((result (gensym)))
              `(let ((,result ,test))
                (if ,result
                    ,result
                    (cond ,@(rest clauses)))))
            `(if ,test
              (progn ,@forms)
              (cond ,@(rest clauses))))))))

(defmacro deletecar (place)
  `(pop ,place))
マクロでもいいでしょ。
90デフォルトの名無しさん:05/02/10 07:15:31
>>86
> そんなの勝手にやればいいことで、このスレ的に求めることではないと思うが。
「このスレ的に求められている問題」を一発びしっとお願いします。
91デフォルトの名無しさん:05/02/10 07:20:39
(defun deletecar (x)
(rplaca x (cadr x))
(rplacd x (cddr x))
x)
92デフォルトの名無しさん:05/02/10 07:34:36
でもrplaca, rplacdを使うとなると、例にある
>(set x '(a b c))
>(deletecar x)
のコンスタントリストをいじくることになるで。
93デフォルトの名無しさん:05/02/10 08:44:29
>>87
こんなの普通使う?
偉そうなわりに、実際にやることとやらないことのセンスに無頓着じゃね?
肝心の例でもlisperはやらなさそうなミスしてるし。
94デフォルトの名無しさん:05/02/10 09:18:30
>>93 87はLisp初心者のような印象を受けるが、たとえそうだとしても、かまわんだろ。
そんなに偉そうに感じるか? 単なるじゃれあいなんだから、気楽に行こうや。
95デフォルトの名無しさん:05/02/10 11:37:15
普通(setq x (cdr x))ですますんじゃない?
96デフォルトの名無しさん:05/02/11 21:57:55
【問題005+】

(a 3 (c d(5)))というリストがある。ここから数字だけを集めて(3 5)を返す
number-collectをmapcanを使って書いてください。

97デフォルトの名無しさん:05/02/11 23:51:36
(defun collect-if (predicate list)
  (mapcan #'(lambda (item)
              (if (consp item)
                  (collect-if predicate item)
                  (when (funcall predicate item)
                    `(,item))))
          list))
(defun number-collect (list) (collect-if #'numberp list))
98デフォルトの名無しさん:05/02/11 23:57:36
(defun number-collect (list)
 (mapcan #'list (loop for elt in list
            if (listp elt) nconc (number-collect elt)
            else if (numberp elt) collect elt)))
99デフォルトの名無しさん:05/02/12 02:31:51
【問題014】
記号に束縛された値でソートする関数を作る。
ex) (setq a 1 b 2 c 3)
nbsp;nbsp;nbsp;nbsp;nbsp;(bound-value-sort '(b c a)) -> (a b c)

あと、出題者は講評しなくていいの?
100デフォルトの名無しさん:05/02/12 02:33:36
&入れ忘れたしsageてるし。

ex) (setq a 1 b 2 c 3)
     (bound-value-sort '(b c a)) -> (a b c)
101デフォルトの名無しさん:05/02/12 03:40:36
predicate使えないと不便じゃない?

(defun bound-value-sort (seq pred)
  (sort seq
        #'(lambda (x y)
            (funcall pred (symbol-value x) (symbol-value y)))))
102デフォルトの名無しさん:05/02/12 07:48:29
>>99 出題者は講評しなくていいの?
したい人はすればいいでしょう。

(defun bound-value-sort (sequence predicate)
(sort sequence predicate :key #'symbol-value))
103デフォルトの名無しさん:05/02/12 07:59:22
(defun bound-value-sort (sequence &optional (predicate #'<))
  (sort sequence predicate :key #'symbol-value))
104デフォルトの名無しさん:05/02/12 08:14:46
(bound-value-sort '(b c a))として自作関数を呼び出すのと
(sort '(b c a) #'< :key #'symbol-value)という標準関数の呼び出しの場合、
状況にもよるが、俺なら一般的に後者を選ぶかな、字面がすこし長くなるけどね。
そのほうが、ソースの一箇所だけを見て何をしているのかが分かるから。
105デフォルトの名無しさん:05/02/12 08:32:23
symbol-value-sortという名前のほうがいいと思います。
106デフォルトの名無しさん:05/02/12 22:00:21
:keyなんてキーワード引数があるのか。Commoh Lispの仕様は膨大だな。いやマジで。
107デフォルトの名無しさん:05/02/13 03:48:09
突然、おじゃまします。LISP初心者の者ですが、質問してもよろしいでしょうか?

(defun make-adder (n)
#'(lambda (x) (+ x n)))

ってあって、これを

>(setf add3 (make-adder 3))とすると、

>(funcall add3 2)
5

ってなりますよね。

>(funcall add3)
って入力したときに、nの値(3)をそのまま返すようにこれを変更するこ
とって出来ないでしょうか?
10899:05/02/13 04:21:10
:keyを使えばよかったのか。自分は、
(mapcan 'list (mapcar 'eval seq) seq)
なんてのを属性リストにして値をソートしたものをGETで引いてたんだけれど、
あんまりスマートじゃなかったな。
109デフォルトの名無しさん:05/02/13 04:36:13
>>107
何もせずに3を返す関数は? というのを考えれば答えは自明。
110デフォルトの名無しさん:05/02/13 05:02:23
(defun make-adder (n)
#'(lambda (&optional x) (if (null x) n (+ x n))))
111デフォルトの名無しさん:05/02/13 12:16:49
(defun make-adder (n)
#'(lambda (&optional (x 0)) (+ x n)))
112デフォルトの名無しさん:05/02/14 00:49:32
>>110,111

107です。うまくいきました。解答ありがとうございます。
113デフォルトの名無しさん:05/02/14 05:42:40
ひとつ質問させて頂いてもよろしいでしょうか?

(product #'list '(10 30 50) '(a b c)) 
=> ((10 a) (30 a) (50 a) (10 b) (30 b) (50 b) (10 c) (30 c) (50 c))

となる様に定義をしたく

(defun prod (procedure ls1 ls2)
(do ((copy1 ls1 (rest copy1))
(result '() (cons (funcall procedure (car copy1) (car ls2)) result)))
((endp copy1) (reverse result))))

と何とか書いたのですが、これだと
(prod #'list '(1 2 3) '(a b c))
=>((1 A) (2 A) (3 A))
となってしまいます。

2つ目のリストの中もloopさせるにはどの様にしたら良いのでしょうか?
114デフォルトの名無しさん:05/02/14 06:41:25
(defun prod (proc lst1 lst2)
   (mapcan (lambda (x)
             (mapcar (lambda (y) (funcall proc x y)) lst2))
           lst1))

(prod #'list '(1 2 3) '(a b c))
=> ((1 a) (1 b) (1 c) (2 a) (2 b) (2 c) (3 a) (3 b) (3 c))
115113:05/02/14 07:21:25
114さん、素早い回答ありがとうございました。
大変助かりました!!
116デフォルトの名無しさん:05/02/15 02:38:52
なんかスレの主旨から外r
117デフォルトの名無しさん:05/02/17 13:17:18
ネタ切れぽいね……。

【問題015】
リストの要素の重複を除く関数uniqを作れ。順序の保存は問わない。
引数 :test で同一性を判定する関数を指定できることが望ましい。
(uniq '(a b c d a b x y)) => (a b c d x y)

標準であるかと思って一応探したけど見つかんなかった。もしあったらごめん。
118デフォルトの名無しさん:05/02/17 14:19:39
(remove-duplicates '(a b c d a b x y)) => (C D A B X Y)

(defun uniq (list &key (test #'eql))
(let ((table (make-hash-table :test test))
(result '()))
(dolist (x list)
(unless (gethash x table)
(push x result)
(setf (gethash x table) t)))
(nreverse result)))
119デフォルトの名無しさん:05/02/22 06:32:30
いつのまにか人が増えてる

【問題016】
特定の型(stringとかinteger)の値しか格納できないリストを定義せよ。
120デフォルトの名無しさん:05/02/22 09:50:46
【問題016-a】
「特定の型(stringとかinteger)の値しか格納できないリスト」に
必要なオペレーションを定義せよ。

121デフォルトの名無しさん:05/02/22 11:14:14
>>120
gj
122デフォルトの名無しさん:05/02/27 16:10:09
終了?
123デフォルトの名無しさん:05/03/02 03:27:38
問題017

ひらがなをカタカナにする関数
(hira-kana "あいうえお") -> "アイウエオ"
を定義せよ。入力される文字列はすべてひらがなとみなしてよい。
124デフォルトの名無しさん:05/03/02 14:36:28
(defun hira-kana (str)
(map 'string (lambda (x) (cdr (assoc x *kana*))) str))

*kana*はこんな感じの平仮名から片仮名へのalist。
(setf *kana* '((#\あ . #\ア) (#\い . #\イ) ...))

処理系が仮名を一文字として扱えること。
125デフォルトの名無しさん:05/03/02 19:08:54
こういうalistのテーブル検索ってコンパイラは最適化するの?
自分でhashテーブルに変えるとかしないとだめ?
商用の処理系とかがどの程度最適化されるのか興味あるんですが。
126123:05/03/03 03:34:47
(defun hira-kana (str)
(concatenate 'string
(mapcar #'(lambda (x)
(code-char (+ (char-code x) 161)))
(concatenate 'list str))))
127デフォルトの名無しさん:05/03/03 05:30:50
(hira-kana "ぬるぽ")
"ヌリポ"

  ∧_∧
 ( ´∀`) <ぬりぼ
128デフォルトの名無しさん:05/03/05 01:45:22
(ぬるぽ)

   ( ・∀・)   | | ガッ
  と    )    | |
    Y /ノ    人
     / )    <  >__Λ∩
   _/し' //. V`Д´)/
  (_フ彡        /  ←>>127

nil
129デフォルトの名無しさん:05/03/05 08:54:48
>>123
(defun hira-kana (str)
(map 'string #'(lambda (c) (code-char (+ (char-code c) 161))) str))

xyzzy-lispで動作確認。
130デフォルトの名無しさん:05/03/05 09:41:14
>>129
ほんとに、ちゃんと確認した?

(hira-kana "ぬるぽ")
ってやってみそ。
131129:05/03/08 19:09:51
>>130
( ゚Д゚)Σ

吊って来る。

>>124みたいに対応表作らなきゃ駄目なのか?
132デフォルトの名無しさん:05/03/18 03:17:28
全角カナは「ミ」と「ム」の間に謎の一文字があるので
その「む」以降は1を足せばいけますよ
133デフォルトの名無しさん:05/03/18 05:30:35
そんな特定の文字エンコーディングに依存したものを出されても。

134デフォルトの名無しさん:05/03/19 01:57:01
xyzzy限定で良いのなら

(defun hira-kana (str)
(map 'string #'(lambda (c) (unicode-char (+ (char-unicode c) 96))) str))
135デフォルトの名無しさん:2005/04/03(日) 16:38:19
clispで定義された
(defunc func()(print "func"))->func
という適当な関数を定義してバイトコンパイルしたものを
VC++から呼び出すとか出来ます?パイプでもなんでもいいんですが、
出来ますか?
136デフォルトの名無しさん:2005/04/03(日) 23:34:00
>>135
defuncだとあまりにも適当すぎるので関数が定義できません。
137デフォルトの名無しさん:2005/04/04(月) 05:24:57
>>135
defunぐらい間違えずにかけ

>>136
突込みがくだらん、失せろ
138デフォルトの名無しさん:2005/05/07(土) 14:27:12
defmacro
139デフォルトの名無しさん:2005/05/08(日) 13:19:26
de marco
140デフォルトの名無しさん:2005/05/08(日) 22:08:11
(define de define)
(define dm define-macro)
141デフォルトの名無しさん:2005/05/08(日) 22:32:44
python challengeをcommon lispでやってみた人いる?
142デフォルトの名無しさん:2005/05/08(日) 22:45:53
python challengeは問題が厨房臭い
143デフォルトの名無しさん:2005/05/28(土) 19:31:12
保守
144デフォルトの名無しさん:2005/06/24(金) 17:46:15
問題018
リストL=((a b) c (d(e f)))
このリストのすべての要素の個数を求めよ。(リスト中のリストの要素をもとめるプログラム)
145デフォルトの名無しさん:2005/06/24(金) 17:47:09
age
146デフォルトの名無しさん:2005/06/24(金) 18:07:00
要素ってのが不明瞭だがこうか?
(defun mycount (l)
(apply #'+ (mapcar (lambda (x) (if (listp x) (mycount x) 1)) l)))
147デフォルトの名無しさん:2005/06/26(日) 17:54:14
再帰でガシガシ書きそうなところを、mapcar でさらりと1行にまとめるのは、
かっこいいなあ。
148デフォルトの名無しさん:2005/06/28(火) 16:37:22
>>146
乙。
149デフォルトの名無しさん:2005/09/17(土) 07:32:19
保守ついでに。ここ↓のお題 1-10 を CL で書くっつーのはどうかな。

ttp://www.python.jp/Zope/articles/SoftwareTools
150デフォルトの名無しさん:2005/09/22(木) 12:21:28
経路探索のプログラムを教えてください
考えてもまったくわからずに困っているので…
151デフォルトの名無しさん:2005/09/22(木) 21:40:56
>>150
バックトラックとか動的計画法とかの言葉は知ってる?
152デフォルトの名無しさん:2005/09/25(日) 13:32:48
>>151
ぜんぜんわかりません…
まったくの初心者です
153デフォルトの名無しさん:2005/09/25(日) 15:00:29
>>150,152
だったらマルチポストする前に教科書でも読んで出直して来い。
154デフォルトの名無しさん:2005/09/27(火) 14:36:17
>>153
ある程度基礎は勉強してきました!
お願いします!
155デフォルトの名無しさん:2005/09/27(火) 15:10:48
微積分を習うのにかけ算も知らないで勉強してきましたといってるようなもので、
まるでお話にならない。もっとまともな勉強して出直しておいで。
156デフォルトの名無しさん:2005/09/27(火) 19:45:08
>>155
専門用語出てきても調べるんで、さらっとでもいいんで
お願いします!
157デフォルトの名無しさん:2005/09/27(火) 19:59:40
んじゃ経路探索について調べろ。おわり。
158デフォルトの名無しさん:2005/09/28(水) 04:13:23
>>156
> 専門用語出てきても調べるんで、
>>151 を調べるといい。
あるいはその前に深さ優先探索と幅優先探索あたり?

ここで返事を待つより Google で出てきたのを上から順番に読んでった方が多分早いよ。
つまり、私や他の誰かが、どれくらいかも判らないあなたのレベルに合わせて
説明をひねり出すより、あなたが自分のレベルにあった説明を探した方が早いよ。
少なくとも何かを読んであなた自身が判ったか判らなかったかはあなたには判るんだから。

……ていうか別にこれ Common Lisp 固有の話題じゃあないじゃないか。
159デフォルトの名無しさん:2005/11/03(木) 22:50:40
問題019
与えられた集合のべき集合を求める関数powersetを定義せよ。

(powerset '(a b c))
=> (() (a) (b) (c) (a b) (b c) (c a) (a b c))
160デフォルトの名無しさん:2005/11/03(木) 23:02:10
>>159
集合だから順序は不問だよね。
(defun power (x)
 (if (null x)
   '(nil)
  (let ((y (power (cdr x))))
   (append y (mapcar #'(lambda (z) (cons (car x) z)) y)))))
161デフォルトの名無しさん:2005/11/03(木) 23:13:06
こちらのほうがすっきりかな。
(defun power (x)
 (if (null x)
   '(nil)
  (mapcan #'(lambda (y) (list (cons (car x) y) y))
        (power (cdr x)))))
162デフォルトの名無しさん:2005/11/05(土) 13:05:33
(defun powerset (x)
(fold (lambda (y z) (fold (lambda (a b) (cons (cons y a) (cons a b))) '() z)) '(()) x)
163デフォルトの名無しさん:2005/11/05(土) 14:24:41
スレ違い
164デフォルトの名無しさん:2005/11/05(土) 14:35:01
>>162
異教徒
165デフォルトの名無しさん:2005/11/05(土) 19:40:18
異教徒の特徴
* 引数の名前に lis lst のように間数名とかぶらない不自然な名前を使う
 Common Lisp では変数と関数は名前空間を共有してないのにね
* 繰り返しを使わず labels & 末尾再帰
 Common Lisp は末尾呼び出しの最適化を保証してないよ
* SRFI の手続き (特に SRFI-1) を使う
 SRFI 等の外部モジュールを使う方法は R5RS では定義されてないじゃない
166デフォルトの名無しさん:2005/11/05(土) 19:50:45
異教徒の特徴(追加)
* lambda 式の前の #' を省略する。
 (ANSI Common Lisp では OK になったが古くからの信徒は #' を省略しない)
167デフォルトの名無しさん:2005/11/05(土) 20:20:05
>>166
それだと多くの処理系の作成にも異教徒が入り込んでることになるが
168デフォルトの名無しさん:2005/11/05(土) 20:55:08
>>167
処理系は異教徒表記を受け入れる(受け入れなければANSI違反なので)が、
多くの処理系作成者は自分でプログラムを書くときには #' を省略しない。
Common Lisp教は寛容なので異教徒にも優しくしてやっているのだ。
169デフォルトの名無しさん:2005/11/05(土) 21:11:53
>>168
じゃなくて、処理系自体の実装で #' が省略されてるのが多々あるってこと
170デフォルトの名無しさん:2005/11/06(日) 01:36:51
昔は入れてたけど今はlambdaの#'は使わないな。
逆にそうでないとわかるものを使うときに#'を入れるか、lambda自体をdefmacroする。
171デフォルトの名無しさん:2005/11/11(金) 14:11:53
(DEFUN MYSTERY(S)
(COND ((NULL S)0)
((ATOM S)1)
(T(MAX(ADD1(MYSTERY(CAR S)))
(MYSTERY(CDR S))))))
172デフォルトの名無しさん:2005/11/13(日) 12:55:26
↑を評価してくれにょ
173デフォルトの名無しさん:2005/11/14(月) 00:34:27
(コンパイラスレを荒らしてた奴が出てきたか…?)
174デフォルトの名無しさん:2006/01/03(火) 07:31:25
何か人いないみたいだから、自分で自分にお題
【2ch に Lisp コードを貼付ける時用の pprint】

仕様:
- 関数またはマクロとして実装
- 整形対象のプログラムは quote して、引数として渡す
- pprint を通す
- 出力は小文字で
- 行頭スペースは & n b s p ; に変換する
- 行幅は適当
- あと何か思いついたら付け足す
175デフォルトの名無しさん:2006/01/03(火) 15:13:17
文字列をとる2ch貼り付け用のはもう作ってる。それにppの出力を入れれば
いいんだけど、elispで書いちゃったからここには貼れないなw
176デフォルトの名無しさん:2006/02/26(日) 12:59:35
カラアゲ保守
177デフォルトの名無しさん:2006/02/28(火) 23:38:47
Lambdaってタイプするのめんどくね?保守
178デフォルトの名無しさん:2006/03/01(水) 16:05:09
>>177
emacs の abbrev/dabbrev 使っているから別に
179デフォルトの名無しさん:2006/03/01(水) 16:25:47
(defmacro l (&body body)
`(lambda ,@body))

ってやったら怒られた。いまは反省している。
180デフォルトの名無しさん:2006/03/04(土) 03:37:12
(defmacro λ (&body body)
`(lambda ,@body))

だろ。
181デフォルトの名無しさん:2006/03/04(土) 04:51:08
allegro以外で大文字小文字区別するリーダーが標準かオプションで
ついてる処理系ってあるの?
182デフォルトの名無しさん:2006/03/04(土) 12:56:53
>>181
Common Lisp の標準。readtable-case あたりを調べるべし。
個人的には :invert を常用している。
183デフォルトの名無しさん:2006/03/04(土) 13:18:45
オプションつーか,Common Lisp は大文字小文字を区別できる.
標準の設定が

読み込み時: 大文字に揃える
出力時: 大文字に揃える

になってるだけ.(setf (readtable-case *readtable*) :preserve) ってすりゃ
大文字小文字区別できるよ.ただし標準の CL の変数や関数はすべて大文字な
のでCAR とか *READTABLE* とか書く必要がでてくるのでダル.:invert すると
symbol-name とかがいけてない.

Allegro のような使い心地のは CLISP の -modern モードかな?標準の組み込
みのシンボル小文字で,大文字小文字は区別.かつ,パッケージ毎に切り替え
られる.
184デフォルトの名無しさん:2006/03/05(日) 23:21:36
標準の機能であったんですか。ありがとうございます。
まだまだ知らないことが沢山……
185デフォルトの名無しさん:2006/03/18(土) 18:38:47
λ門保守
186デフォルトの名無しさん:2006/04/07(金) 00:46:23
やばっ、酔ってたとはいえ入社式がλ社式に見えた…
187デフォルトの名無しさん:2006/04/07(金) 01:35:14
ねーよwwww
188デフォルトの名無しさん:2006/04/07(金) 02:37:48
幻のλ社は実在した!!
http://www.densei-lambda.com/indexj.html
189デフォルトの名無しさん:2006/04/07(金) 03:01:09
lambdaでググると、世界中のλ社がリストアップされるよ。
λパワーだったりλアメリカだったりλアンテナだったり・・・。
190デフォルトの名無しさん:2006/04/07(金) 11:57:49
たまに村田がλに思えてくるよ
191デフォルトの名無しさん:2006/04/08(土) 00:38:35
HalfLife?
192デフォルトの名無しさん:2006/04/08(土) 01:43:18
λっちゃ
193デフォルトの名無しさん:2006/04/18(火) 13:10:44
三菱車ギャランΛ。
194デフォルトの名無しさん:2006/06/24(土) 14:03:41
>>193
> 三菱車ギャランΛ。
年齢バレますよ。オレモナー
195デフォルトの名無しさん:2006/07/21(金) 15:53:34
196デフォルトの名無しさん:2006/07/22(土) 19:13:31
n種類の要素から異なるk個を選んで順列を作ると
P(n,k)=n!/k! 通りの順列を作ることができます。

P(n,k)通りの順列を全て含んでいる長さP(n,k)の円順列を作るには
どうすれば良いのでしょうか?
197デフォルトの名無しさん:2006/07/22(土) 19:15:47
また宿題かw
198デフォルトの名無しさん:2006/07/23(日) 03:31:07
うーん練習がわりに作ろうと思いましたがリアル厨房なんで
;; P(n,k)
(defun f (n) (if (<= n 1) n (* n (f (1- n)))))
(defun p (n k) (/ (f n) (f k)))
と与えられた定義まではできたのですが「P(n,k)通りの順列を全て含んでいる長さP(n,k)の円順列を作る」の部分の意味がわかません。Wikipedia で検索しましたが…。来週の水曜日に数学の先生にでも聞いてみようかなぁ。
199デフォルトの名無しさん:2006/07/23(日) 11:53:39
円順列を作るってのがよくわからんなあ

(foo 3 '(a b c d e))
=> #1=((a b c) (a b d) (a b e) (a c d) (a c e) (a d e) (b c d) (b c e) (b d e) (c d e) . #1#)

みたいな関数を作れってこと?
まあいかにも宿題っぽくはある。
200デフォルトの名無しさん:2006/07/23(日) 12:00:42
円順列として同じもの((a b c)と(b c a)みたいな)を取り除いたリストを作れって問題かな?
201デフォルトの名無しさん:2006/07/23(日) 16:10:48
>>196
間違い
P(n,k)=n!/(n-k)!

それから答えは以下の等式をじっとにらむと
見つかるかもしれない
P(n,k)=P(n-1,k)+P(n-1,k-1)*k
202デフォルトの名無しさん:2006/08/13(日) 01:13:40
保守
203デフォルトの名無しさん:2006/09/18(月) 04:04:35
入門書記念hosu
204デフォルトの名無しさん:2006/09/29(金) 23:17:44
入門Common Lisp~関数型4つの特徴とλ計算
http://book.mycom.co.jp/book/4-8399-2081-8/4-8399-2081-8.shtml
205デフォルトの名無しさん:2006/10/13(金) 19:34:35
206デフォルトの名無しさん