2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

【一日】CommonLisp【一門】

1 :デフォルトの名無しさん:05/01/25 02:25:15
るーる
・本スレに敬意を持つこと
・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")

10 :書けませんよ。。。&rlo;止停:&lro;:05/01/26 18:17:33
真・スレッドストッパー。。。( ̄ー ̄)ニヤリッ

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


20 :16: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
スペースを に置換すべし。

68 :67: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)をそのまま返すようにこれを変更するこ
とって出来ないでしょうか?

108 :99: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))


115 :113: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テーブルに変えるとかしないとだめ?
商用の処理系とかがどの程度最適化されるのか興味あるんですが。

126 :123: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 "ぬるぽ")
ってやってみそ。

131 :129: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))

36 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)