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

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

CommonLisp Scheme Part12

1 :デフォルトの名無しさん:04/11/12 12:16:06
過去スレ
Part1: http://piza2.2ch.net/tech/kako/987/987169286.html
Part2: http://pc.2ch.net/tech/kako/1002/10025/1002584344.html
Part3: http://pc.2ch.net/tech/kako/1008/10082/1008220265.html
Part4: http://pc.2ch.net/tech/kako/1016/10162/1016211619.html
Part5: http://pc3.2ch.net/tech/kako/1023/10230/1023091882.html
Part6: http://pc3.2ch.net/tech/kako/1031/10315/1031560687.html
Part7: http://pc5.2ch.net/tech/kako/1042/10421/1042167213.html
Part8: http://pc5.2ch.net/tech/kako/1058/10582/1058263391.html
Part9: http://pc2.2ch.net/test/read.cgi/tech/1069594582/
Part10: http://pc5.2ch.net/test/read.cgi/tech/1075630259/
Part11: http://pc5.2ch.net/test/read.cgi/tech/1091456033/

関連リンクは>>2-10あたり

2 :デフォルトの名無しさん:04/11/12 12:17:42
□参考リンク□

日本Lispユーザ会(日本語)
http://jp.franz.com/jlug/index.html
ここにかなりの情報があります。
http://jp.franz.com/
削るとAllegro Common Lispのページへ

プログラミング言語Scheme(日本語)
ttp://www.sci.toyama-u.ac.jp/~iwao/Scheme/scheme.html
Schemeの人はまずここを見ましょう。

Lisper への道(日本語)
ttp://www.geocities.co.jp/SiliconValley-Oakland/1680/rakup.html
判りやすいLISP入門サイト。

Schemeへの道(日本語)
ttp://www.stdio.h.kyoto-u.ac.jp/~hioki/gairon-enshuu/SchemeNotes/scheme.html
ここはschemeの入門サイト。

3 :デフォルトの名無しさん:04/11/12 12:18:31
慶応の授業のページ・記号処理プログラミング 2001
http://buri.sfc.keio.ac.jp/lisp/menu.html

Practical Scheme(日本語)
ttp://www.shiro.dreamhost.com/scheme/index-j.html
「普通のやつらの上を行け」など、興味深い文書を沢山翻訳されてます。
(Gaucheという完成度の高いscheme処理系作者さんのページでもあります。)

Scheme Hash(英語)
http://okmij.org/ftp/Scheme/index.html
S式でXMLを使える様にするSXMLなど

John McCarthy's Home Page
http://www-formal.stanford.edu/jmc/
LISPの生みの親、J・マッカーシーのページだそうです。

Association of Lisp Users
http://www.alu.org/alu/home
米国のLispユーザ会

4 :デフォルトの名無しさん:04/11/12 12:19:14
□SICP関係□

SICP(英語)
http://mitpress.mit.edu/sicp/full-text/book/book.html
「計算機プログラムの構造と解釈」の原書です。
全てオンラインで読めます。

計算機プログラムの構造と解釈 第二版 (snip) に関連するホームページ
http://www.ipl.t.u-tokyo.ac.jp/sicp/

SICPの回答集
http://www.melt.kyutech.ac.jp/~gogogo/sicp_ex/
http://pluto.aurorasd.co.jp/~mkama/sicp/
http://www.ipl.t.u-tokyo.ac.jp/sicp/solution.root.html
http://www.sampou.org/scheme/sicp/answer/

5 :デフォルトの名無しさん:04/11/12 12:20:35
□その他□

Schemeで書かれた正規表現ライブラリ
ttp://www.cs.rice.edu/~dorai/pregexp/pregexp.html

幻の「入門Scheme」
ttp://www4.ocn.ne.jp/~inukai/scheme_primer_j.html
オンラインで読める

各種scheme処理系をcygwin上からビルドする方法など。
ttp://www.geocities.co.jp/SiliconValley-PaloAlto/7043/

Bit - Implantation compacte de Scheme
http://www.iro.umontreal.ca/~dube/
mini-schemeよりも小さい(?)bytecode変換系

Lisp 言語処理系: CAMPUS LIsP, Lemon version
http://aten.aial.hiroshima-u.ac.jp/~kakugawa/clisp/index-ja.shtml
Cコードによるわずか1000行の実装

Cliki
http://www.cliki.net/index
CommonLispのプログラムがたくさん紹介されているのでここを当たるべし。

6 :デフォルトの名無しさん:04/11/12 12:21:02
encyCMUCLopedia
http://www.isr.ist.utl.pt/library/docs/encycmuclopedia/doc/
cmucl以外でも有益なはず

CMUのLisp Repository
ftp://ftp.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/lisp/0.html
新旧様々なプログラムが置いてある

Tiny CLOS Tutorial
http://home.adelphi.edu/~sbloch/class/272/tclos/tutorial.shtml

Schemix
http://www.abstractnonsense.com/schemix/
Linuxのkernelへのパッチで、/dev/として扱えるTinyScheme

Bibliography of Scheme-related Research
http://library.readscheme.org/
Scheme関連の論文リンク集

7 :デフォルトの名無しさん:04/11/12 12:24:11
その他よさそうなリンク

awkで書かれたわずか500行のLispインタプリタ
awklispを読めばLispが理解できる
ttp://www.accesscom.com/~darius/

Emacs Lisp 2
http://pc2.2ch.net/test/read.cgi/tech/1068467385/

* Hotdog Scheme http://rover.cs.nwu.edu/~scheme/
 MS が金出してたみたい
* Bigloo http://www-sop.inria.fr/mimosa/fp/Bigloo/
 CLR 用のコードを吐けるようになったらしい

継続

なんでも継続
ttp://www.shiro.dreamhost.com/scheme/docs/cont-j.html
Schemeへの道:継続
http://www.stdio.h.kyoto-u.ac.jp/~hioki/gairon-enshuu/SchemeNotes/continuation.html
継続の使い方
http://www.geocities.co.jp/SiliconValley-PaloAlto/7043/index.html#continuation
継続の使用法
http://www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/block.html
CPS(継続渡しスタイル)の説明
http://www.csl.sony.co.jp/person/masui/Forum/data/20011215023622/
Kahua: 継続ベースのアプリケーションサーバー
ttp://www.kahua.org/

8 :デフォルトの名無しさん:04/11/12 12:24:33
仕様関係)
CLtL2: Common Lisp the Language 2nd edition
http://www-2.cs.cmu.edu/Groups/AI/html/cltl/cltl2.html
CLHS: Common Lisp Hyper Spec
http://www.ai.mit.edu/projects/iiip/doc/CommonLISP/HyperSpec/FrontMatter/Chapter-Index.html
R5RS: Revised(5) Scheme(ja)
http://www.sci.toyama-u.ac.jp/~iwao/Scheme/r5rsj/html/r5rsj.html

便利な情報リソース)
The Common Lisp Cookbook: いわゆる Cookbook
http://cl-cookbook.sourceforge.net/

小さい実装)
SECDR-Scheme: SECD machine model に基づく実装
ttp://lily.fan.gr.jp/~kmd/adhoc/view.rhtml?n=SECDR-Scheme_woyomu
Minischeme: 1 ファイルに凝縮された Scheme 処理系
http://tinyscheme.sourceforge.net/minischeme.tar.gz
TinyScheme: Minischeme を色々弄ったもの
http://tinyscheme.sourceforge.net/
KI-Scheme, AM-Scheme, etc...
http://www.nifty.com/download/dos/prog/lisp/
LispMe: Palm 上で動く Scheme 処理系. これも SECD virtual machine.
http://www.lispme.de/lispme/

9 :デフォルトの名無しさん:04/11/12 12:25:09
LISP Scheme Part9 (html化)
http://ruku.qp.tc/dat2ch/0403/01/1069594582.html

独習 Scheme 三週間
http://www.sampou.org/scheme/t-y-scheme/t-y-scheme-Z-H-1.html
Schemeの教科書

よろずや
http://www.geocities.co.jp/SiliconValley-SanJose/7474/
lispの実用的な情報が色々。

10 :デフォルトの名無しさん:04/11/12 12:26:25
連続投稿でひっかかるし関連リンクは別ページにおかないか?

11 :デフォルトの名無しさん:04/11/12 20:11:53
>>10
大いに賛成です。個人的には、ぜひともここ↓を活用・発展させていただきたく。
http://www.komaba.utmc.or.jp/~flatline/wiliki.cgi

12 :デフォルトの名無しさん:04/11/12 20:17:55
そことは余り関わりたくない。

13 :デフォルトの名無しさん:04/11/12 22:54:50
とりあえず個人ページの直リンはやめてくれないか
flatline自体コテハンみたいなものだとしても

14 :名無しさん@お腹いっぱい。:04/11/14 17:54:04
だからtemplateはジェネリックプログラミングでオブジェクト指向とは別物だっちゅ〜の!

15 :14:04/11/14 17:55:34
やっても〜た〜^^; 誤爆ごめん m(_ _)m

16 :デフォルトの名無しさん:04/11/14 17:56:12
きもいな

17 :デフォルトの名無しさん:04/11/17 08:41:05
ネタ切れみたいなのでお題を提供します。

リスト内の任意のシンボルに対して、unquote付加を自動的に行いたい
という要件が発生しました。
以下の様なただのリストの入力に対し、指定したシンボル全てにunquoteを付加し、
擬似リストとして返す関数quotifyを実装してください。
ただし、リスト内のlambda文の変数スコープ規則を解釈する事。

書式: (quotify <unquoteしたいシンボルを列挙したリスト> <入力リスト>)

呼び出し例:
(quotify '(proc list)
 '((lambda (f r rr list)
  (while (pair? list)
   (set! rr (cons (proc (car list)) '()))
   (if (pair? f) (set! r (set-cdr! r rr)) (set! r (set! f rr)))
   (set! list (cdr list)))
  f) '() '() '() list)))

期待する出力結果:
`((lambda (f r rr list)
 (while (pair? list)
  (set! rr (cons (,proc (car list)) '()))
  (if (pair? f) (set! r (set-cdr! r rr)) (set! r (set! f rr)))
  (set! list (cdr list)))
 f) '() '() '() ,list)

つまり、この出力をそのまま実行するとunquote部分がカレント環境で変換されます。
上の例の変数listの様にきちんとlambdaの中と外を区別する必要があります。
ただの変換なら簡単ですが、lambdaの解釈で多少複雑になると思います。

18 :デフォルトの名無しさん:04/11/17 09:35:27
マクロによってシンボルが束縛変数になるかどうか判定するのが不可能っぽい気がする。


19 :デフォルトの名無しさん:04/11/17 09:58:47
使う処理系によっては比較的簡単かもしれないな。
たとえばchez(petite)なら
(sc-expand '(let ((x 1)) (let ((y 1)) (+ x y) (proc list))))
-->
((lambda (#{x |?dp~%SaUTn<X\\*|})
 ((lambda (#{y |?dp~%SaUTn<X\\+|})
  (+ #{x |?dp~%SaUTn<X\\*|} #{y |?dp~%SaUTn<X\\+|})
   (proc list))
  1))
1)
てな感じだから
>lambda文の変数スコープ規則
ってやつは考えなくて良くなるような気がする。
ただ、sc-expandはquotifyマクロの展開中に使われてもトップレベルで展開してしまうので。
(let ((expr (quotify '(...) '(...)))) (expr ...))
みたいなやつはどうなるかな?
実験してみたいが、時間がないので直感だけですまね。

20 :19:04/11/17 10:04:37
あ、そうそう
>関数quotify
ってあるけど、quotifyが`(,proc ,list)みたいなものを返したとしても、これを評価するにはevalしないといけないと思うのだが、それは意図した事だろうか?それともquotifyマクロの書き間違いかな?

21 :デフォルトの名無しさん:04/11/17 18:14:22
返ってきた結果をそのまま評価するわけじゃないのかも。
他の macro から呼び出して使うとか。
# macro だから Schemer は syntax-rules で書くこと、とか言われたら一気に大変になりそうだし。

特定の symbol を置き換えてくような処理は、
ELisp だと CL package の lexical-let 辺りが似たようなことをしてるね。
私も簡易名前空間作ろうとして、そんな感じのコード書いたことあるし。

22 :17:04/11/17 20:29:44
>>18
入力はマクロ構文等が全て展開された後のリスト、ということにしておいてください。
lambdaに対応しとけば他に応用もできると思いますので。

これ考えたときはlambdaに渡される引数を与えてquotifyを呼び、
結果をevalだけでα変換できるというのがありでしたが、
unquoteする代わりに直接置換リストを与えても良かったかもしれません。

>>19
たぶんそのsc-expandの名前付け替えと同じことをします。
例えばquotifyの応用で簡単なインライン展開処理が書けると思います。
((lambda (x) ((lambda (y) (+ x y) (proc list)) 1)) 1)なら
((lambda (x) ... ) 1)という並びに注目し (quotify '(x) '((lambda (y) (+ x y) (proc list)) 1)) => `((lambda (y) (+ ,x y) (proc list)) 1)
この結果からさらに
((lambda (y) ... ) 1)という並びに注目し (quotify '(y) '((+ ,x y) (proc list))) => `((+ ,x ,y) (proc list))
という感じでquotifyを再帰的に適用してx=1 y=1の環境でevalすると
((+ 1 1) (proc list))というシーケンスが得られます。
ただしこの変換はxやyが変数や定数の場合に限定されます。
(もしxが呼び出しだったら意味が変わってしまうので。)

>>20
マクロを書け、となるとschemeではややこしくなるので、
ただのリスト変換関数ということにしておいてください。
要は任意のシンボルにタグ付けするということです。


こっちで用意した解答は週末ぐらいに貼り付けます。

23 :デフォルトの名無しさん :04/11/18 01:05:35
このままでもサンプルが変換できる程度の作ってみた。
こんな感じでよいのかな?
もうちょっとちゃんとしたやつは時間がないから今は書けん。
このままでは(lamda arg ...)とか(lamda (arg . rest) ...)とかはだめだよん。

(define quotify-rest
 (lambda (ids vars expr)
  (if (pair? expr)
    (cons (quotify-head ids vars (car expr))
       (quotify-rest ids vars (cdr expr)))
    expr)))

(define quotify-head
 (lambda (ids vars expr)
  (if (pair? expr)
    (cond
     ((eq? (car expr) 'lambda)
      (list 'lambda (cadr expr) (quotify-head ids (append (cadr expr) vars) (caddr expr))))
     (else (cons (quotify-head ids vars (car expr))
           (quotify-rest ids vars (cdr expr)))))
    (if (and (memq expr ids) (not (memq expr vars)))
      (list 'unquote expr)
      expr))))

(define quotify
 (lambda (ids expr)
  (list 'quasiquote (quotify-head ids '() expr))))


24 :23:04/11/18 01:12:05
いかーん間違えとる(涙


25 :23:04/11/18 01:18:40
これでいいと思う

(define quotify-rest
 (lambda (ids vars expr)
  (if (pair? expr)
    (cons (quotify-head ids vars (car expr))
       (quotify-rest ids vars (cdr expr)))
    expr)))

(define quotify-head
 (lambda (ids vars expr)
  (if (pair? expr)
   (cond
    ((eq? (car expr) 'lambda)
     (list 'lambda (cadr expr) (quotify-head ids (append (cadr expr) vars) (cddr expr))))
    (else (cons (quotify-head ids vars (car expr))
          (quotify-rest ids vars (cdr expr)))))
   (if (and (memq expr ids) (not (memq expr vars)))
     (list 'unquote expr)
     expr))))

(define quotify
 (lambda (ids expr)
  (list 'quasiquote (quotify-head ids '() expr))))

26 :デフォルトの名無しさん:04/11/18 11:13:11
(quotify '(x) '(lambda (x) (quote x)))

にはどういう出力を期待しますか?


27 :デフォルトの名無しさん:04/11/18 11:18:51
あ、おれも質問
(quotify '(x) '((lambda (x) (display x)) '(lambda (x y) (+ x y)))
で後ろのquoteされたlambdaのxの方もシャドウする?


28 :17:04/11/18 19:11:57
>>23
可変引数はあまり本質的ではないと思いますので
省略でも良いです。

>>26
その場合の出力は
=> `(lambda (x) 'x)
ということで変化なしです。

あと書き忘れましたが、正当なlambda関数かどうかの判定は
リストのcarがシンボルlambdaの場合のみです。
(a b c lambda ...) の様なリストは関数とみなしません。
(lambda <引数リスト> ... )で始まるリストのみとします。

>>27
考えてませんでした。
その例ではたまたま結果は変わりませんが、
=> `((lambda (x) (display x)) '(lambda (x y) (+ x y)))
つまり入力リスト内にquoteがあっても特別な解釈は不要です。
quoteタグリスト内でlambdaが出現したら他と同じ様に解釈してください。
あまり凝った実装しても逆に使いにくくなると思うので。

29 :デフォルトの名無しさん:04/11/18 19:50:06
えーと、Schemeの場合だと、

'((lambda (lambda) (lambda (a b) (list a b))) list)

みたいな入力リストがあったら、3番目のlambdaは束縛変数になる
わけだが、それはどうしよう。
出題者はLisp-2を考えてるみたいだから考えなくてもいいんかな。


30 :17:04/11/18 22:50:13
>>29
うむむ、それも考えてませんでした。
今回はその判別は任意ですね。
より完全さを目指したい人はやってみてください。

31 :23:04/11/19 01:18:56
こんどはちゃんとできてるつもりでふ

(define quotify-iter
 (lambda (ids vars expr head)
  (if (pair? expr)
   (if (and head (eq? (car expr) 'lambda))
     (append (list 'lambda (cadr expr)) (quotify-iter ids (append (cadr expr) vars) (cddr expr) #t))
     (cons (quotify-iter ids vars (car expr) #t)
        (quotify-iter ids vars (cdr expr) #f)))
   (if (and (memq expr ids) (not (memq expr vars)))
     (list 'unquote expr)
     expr))))

(define quotify
 (lambda (ids expr)
  (list 'quasiquote (quotify-iter ids '() expr #t))))

(quotify '(a) '((lambda (x y a) (+ x y a)) (a b c)))
-->`((lambda (x y a) (+ x y a)) (,a b c))

(quotify '(a) '((lambda (x y a) (+ x lambda a)) (a b c)))
-->`((lambda (x y a) (+ x lambda a)) (,a b c))

(quotify '(a b) '((lambda (x a b c) (x a b c)) ((lambda (a) (+ a b)) x a b)))
--> `((lambda (x a b c) (x a b c)) ((lambda (a) (+ a ,b)) x ,a ,b))

(quotify '(a b c) '((lambda (x c) (list a b c)) '(1 2 3 . c)))
--> `((lambda (x c) (list ,a ,b c)) '(1 2 3 . ,c))

どかな?


32 :デフォルトの名無しさん:04/11/20 02:58:36
ググルさんにSICP訳してもらったよ。
http://translate.google.com/translate?hl=ja&sl=en&u=http://mitpress.mit.edu/sicp/&prev=/search%3Fq%3Dsicp%26hl%3Dja%26lr%3D%26c2coff%3D1%26sa%3DG

33 :デフォルトの名無しさん:04/11/20 09:19:24
和田さん並だ

34 :デフォルトの名無しさん:04/11/20 11:45:52
>>32
石田さんより訳が上手だね。

35 :デフォルトの名無しさん:04/11/20 13:03:55
>>32
「送りなさい。」にワロタ


36 :デフォルトの名無しさん:04/11/20 22:07:19
Lisp 関係の文書で和訳やってほしいのって何かある?
暇だったら訳してあげる。

37 :デフォルトの名無しさん:04/11/20 23:30:50
>>36
SICP・・・とか言ってみる。

38 :デフォルトの名無しさん:04/11/20 23:41:19
>>36
AMOP

SICPは平易な英語なので、英語の勉強ついでに読むのが良いと思った。

39 :デフォルトの名無しさん:04/11/21 00:53:11
GNU Clispのソース内にいまだに残るドイツ語を英語に直すと喜ばれそう.

40 :17:04/11/21 01:07:30
では忘れないうちに解答を貼り付けておきます。
>>23さんご参加ありがとうございました。
ほぼ同じ内容になってしまったので可変引数と>>29のケースに対応してみました。

(define (quotify unqlist x)
 (define (last-cdr x)
  (if (pair? x) (last-cdr (cdr x)) x))
 (define (dotlist->list x)
  (let ((r (last-cdr x)))
   (if (null? r) x (reverse! (cons r (reverse x))))))
 (define (seq x vars)
  (if (pair? x)
   (cons (q (car x) vars) (seq (cdr x) vars))
   (q x vars)))
 (define (q x vars)
  (if (pair? x)
   (cond
   ((and (not (memq (car x) vars)) (eq? (car x) 'lambda)) ;; >>29のケース
    (list*
     'lambda
     (cadr x)
     (seq (cddr x)
      (append (dotlist->list (cadr x)) vars)))) ;; 可変引数
   (else
    (seq x vars)))
   (if (and (not (memq x vars))
        (memq x unqlist))
    (list 'unquote x)
    x)))
 (list 'quasiquote (q x '())))

41 :デフォルトの名無しさん:04/11/21 01:58:18
seq要らないしdotlist->listが(reverse x)で動かんだろ。

42 :デフォルトの名無しさん:04/11/21 02:53:53
letは無視していいの?

43 :デフォルトの名無しさん:04/11/21 15:32:05
LispでJAVA+tomcatみたいなことは出来ないですか?
lispなら掲示板作るのが楽そうなので。

44 :17:04/11/21 21:33:18
>>41
seqは例えば(a b c lambda ... )というリストに引っかかるのを防ぐため、
リストの頭にあるかどうかを区別するために必要です。(>>28)
>>23さんのコードでもseq相当をheadというフラグで処理しています。

それとdotlist->listが動かないという意味がわかりませんでした。
試した処理系など、もう少し詳細を教えてください。
Scheme的には大丈夫だとは思っておりますが。


>>42
let等はマクロとして展開可能なのでlambdaだけにしました。(>>22)


45 :デフォルトの名無しさん:04/11/21 21:50:40
JAVA+tomcatで作れば?

46 :デフォルトの名無しさん:04/11/21 21:52:19
>>43
cgiじゃだめなのか?
どうしてもサーブレットを使いたいならkawa + tomcatでできるかも

47 :デフォルトの名無しさん:04/11/21 22:56:44
javaで実装したschemeとtomcat組み合わせたりできない?
できたらノウハウ公開して欲しい、かも。


48 :デフォルトの名無しさん:04/11/21 23:34:35
>>32
webサービスやりたいんじゃないのか?

49 :デフォルトの名無しさん:04/11/21 23:48:20
>46
CGI?
LISPでどうやってCGIをやるのですか?
当方LISP初心者ですが、LISPでCGIできるのなら
やりたいです。windowsでも出来ますか??

50 :デフォルトの名無しさん:04/11/22 00:08:28
ちょいちょい調べたらAllegroServeなるものが出てきた。
これがtomcatの代わりになるのだろうか??

51 :デフォルトの名無しさん:04/11/22 00:18:39
CGIなんて標準入出力さえあればなんだってできるだろが

52 :デフォルトの名無しさん:04/11/22 00:24:07
たとえばアパッチとかでできますか??

53 :デフォルトの名無しさん:04/11/22 00:26:49
知障は普通にapache動かしてperlなりなんなりで書いてみて、CGIとは
何かを知るところから始めれ。


54 :デフォルトの名無しさん:04/11/22 00:29:24
>53
お前が知障。死ね
そしてオヤスミ♪

55 :デフォルトの名無しさん:04/11/22 00:30:02
一応あげとく

56 :デフォルトの名無しさん:04/11/22 00:32:51
既出だが普通に aserve+webaction で良いだろ
あ、 apache は別にいらないから念のため


57 :デフォルトの名無しさん:04/11/22 01:57:25
>>44
(reverse '(a . b))
がSCMじゃエラーだな。

58 :デフォルトの名無しさん:04/11/22 02:14:40

Paul Graham, ANSI Common Lisp の練習問題の解答を載せた
ホームページ等、ご存知でしたら教えていただけませんでしょうか。


59 :デフォルトの名無しさん:04/11/22 02:43:24
Gauche MinGW盤が出たね。


60 :デフォルトの名無しさん:04/11/22 04:15:11
>>58
「"ANSI Common Lisp" 練習問題 解答」でぐぐれ。
……出てこないね。漏れの使ってるYahooだとそれっぽいの出るんで試してみれ。

>>59
あ、ほんとだ。Bugsに報告されて重い腰を上げたのかな? (・∀・)


61 :デフォルトの名無しさん:04/11/22 09:06:43


62 :デフォルトの名無しさん:04/11/22 10:55:43
LispじゃなくてSchemeだけど、ふつうにGaucheをインストールして
CGIできてますよ。


63 :デフォルトの名無しさん:04/11/22 15:55:04
`,age

64 :デフォルトの名無しさん:04/11/22 20:32:07
(このスレ的に)ごく身近にWilikiというのがあるじゃないか
LISPのWikiって他にあるかなあ?

65 :デフォルトの名無しさん:04/11/22 20:47:36
tomcatみたいなやつっていうのであればKahuaが...

66 :デフォルトの名無しさん:04/11/23 03:16:43
Common Lispで数値式からなる通常の書式(中間記法)の四則演算式を受け取って、
その計算を行う関数を作りたいのですが、四則演算やカッコの優先順位付けに
かなり苦戦しています。一応再帰でカッコを順にはずす関数を作ってはみたんですが・・・

(defun flat (x)
(calc
(cond ((null x) NIL)
((atom x) x)
((atom (car x)) (cons (car x) (flat (cdr x))))
(T (append (flat (car x)) (flat (cdr x))))
)
)
)

実際に計算するcalc関数ができない上、この方法だと実装不可能なような気も。
どなたか別なアプローチで組める方いませんか?
【入力】 【期待する出力結果】
(calculate '(1 + 2)) → 3
(calculate '(1 + 2 * 3)) → 7
(calculate '(1 + 2 * (3 + 2)))→ 11


67 :デフォルトの名無しさん:04/11/23 03:38:48
>>66
普通に左から右に読んでくだけだと思うけど
難しく考えすぎじゃないかな
優先順位の括弧とリストの括弧ごっちゃにしてる気がする
LISPでやるとしたら
中置記法→LISPの前置記法に直してevalするだけ

(1 + 2 * (3 + 2))なら(+ 1 (* 2 (+ 3 2)))に変換してeval → 11

68 :デフォルトの名無しさん:04/11/23 03:39:21
前にEmacsLispで書いた記憶があるな。
普通かっこの部分はcalculateに渡して再帰させるんじゃない?

69 :66:04/11/23 04:24:00
>>67
>>(1 + 2 * (3 + 2))なら(+ 1 (* 2 (+ 3 2)))に変換してeval → 11
おっしゃる通りです。
再帰で階層をどんどん潜らせて、リストの中のリストに含まれる演算子を捜して、
「×」を見つけたらその前後を含めてリストを作らせるというようなことをやりたいのですが、
ソースがどうもわからなくて。
友人がlengthを使って要素数を判定させながらひたすら二項演算のカッコ(←つまりリストの中のリスト)を
作る方法はどうだと言ってましたが、それもコーディングがよくわかりません・・・。

>>68
calculateはこの場合flatを呼び出す再帰のときに実行されると思うのですが、
全く的はずれなことをしているのでしょうか・・・?

70 :デフォルトの名無しさん:04/11/23 04:46:52
どこでflatを使うの?
優先順位がめちゃくちゃになるよ。

足し算、引き算にぶつかるまでずっとたどっていけばいい。
で繰り返して使う。

71 :デフォルトの名無しさん:04/11/23 04:51:31
>>69
こんなかんじでできるのでは。

例: '(1 + 2 * 3 / 4 - 3)

;とりあえず最初の二項を。
'(+ 1 2)

* ;+より強いので第二引数を書き換え。
'(+ 1 (* 2 3))

/ ;+より強いので第二引数を書き換え。
  ;/は*と同じなので(* 2 3)の外側に。
'(+ 1 (/ (* 2 3) 4))

- ;+と同じなので外側に。
'(- (+ 1 (/ (* 2 3) 4)) 3)

72 :66:04/11/23 05:12:48
>>70
考え方としてはflatはリストの中のリストの()の中身を計算して
その後にカッコをはずすという関数にしたかったのですが、
現段階では確かに計算順序がくずれるかも・・・。
つまり式のカッコははずさずに演算子に注目する>>71さんと同じ考え方でしょうか?

>>71
丁寧な説明ありがとうございます!これは入力されたリストAとは別に新しくリストの変数Bを宣言して、
Aを見ながら、Bにどんどん上書き更新していくという感じでしょうか?
そうすると再帰的な関数で組めるかかなり不安です(´・ω・`)


73 :デフォルトの名無しさん:04/11/23 05:20:43
こんなんでどお?

(define operator-prec-alist
'((* 20)
(/ 20)
(+ 10)
(- 10)))

(cadr (assq '+ operator-prec-alist))

(define (compare-operators-by-precedence comp op1 op2)
(comp
(cadr (assq op1 operator-prec-alist))
(cadr (assq op2 operator-prec-alist))))

(define (parse exp)
(cond
((not (list? exp)) exp)
((= (length exp) 1) (car exp))
(else
(parse-op (parse (list-ref exp 0))
(cdr exp)))))


74 :デフォルトの名無しさん:04/11/23 05:21:30
続き。

(define (parse-op arg1 restexp)
(let ((op1 (list-ref restexp 0)))
(cond
((= (length restexp) 2) (list op1
arg1
(parse (list-ref restexp 1))))
(else
(let ((op2 (list-ref restexp 2)))
(if (compare-operators-by-precedence < op1 op2) ; eg. op1=+, op2=*
(list op1
arg1
(parse (list-tail restexp 1)))
(parse-op (list op1 arg1 (parse (list-ref restexp 1)))
(list-tail restexp 2))))))))


75 :デフォルトの名無しさん:04/11/23 05:23:05
Emacsのバッファから直接貼ったのでゴミが入っちゃった。
>>73
> (cadr (assq '+ operator-prec-alist))
これは無視してください。


76 :71:04/11/23 05:25:32
>>72
> そうすると再帰的な関数で組めるかかなり不安です(´・ω・`)

簡単に書けるよ。二変数A, Bを取る末尾再帰の関数で、
f (A:入力リスト) (B:空リスト) で呼び出して、
で入力Aを削りつつ、Bを書き換えていって、Aが無くなったらBをかえす。

77 :66:04/11/23 06:30:51
>>73-75
ちょっと知らない命令(cadr assq parse等)が多い感じなので勉強しながら
読み解いてみたいと思います。Common Lisp ・・・ですよね?
関数定義の仕方が微妙に違うのはLispから派生した言語とかだからでしょうか?
一応自分はxyzzyとemacsを併用して考えております(;´Д`)

>>76
末尾再帰は一度調べたことあるのでもっかいググってきます!
希望の光が見えてきた(ノ∀`)

78 :デフォルトの名無しさん:04/11/23 06:59:06
>>73 さんのはscheme

安直で冗長だが
* or / が出てきたら前後の項をあわせて括弧でくくる
というやり方でもいける

(defun sub (exp)
(cond ((atom exp) exp)
((case (length exp)
(1 (sub (car exp)))
(3 (cons (cadr exp) (list (sub (car exp)) (sub (caddr exp)))))
(t (case (cadr exp)
((* /) (sub (cons (list (car exp) (cadr exp) (caddr exp)) (cdddr exp))))
((+ -) (list (cadr exp) (sub (car exp)) (sub (cddr exp))))))))))


79 :デフォルトの名無しさん:04/11/23 08:00:50
なんかの課題ならしょうがないけど,せっかく CL なんだから
既存の infix パッケージ使えば?
http://www.cliki.net/infix


80 :(define (´∀`) 'マターリ):04/11/23 10:02:56
(defun calculate (exp)
(let ((stack '()))
(while (consp exp)
(if (memq (car exp) '(* /)) (setq stack (cons (funcall (car exp) (calc (car stack)) (calc (cadr exp))) (cdr stack))
exp (cddr exp))
(setq stack (cons (car exp) stack)
exp (cdr exp))))
(while (consp stack)
(if (memq (car stack) '(+ -)) (setq exp (funcall (car stack) (cadr stack) exp)
stack (cddr stack))
(setq exp (car stack)
stack (cdr stack))))
exp))

81 :(define (´∀`) 'マターリ):04/11/23 10:06:54
(if (memq (car exp) '(* /)) (setq stack (cons (funcall (car exp) (calc (car stack)) (calc (cadr exp))) (cdr stack))

(if (memq (car exp) '(* /)) (setq stack (cons (funcall (car exp) (calculate (car stack)) (calculate (cadr exp))) (cdr stack))

82 :(define (´∀`) 'マターリ):04/11/23 10:35:30
(if (memq (car stack) '(+ -)) (setq exp (funcall (car stack) (cadr stack) exp)

(if (memq (car stack) '(+ -)) (setq exp (funcall (car stack) (culculate (cadr stack)) (culculate exp))

83 :(define (´∀`) 'マターリ):04/11/23 11:15:04
間違いが多くてすみません。
無駄なcalculateの再帰が多くてすみません。
(defun calculate (exp)
(let ((stack '()))
(while (consp exp)
(if (memq (car exp) '(* /)) (setq stack (cons (funcall (car exp) (calculate (car stack)) (calculate (cadr exp))) (cdr stack))
exp (cddr exp))
(setq stack (cons (car exp) stack)
exp (cdr exp))))
(while (consp stack)
(if (memq (car stack) '(+ -)) (setq exp (funcall (car stack) (calculate (cadr stack)) exp)
stack (cddr stack))
(setq exp (calculate (car stack))
stack (cdr stack))))
exp))

84 :(define (´∀`) 'マターリ):04/11/23 11:48:46
(defun calculate (exp)
(let ((stack '()))
(while (consp exp)
(if (memq (car exp) '(* /)) (setq stack (cons (funcall (car exp) (car stack) (calculate (cadr exp))) (cdr stack))
exp (cddr exp))
(setq stack (cons (if (consp (car exp)) (calculate (car exp)) (car exp)) stack)
exp (cdr exp))))
(while (consp stack)
(if (memq (car stack) '(+ -)) (setq exp (funcall (car stack) (cadr stack) exp)
stack (cddr stack))
(setq exp (car stack)
stack (cdr stack))))
exp))

85 :デフォルトの名無しさん:04/11/23 12:06:00
funcallをlistに変えたら前置記法になりそうだな。

86 :デフォルトの名無しさん:04/11/23 12:12:20
問題投下
#'consを作れ。
carとcdrは使って良い。
それ以外はとくに指定しないけど、#'consと同等の機能を果たすもの、高階関数などは当然不可。

実はANSI Common Lisp3章の問題にあります。


87 :デフォルトの名無しさん:04/11/23 12:51:25
listは使えんの?


88 :デフォルトの名無しさん:04/11/23 17:01:45
(defun cons (a b) `(,a . ,b))

89 :デフォルトの名無しさん:04/11/23 19:18:46
(defun cons (a b) (append (list a) b))

90 :デフォルトの名無しさん:04/11/23 19:37:30
(defun cons (&rest a) (rplacd a (car (cdr a))) a)

91 :デフォルトの名無しさん:04/11/23 19:55:27
ああそうか、どこからconsセルを持ってくるかと思っていたが、
引数リストのを使うわけか。


92 :デフォルトの名無しさん:04/11/23 23:24:59
ACLのGUI環境の使い方を載せてあるHPとかってありませんか。

93 :デフォルトの名無しさん:04/11/23 23:40:59
数値が書かれた空白区切りの文字列 (UNIX で言うレコード) は,

(multiple-value-bind (read-from-string ...) ...)

で読むより

(let ((s (make-string-input-stream ...)))

で (read s) した方が速いんですね.cmucl でしか試していませんが.
常にこうなるものですか? stream を作るって大した仕事じゃないのかな?

94 :デフォルトの名無しさん:04/11/23 23:48:41
フィールドの数によったりしないかね。
多値ってのはそんなに多くの数を想定してるわけじゃないから。


95 :66:04/11/24 02:48:36
>>78
ソースありがとうございます!これなら何とかわかりそうです!
実装できたので後は後半部分を読み解いてみます。
>>79
残念ながら課題です・・・。

96 :66:04/11/24 02:52:05
>>80-84
ソースありがとうございます!xyzzyで実行したのですが、memqで怒られました。
シンボルの一致のeqlのことでしょうか?そこを変えて実行したら以下のようになりました。
まだスタックが使えないのでエラーの原因がわかりませんが・・・。

(calculate '(1 + 2 * 3 + (43 - 3))) → 1

97 :デフォルトの名無しさん:04/11/24 03:10:34
>>96
(defun memq (item list)
(member item list :test #'eq))

98 :デフォルトの名無しさん:04/11/24 17:32:24
Dr.SchemeのLisp版みたいなのってありませんかね?

99 :デフォルトの名無しさん:04/11/24 23:03:59
>98
XYZZY

100 :デフォルトの名無しさん:04/11/24 23:47:42
emacs の lisp-mode がもっと見やすくなる設定 or elisp を教えてください.
mapcar が見辛いという理由で loop の collect を使ってしまいます.
他にもエディタに助けてもらいたいことがいろいろあります (失念).

それと,みなさんの (format t str ...) の str の書き方が知りたいです.
これが長い場合,C 言語みたいに "abc" "def" <===> "abcdef" になれば
次の行に書くことができますが,そうはいかないので
どうしたものかと思っています.
コーディングスタイル tips のサイトがあればいいのですが...

101 :デフォルトの名無しさん:04/11/25 00:45:48
>66
あいにくSchemeしか知らんのでSchemeですまぬ

(define transform-1
 (lambda (head rest)
  (if (null? rest)
    (transform head)
    (case (car rest)
     ((+ -) (list
          (car rest)
          (transform head)
          (transform-1 (cadr rest) (cddr rest))))
     ((* /) (transform-1
          (list
           (car rest)
           (transform head)
           (transform (cadr rest)))
          (cddr rest)))
     (else 'syntax-error))))))

(define transform
 (lambda (expr)
  (if (and (pair? expr) (not (memq (car expr) '(+ - * /))))
    (transform-1 (car expr) (cdr expr))
    expr)))

(define calc
 (lambda (expr)
  (eval (transform expr))))


102 :101:04/11/25 00:46:25
結果
(calc '(((1 + 2) - 6) * 3 )) == -9
(calc '(1 + 2 * 3 + (43 - 3))) == 47
(calc '(1 + 2 * (3 + 2)) ==> 11

103 :101:04/11/25 01:00:11
だ〜またまちがえた
9行目の
(transform-1 (cadr rest) (cddr rest))))

(transform (cdr rest))))
だった

104 :デフォルトの名無しさん:04/11/25 01:12:01
最初からheadはtransformしといたら?

105 :101:04/11/25 01:28:46
>>104 むむ、おぬしなかなかできるな(笑

(define transform-1
 (lambda (head rest)
  (if (null? rest)
    head
    (case (car rest)
     ((+ -) (list
          (car rest)
          head
          (transform (cdr rest))))
     ((* /) (transform-1
          (list
           (car rest)
           head
           (transform (cadr rest)))
          (cddr rest)))
     (else 'syntax-error))))))

(define transform
 (lambda (expr)
  (if (and (pair? expr) (not (memq (car expr) '(+ - * /))))
    (transform-1 (transform (car expr)) (cdr expr))
    expr)))

(define calc
 (lambda (expr)
  (eval (transform expr))))

こうか?

106 :デフォルトの名無しさん:04/11/25 01:32:13
(not (memq (car expr) '(+ - * /))
もいらないだろ。
一回変換したやつを省いているだけだろ。

107 :66:04/11/25 01:34:30
>>97
>>101-103
丁寧にありがとうございます!
Schemeはまだ守備範囲外なのでソースとっておいて勉強します!

逆ポーランド記法に基づいて計算をする関数を
同じくCommon Lispで今考えているのですが、
スタックを使わなくてできる方法ってないですか?
リストでできるらしいのですが・・・。

108 :デフォルトの名無しさん:04/11/25 01:41:58
リストをスタック代わりに使う。

109 :デフォルトの名無しさん:04/11/25 01:43:22
リストでスタック実現すればいいのでは?

110 :101:04/11/25 01:56:38
>>106
ほんとだ、それもいらなくなるね〜
勉強になりました m(_ _)m

111 :デフォルトの名無しさん:04/11/25 07:52:19
>>100
format文字列が長くなるときは
(format t "abc~
def~
ghi")
みたいに書いたりするね。(表示は"abcdefghi"、インデント部分は消える)。
エディタのautoindentが効かないのがちょっとアレだけど。


112 :デフォルトの名無しさん:04/11/25 09:21:49
(format t "abc~
           def")
>> abcdef
=>> nil

113 :デフォルトの名無しさん:04/11/25 11:28:12
>>101は基本的に>>73と一緒じゃん?
あっちはlengthでの判定が入ってるけど実は省けて、省くと>>101とほとんど一緒。


114 :デフォルトの名無しさん:04/11/25 16:46:00
代入とかの右結合の演算子も対応して

'(a := b := 1 + 2 + (c := 3))
=> (:= a (:= b (+ 1 2 (:= c 3))))

(:= c 3)はschemeなら(begin (set! c 3) c)という感じのマクロつーことで

115 :デフォルトの名無しさん:04/11/25 20:38:21
>>111
知らなかった...
format の書式は膨大だなぁ.

これを elisp の lisp-mode がサポートしてくれないだろうか.

116 :デフォルトの名無しさん:04/11/25 21:02:51
(setf *my-hand* '((king hearts) (3 spades) (7 spades) (jack diamonds) (ace clubs)))
トランプの種類(スーツ)を数える関数ってどうすればいいですか?
(count-suit 'spades *my-hand*) -> 2

117 :デフォルトの名無しさん:04/11/25 21:23:30
(define (count-suit x y)
(do ((y (memq x (map cadr y)) (memq x y))
(n 0 (+ n 1)))
((not y) n)))

118 :デフォルトの名無しさん:04/11/25 21:28:08
(define (count-suit x y)
(length (apply append (map (lambda (z) (if (eq? (cadr z) x) (list x) '())) y))))

119 :デフォルトの名無しさん:04/11/25 22:02:20
Scheme + srfi-1

(define (count-suit suit hand)
(count (lambda (card) (eq? (cadr card) suit)) hand))

CL

(defun count-suit (suit hand)
(loop for card in hand count (eq (cadr card) suit)))


120 :デフォルトの名無しさん:04/11/25 22:09:04
(define (count-suit x y)
(apply + (map (lambda (z) (if (eq? (cadr z) x) 1 0)) y)))

121 :デフォルトの名無しさん:04/11/25 23:32:22
素直に CL で書いたらこうじゃねーか?
(defun count-suit (suit hand)
(count suit hand :key #'second))

122 :デフォルトの名無しさん:04/11/26 00:19:26
http://pc5.2ch.net/test/read.cgi/tech/1101386936/l50

123 :デフォルトの名無しさん:04/11/26 00:44:15
前の初心者スレはどうなったんだ?

124 :116:04/11/26 20:38:24
>>117-121
拝見させていただきました、ありがとうございました

125 :デフォルトの名無しさん:04/11/26 23:55:27
PocketPC用のLispって無いですか?

126 :デフォルトの名無しさん:04/11/26 23:57:12
>>125
Schemeだったら作れるでしょ

127 :ミミ:04/11/27 15:18:18
>>125
SCM は PocketPC に対応しているかも。
ソースコードにマクロ定義されていたし。

128 :デフォルトの名無しさん:04/11/27 18:59:55
Pocket PC用のApacheとかEmacsとかPerl作ってる有名な人、
(確かドイツ人だったような)
その人がなんか作ってたと思う。SCMかCLISPか忘れたけど。

129 :デフォルトの名無しさん:04/11/28 03:03:21
ttp://www.symbolictools.de/public/pocketconsole/applications/scm/index.htm
ttp://www.rainer-keuchel.de/software.html

130 :デフォルトの名無しさん:04/11/28 19:20:54
PocketSchemeね。RSR4+αくらいの仕様で、Windows APIも叩けたはず。
サンプルデモにグラフィックスの表示とかあった。

131 :130:04/11/29 12:47:40
Link貼ってなかったから貼り
ttp://www.mazama.net/scheme/pscheme.htm


132 :デフォルトの名無しさん:04/11/30 00:26:33
【入門】CommonLisp【質問よろず】
http://pc5.2ch.net/test/read.cgi/tech/1101386936/

18 名前:デフォルトの名無しさん sage 投稿日:04/11/29 00:45:51
今のCommonLispに足りないもの
>>11 GUI
>>12 cgi
>>13 Win32
>>17 DB

↑誰か反論の書き込みしてきてくれんか?


133 :デフォルトの名無しさん:04/11/30 00:38:05
↑誰か反論の書き込みしてきてくれんか?

反論:いや、なにより一番足りないのは「人気」だ・・・


134 :デフォルトの名無しさん:04/11/30 00:42:52
(´・ω・`)ショボーン

135 :デフォルトの名無しさん:04/11/30 01:29:38
前の CL スレではいろいろ書いてたけど,今度のはなんか荒れてるから近寄り難いな.
Common Lisp にゃ規格には足りないけどライブラリや処理系独自拡張で大抵あるけどな.

GUI : Tk (ltk), GTK (lambdaGTK), CLX, CL-SDL, OpenGL, CLIM, CAPI, Allegro の GUI ...
cgi : AllegroServe, PortableAserve, WebActions, Araneida, CL-HTTPD, ...
Win32 : スマン,Windows 良くしらん.FFI では駄目なん?商用処理系ならそれなりに
サポートがあると思うけど…
DB : 今なら CLSQL か?処理系によっては PostgreSQL, MySQL, Oracle, SQLite2/3 あたり
へのインターフェースを備えているし

つーかスレッドとかネットワーク API も処理系毎にバラバラだしなー.そんあ
欠点はわかっちゃいるけどね.止められないなぁ.

136 :デフォルトの名無しさん:04/11/30 01:30:59
足りないものより充実してるものを挙げればいいのに。

137 :デフォルトの名無しさん:04/11/30 02:13:08
>>136
それは欠点から目を逸らそうとしているだけにしか見えないのですが…。


138 :デフォルトの名無しさん:04/11/30 02:19:43
入門だからまず得意な分野に目を向けさせるべきだ。

139 :デフォルトの名無しさん:04/11/30 02:35:48
初心者だけど、正直reverseとかappendとかの関数を作っても、
なんも楽しくないよ。

140 :デフォルトの名無しさん:04/11/30 02:48:27
作りたくなければ作らなければいい。

141 :デフォルトの名無しさん:04/11/30 02:54:38
楽しくなければやらなければいい。

142 :デフォルトの名無しさん:04/11/30 03:17:45
そしてまた一人、初心者が去っていった。

143 :デフォルトの名無しさん:04/11/30 05:32:16
strcmpを作らせるC言語入門とかは最近の流行りでないしなぁ...
まぁ記号微分でも書くのがいいんじゃないかと.
でも正直,Lispでなければできないことって最近あまりない希ガス.
洩れはプロトタイピングだったらRubyで済ませることが多い.

現在,Lispでなければできないことといったら,on Lispで解説されたテクニックに代表される,
マクロを駆使したメタプログラミング/プログラム変換/部分評価による大規模開発だよね.
「人間の扱い切れない複雑膨大なコードをLisp処理系に書かせる」みたいな.
入門者は普通やらないよな...
「構文に対する抽象化」ってのの存在を知るだけでも後々ご利益があるとは思うけど.

Lispの普及度がある臨界を超えれば,
現在の様々な問題領域における標準的なDSL定義環境として重宝されると思うんだけどな...
GUIしかりRDBしかりXML Webサービスしかり.

Paul Grahamが言うには「ある言語が普及するには,
クールなシステムの標準スクリプト言語としての位置づけが必要」だってさ.
CはUnixのスクリプト言語だって.N88-Basicもそのクチかもね.

144 :デフォルトの名無しさん:04/11/30 12:08:17
Common Lispにはcontinuationはないんでしょうか?
一応Hyperspecもつつきまわしてみましたが、載ってないので……。

continuationって他の言語(特にC++とか)と組み合わせるのを
とっても難しくしてるように思うんですけど、そんなことないですかね?


145 :デフォルトの名無しさん:04/11/30 20:27:33
一般のcontinuationはない.
脱出だけならブロックがあるからそれを使う.
On Lispにはマクロとクロージャでcontinuationまがいを実装する話が載ってるけど,効率悪そう.

C++の例外も他の言語と組み合わせるのにハードルだよね.
ちょっと複雑な言語になればそう簡単に組み合わせるわけにはいかなくなるんじゃないかな.

146 :デフォルトの名無しさん:04/12/01 00:01:30
Franzが監視してるに違いないACLのメーリングリストに
「オマエのACLフルバージョンくれよ」ってポストしてたバカが居たね。
商用処理系の割れ物を欲しがる奴が居るってことはまだ死んでないのかな。Lisp.

147 :デフォルトの名無しさん:04/12/01 00:22:11
>>139
まぁ,そのへんは基本だから我慢してみてよ.動作を含めてあたりまえだと思えるよ
うになればいろいろ便利な事がある.reverse カンペキだと思ったら C 言語でリスト
構造とその reverse 処理を書いてみてください.

>>143
Lisp は(当時は比較的クールだった) Lisp マシンの標準スクリプト言語だったけ
ど普及しなかったじゃん….

148 :デフォルトの名無しさん:04/12/01 00:47:09
悟りを開くまえに挫折する奴が多すぎるからだ

149 :デフォルトの名無しさん:04/12/01 00:51:40
emacs がクールなシステムなら scheme が来るということですか.

150 :デフォルトの名無しさん:04/12/01 01:39:44
Lisp で悟りを開いたかどうかを検査する方法ってある?

151 :デフォルトの名無しさん:04/12/01 01:42:55
>>150
Lisp試験紙を口につっこんでみて、Lispの文字が浮き上がってきたら悟ってる。

152 :デフォルトの名無しさん:04/12/01 01:59:01
>>147
その「いろいろ便利な事」を先に教えてあげればやる気が出るんじゃない?

153 :デフォルトの名無しさん:04/12/01 06:07:50
>>143
Lispマシン自体の「普及」が限られていたからね…
Lispマシン業界にSUNが出現しなかったことが不幸だったのかな。


154 :デフォルトの名無しさん:04/12/01 07:43:06
PC-8801のROMにN88-LISPが入ってたら普及してたかもね


155 :デフォルトの名無しさん:04/12/01 07:44:15
FM7のROMにF-LISPが入ってたら普及してたかもね


156 :デフォルトの名無しさん:04/12/01 07:59:31
MZ80にSHARP-LISPのテープが付いてたら普及してたかもね

157 :デフォルトの名無しさん:04/12/01 08:23:48
ファミコンで、ファミリーLISPが出てたら

158 :デフォルトの名無しさん:04/12/01 08:45:25
マイクロソフトが悪いのかい?

159 :デフォルトの名無しさん:04/12/01 10:01:17
ビル・ゲイツとポール・アレンが売り出したのが Lisp だったら、
VB の代わりの Visual Lisp が厨房向け言語になってただろう。
Common Lisp は Microsoft の横槍によってもっとグダグダになり、
Allegro 等の ISV はすでに生き残ってないかも。

160 :デフォルトの名無しさん:04/12/01 10:28:16
MacのかわりにEmacsをパクって出来たEmacs NTがUnixとの統一を実現する。

161 :デフォルトの名無しさん:04/12/01 10:42:58
IBMあたりがEclipse+Groovyでそれを狙っているような気がしなくもない


162 :デフォルトの名無しさん:04/12/01 13:13:32
IPLって現存する?


163 :デフォルトの名無しさん:04/12/01 15:38:59
この4月から、SICPにてSchemeを習い始めたものなんですが、
プログラムを書いたところ、エラーがでて、その原因をお伺いしたかったのですが、このスレでよかったでしょうか?
SICP 問題1.37 連分数展開の問題

”コード”
(define (cont-frac n d k)
(define denom (d k));分母
(define numer (n k));分子
(define (cont-fraction p)
(if(> p 1)
((set! denom (+ (d (- p 1)) (/ numer denom)))
(set! numer (n (- p 1)))
(cont-fraction (- p 1)))
))
(cont-fraction k)
(/ numer denom)
)

”入力”
(cont-frac (lambda(i) 1.0)
(lambda(i) 1.0)
10)

”エラー”
procedure application: expected procedure, given: #<void>; arguments were: #<void> #<void>

”環境”
Dr.scheme



164 :デフォルトの名無しさん:04/12/01 15:46:05
ifの下、(set!...) の前にbeginが要るんじゃないの。


165 :デフォルトの名無しさん:04/12/01 23:34:02
>>164 と結論は同じなんだけど、>>163 はまだLisp(Scheme)のカッコの意味が
分かっていないと思われ。
補足すると、Schemeインタープリタはリストの最左端を手続きとみなすが、
((set! denom (+ (d (- p 1)) (/ numer denom)))
(set! numer (n (- p 1)))
(cont-fraction (- p 1)))
というリストの最左端は (set! denom (+ (d (- p 1)) (/ numer denom)))
という式になっていて、それが返す値が #<void> だ、ということ。
もしこれが何かの手続きを返すのなら意味があるだろうけど、ここでは
それは意図していることではない。

(+ 1 1)
に対して、
(let ((plus +))
(plus 1 1))
とか、
((if #t +) 1 1)
とか、
((lambda (a b) (+ a b)) 1 1)
とかを比べてみればいい。


166 :デフォルトの名無しさん:04/12/02 02:59:25
(define (cont-frac n d k)
  (define (cont-fraction p denom numer)
    (if (> p 1)
        (cont-fraction (- p 1) (+ (d (- p 1)) (/ numer denom)) (n (- p 1)))
        (/ numer denom)))
  (cont-fraction k (d k) (n k)))

167 :デフォルトの名無しさん:04/12/05 17:31:40
The Art of the Metaobject Protocol ってフリーで入手できませんか?

168 :デフォルトの名無しさん:04/12/05 18:38:32
>163
>このスレでよかったでしょうか?
気味の悪い日本語やめろ。Schemeの前に日本語やれよ。

169 :デフォルトの名無しさん:04/12/05 18:40:55
>>168
それね、京都のファミレスでウェイトレスがよく使う言葉だよ。
慣れるとどうってことないよ。

170 :デフォルトの名無しさん:04/12/05 18:51:32
京都から出た事ない京都人が寝言言ってるが、
ちょっと前に全国の飲食店のバイトが良く使う間違った敬語として有名だ

171 :デフォルトの名無しさん:04/12/05 19:18:48
>>170こそ間違ってるな

172 :デフォルトの名無しさん:04/12/05 19:22:31
>>169
なれればシンタックスエラーも気にならないってか。
京都人の神経はわからん。

173 :デフォルトの名無しさん:04/12/05 19:26:58
>>170は根拠なしに「間違った敬語」と言っている。
それが正しいことである根拠を示せ。(有名というのは根拠に非ず)

174 :デフォルトの名無しさん:04/12/05 19:28:12
自然言語については↓でやれ
言語学
http://academy3.2ch.net/gengo/

175 :デフォルトの名無しさん:04/12/05 19:31:17
>173 そういうのが説明されないとわからないのはまずいと思うよ

176 :デフォルトの名無しさん:04/12/05 19:33:37
>>172
一般的なコンパイラが出すsyntax errorと同様に考えてはいけない。
それは即失敗していることを意味するが、自然言語の場合は自分が普段使っている
言語の表現と違った表現をしていたとしても、それは誤りではない。
現にその表現を使っているシーンを何度も見ている人はその表現の意味を理解できる。
私には>>172の神経は解かるよ。一般的なコンパイラと人を同一視してしまっている
んだ。

177 :デフォルトの名無しさん:04/12/05 19:34:44
>>175
説明できないから、相手の能力を否定することで説明逃れをするつもりか?
低能だな。

178 :デフォルトの名無しさん:04/12/05 19:40:58
LispWorks って使ったことある方いますか?
使用感とかどうでしたか?
LispWorks フリー版: http://www.lispworks.com/downloads/index.html

179 :デフォルトの名無しさん:04/12/05 19:41:58
>176
自然言語は意味が通じるからといってそれだけで問題無しとしてはいけない。
プログラミング言語のように技術的な便益だけで考えてはいけないからね。

180 :デフォルトの名無しさん:04/12/05 19:46:08
>>177
おまいはこのCommonLispスレで、
「質問されてもいない内容を、さも既に質問済みであって
これが二回目の問いであるかのように過去形で述べる事の
押付がましさの、本来敬語が持つべき敬意とか遠慮とかとの
相容れなさ云々」とか長々と聞きたいのか?

181 :デフォルトの名無しさん:04/12/05 19:51:33
>>180
疑問に思った事は聞いておきたい。
それがスレタイと関係なくても問題はない。
なぜなら、スレタイはスレ内容を縛るものではないからだ。

182 :デフォルトの名無しさん:04/12/05 20:01:31
>>168-
日本語の進化は京都が最先端。そこから全国へ下っていく。


183 :デフォルトの名無しさん:04/12/05 20:09:09
>>180
言葉は変わる。

184 :デフォルトの名無しさん:04/12/05 20:12:27
(gc)

185 :デフォルトの名無しさん:04/12/05 20:29:30
>>170http://nhg.pro.tok2.com/reserch-2/reserch1-96.htmあたりを聞きかじったのだろう。

186 :デフォルトの名無しさん:04/12/05 20:32:43
さいたま

187 :デフォルトの名無しさん:04/12/05 20:39:17
芹沢君

188 :デフォルトの名無しさん:04/12/05 20:43:03
うざったい

189 :デフォルトの名無しさん:04/12/05 20:48:33
自然言語でも誤りは誤りだろ。強力なエラー訂正が効くだけで。


190 :デフォルトの名無しさん:04/12/05 21:04:17
>>189
自然言語は変わり続ける。

191 :デフォルトの名無しさん:04/12/05 21:10:43
つまり全てが誤りってことですね!


192 :デフォルトの名無しさん:04/12/05 21:15:28
私の言っていることは間違いである

193 :not 178:04/12/05 21:22:08
でLispWorksはどうなったのよ。
4.3のEnterprise Edition評価版ちろっと使った経験しかないから漏れからなんとも。
いまこれが動かせればACL 7.0リリース版とベンチ採って比較したりできたんだけどな。

194 :デフォルトの名無しさん:04/12/05 21:37:28
http://www-eksl.cs.umass.edu/~westy/benchmark/bench1.html

195 :デフォルトの名無しさん:04/12/05 22:17:27
>190
変わるのと変えるのは違うし
正しいものを正しいものと言い続ける事は大切だ

自然言語だろうと関数型言語だろうと

196 :デフォルトの名無しさん:04/12/05 22:57:04
いいえ大切ではありません。

197 :デフォルトの名無しさん:04/12/05 23:01:04
>>195
誰かが変えたと言わなくても変わるもの。
大昔の日本語と現在の日本語は誰かが変えたと言ったわけでもないのに変わっている。
そして、その変化に順応している。
正しいかどうかという問題ではない。
ただそこにあるということだけだよ。
それに、自然言語とコンピュータ言語の出自は全く異なっている。

198 :デフォルトの名無しさん:04/12/05 23:03:49
こんなところで自然言語についての俺理論を展開したところで、一般の板で
見掛ける「友達のスーパーハカー」と同様、噴飯ものなんだよね。
ちゃんと議論したいのなら専用の板にいらっしゃい。

199 :デフォルトの名無しさん:04/12/05 23:49:29
"Metaobject Protocol" でググると3番目に↓が見つかって,
ttp://www.lisp.org/mop/
んでここには
> The book The Art of the Metaobject Protocol, sometimes called the AMOP,
> includes the CLOS Metaobject Protocol specification as chapters 5 and 6.
> These chapters are reproduced here in hypertext.
とあるんだけど, >>167 はここをもう見た上で「第1-4章がないのか?」と質問してるのかな?

200 :デフォルトの名無しさん:04/12/05 23:53:02
>>199
そうです。全部読むことはできないのかなと。。

201 :デフォルトの名無しさん:04/12/05 23:59:29
R5RSを読むと、errorの扱いについて何も書いてないんですが、
これはどうするかは実装まかせで例えば即座にabort()しちゃっても
許されるということでしょうか?


202 :デフォルトの名無しさん:04/12/06 00:07:16
Lisp で関数を定義する場合、C と同じようにエラーコードを返す設計でよいのでしょうか?

たとえば、JPEG ファイルをロードする関数 (jpeg-load filename) があるとして、
filename で指定されたファイルが存在しない、読み取れない、JPEG 形式でない、
などのエラーがあった場合、それぞれに対応するエラーコードを返すという設計が
一般的ですか?

203 :デフォルトの名無しさん:04/12/06 00:53:06
(jpeg-load filename)した後どうしたいのかによると思う。
読み込んだJPEGファイルをオブジェクトとして操作する予定があるならクラスにして
おいてloadメソッドを定義しておいて、メソッドの値をオブジェクトそのものにするか
失敗したらnilにするかしておくかな。状態を調べるのはスロットの値を覗け、と。
まぁ、アクセサ定義しとけばいいんだけど。

一般的とか正しい方法なんてのはあってないようなもんなんで、好きに書けばいいじゃん。


204 :デフォルトの名無しさん:04/12/06 01:48:48
全文読める場所があるなら↑からリンクの一つや二つ張られていそうなもんだけど < AMOP
まぁ何だ,買え(ぉ
# 1-4章はチュートリアルらしいね

205 :199:04/12/06 01:50:27
ageてしまったorz
(断片的だけど)これでも読んで...
ttp://dolphin.c.u-tokyo.ac.jp/~nisimu6/comp/clos/chap2.html

206 :デフォルトの名無しさん:04/12/06 07:10:25
>>201
そうです。abort()したって、ランダムな値を返したって、「R5RS準拠」と
名乗ることはできます。
それが本当に使える実装かどうかは別問題。


207 :デフォルトの名無しさん:04/12/06 08:26:44
>>206
なるほど。ありがとうございました。
さすがにランダムな値を返す実装はそうはないと思いますけど、
プログラムカウンタがsemanticに正しくないコードにきてしまった時点で
そこから先は未定義になるってことでしょうか。
こう書くと杓子定規の最たるものみたいですが、
「お前は本当はこうしたいんだろ? こうに違いない! 俺にまかせとけ!」
てな具合に勝手に(必要ならコードを書き換えて)動作を続けていってくれるのも
R5RS準拠なのかもw






208 :デフォルトの名無しさん:04/12/06 09:16:17
>>202
> Lisp で関数を定義する場合、C と同じようにエラーコードを返す設計でよいのでしょうか?
> たとえば、JPEG ファイルをロードする関数 (jpeg-load filename) があるとして、
> filename で指定されたファイルが存在しない、読み取れない、JPEG 形式でない、
> などのエラーがあった場合、それぞれに対応するエラーコードを返すという設計が
> 一般的ですか?
Common Lispが規定しているライブラリ的な関数の挙動を参考にすると、
エラーが発生した時、関数は、エラーコードを返すのではなく、error(というLisp Object)を
error関数で発信(signal)する。

プロトタイプ的にどんどん書くときは、
(error "file ~A is not in jpeg format." filename)
などとsimple errorを発信しておいて、後から仕上げをするときに、適切な
型のerrorを発信するようにする。

209 :デフォルトの名無しさん:04/12/06 14:16:01
http://www.scheme.com/
CHEZ SCHEMEのVersion7でるようですね。(6で自然消滅かと思ってましたご免なさい)
個人で買える値段だといいんだけどなぁ...


210 :デフォルトの名無しさん:04/12/07 00:39:51
chezってscheme界のaclみたいなもん?

211 :デフォルトの名無しさん:04/12/07 01:28:18
なんだ、Gauche-gtkってcygwinで動くじゃん

212 :デフォルトの名無しさん:04/12/07 01:53:48
c.l.sでandはsyntaxだからapplyには渡せないね、ってのを見ました。
たしかこのスレか前スレあたりで似た話があったのを思い出したんだけど
(そのときの結論はたしかguileだけ純インタプリタなので変態的に動作する)、
syntaxをfirst-class objectにしておいて、実行時にsyntaxがapplyされると
evalが走るようにすればどうでしょうね。
もちろん引数は先に評価されちゃうわけだけど、それは覚悟の上ということで。

(apply and (list #t #f 何かの式))
とすると、「何かの式」は評価されてしまうが、
(eval (cons and (#t #f 「何かの式」の値)))
と同義な動作をするというようにするのです。
goshだとsyntaxをapplicable objectにすればできると思うんですけど。
(define-method object-apply ((syntax <syntax>) . args)
(eval (cons syntax args) (interaction-environment)))
とかすればできるのかしら。でもやってみると無限ループに入ってしまいました。
object-applyが優先されちゃうんですかね。


213 :デフォルトの名無しさん:04/12/07 02:26:28
(every values args)
でいいじゃん (srfi-1)
andに限らず引数先に評価していいなら普通に高階関数化できるでしょ

214 :デフォルトの名無しさん:04/12/07 03:43:09
>>209
年内にリリース予定でしたっけ。
ユニコードのサポートしてくれないかなあ。

>>212
arc はマクロをファーストクラスにする予定らしいですね。
実行時に展開するかコンパイル時に展開するかは
宣言で調整できるっていう感じの話だったような。

http://www.paulgraham.com/ilc03.html

215 :デフォルトの名無しさん:04/12/07 07:13:32
(not (memq #f (list #t #f 何かの式)))

216 :デフォルトの名無しさん:04/12/07 08:16:47
(define (functional-and . function-list)
(let loop ((l function-list)
(r #t))
(cond ((null? l) r)
(((car l)) => (lambda (x) (loop (cdr l) x)))
(else #f))))

(functional-and) => #t
(functional-and (lambda () 'a) (lambda () 'b)) => b
(functional-and (lambda () 'a) (lambda () #f) (lambda () 'b)) => #f

217 :デフォルトの名無しさん:04/12/07 11:10:40
意味が分からんが
(define (functional-and . function-list)
(or (null? function-list)
(and ((car l)) (apply function-and (cdr function-list)))))

218 :デフォルトの名無しさん:04/12/07 14:15:43
UNIXのシステムコールをそれなりに呼べる(select(2)とか)実装って
なにがありますか?
Common Lispだと CMUCL、Schemeだと Gaucheが良いんですが、
他にもあるでしょうか。

219 :デフォルトの名無しさん:04/12/07 20:30:52
FFIつかえるならどれでも呼べるだろ。


220 :デフォルトの名無しさん:04/12/07 21:10:44
いるんだよね.
単語だけ聞きかじって具体的なこと何も知らないのに知った風なこと言うヤシ.
自分は一度でもFFI使って意味のあるプログラム作ったことあんのかね.

221 :デフォルトの名無しさん:04/12/07 21:23:09
具体的なことを何もいわない220も同罪だな。


222 :デフォルトの名無しさん:04/12/08 00:15:58
>>218
schemeならbiglooが良いよ

223 :デフォルトの名無しさん:04/12/08 00:48:25
>>218
記憶だと guile, scsh もオッケーのはず。他の処理系でもあったはず
だけど思い出せない。


224 :218:04/12/08 09:51:01
>>219-223
ありがとございます。普段48使ってるんですが、scshがいけるとは盲点でした。
biglooは Serializationが面白そうな予感。

225 :218:04/12/08 15:01:41
Scheme48で3.14秒のコードが scshだと69.16秒になってしまいますた。

226 :デフォルトの名無しさん:04/12/10 23:05:30
>>222
bigloo よさげだよね。
でも Windows の GUI プログラム書ける?

227 :デフォルトの名無しさん:04/12/11 00:28:22
>>226 ハァ?
UNIXのシステムコール呼びたいんじゃなかったの?

228 :デフォルトの名無しさん:04/12/11 11:28:06
http://www.lispworks.com/press_releases/press11.html

LispWorks 4.4がリリースされてます。
$1100...マタネアゲシテイルヨウナキガ○| ̄|_



229 :デフォルトの名無しさん:04/12/12 15:10:21
>>228
お、安いな。買いだ買い!
で、日本語通るのか?


230 :デフォルトの名無しさん:04/12/13 00:28:19
金鯛焼きage

231 :228:04/12/13 10:36:51
>>229
4.2 Personal版では通りました。(UNICODEですが、エディタとかもデフォルトで化けないで表示されます)

速度的にはどうか私も知りたいのですが、ACL7持ってませんです。


232 :デフォルトの名無しさん:04/12/13 12:46:48
"The Little Schemer"を読んでいると、atom?が重要ということが
わかりました。しかし、Gaucheにはないようなのですが、何か、
深い理由でもあるのでしょうか?

作るならこう?
(define (atom? x)
(and (not (pair? x))(not (null? x))))


233 :デフォルトの名無しさん:04/12/13 13:16:19
空リストはアトム

234 :デフォルトの名無しさん:04/12/13 17:02:05
define-syntaxってdefine-macroと違って書いたものがそのまま展開される
と思うんですが、define-macroみたいにメタな場合分けってできないんでしょうか。
だとしたらパワーが全然違うと思うんですけど。

235 :デフォルトの名無しさん:04/12/13 19:50:16
gauche には atom? じゃなくて
同じ機能の not-pair? があります。

236 :229:04/12/13 23:10:05
>>231
Personal版をダウソしてみた。
時々出るダイアログが烈しくウザ!


237 :デフォルトの名無しさん:04/12/14 01:11:02
>>231
LW4.3との比較であればBill Clementson's Blogにベンチマーク採ったの載ってるよ。
LW4.3からLW4.4でどの程度高速化されたか早く知りたい。買わないけど。

238 :デフォルトの名無しさん:04/12/14 01:32:08
>>234
世の中にはdefine-syntaxだけでquasiquoteの展開を書く人もいるわけだが....(汗
やっぱりsyntax-caseかdefine-macroがないとつらいよね。

239 :デフォルトの名無しさん:04/12/14 18:36:08
>>233 >>235
空リストはアトムなんですね。
ということで、not-pair? ってのでいいんですね。ありがとうございました。

240 :デフォルトの名無しさん:04/12/14 19:46:46
schemeにatomは無いんじゃなかったっけ

241 :デフォルトの名無しさん:04/12/14 22:15:43
atom 型ていうのはないですね、仕様上。
非共有性に基づいて型を定義している以上、当然ではあるけれども。

242 :デフォルトの名無しさん:04/12/14 23:14:56
ACL7.0 EnterpriseがUS$99.00って・・・学生ウラヤマスィ。
研究室遊びに行って後輩捕まえて代わりに買ってもらおうかな(w

243 :デフォルトの名無しさん:04/12/15 00:05:02
>>242
学生じゃなくても個人ユースならその値段で売って欲しいぞ。

244 :デフォルトの名無しさん:04/12/15 13:51:36
憶測だけど、完成したアプリはたぶん無制限に配布してはいけないのだろうな。

245 :デフォルトの名無しさん:04/12/15 21:38:44
CLOSを常用してる人って、いるんですか?
同名のメソッドは引数を合わせないといけないので、
パッケージを分けたくない時は、javaとかでいう抽象クラス名みたいなものを
プレフィクスに付けたりしないと名前が被りますよね。
メッセージ伝達モデルのほうが型ごとに名前空間を分離できるし、
タイプ量も減って手軽だと思うんですけど、
普段は、そういうオブジェクトシステムを使ってるって人いないですか?


246 :デフォルトの名無しさん:04/12/15 23:17:36
>>245
>>同名のメソッドは引数を合わせないといけないので、

何言ってんのあんた。

247 :デフォルトの名無しさん:04/12/15 23:47:36
>>246
パラメータリストを整合的にしないといけないということです。
メッセージ伝達モデルだと、関係の無いクラスで
同名の引数の数が違うメソッドが定義されていないかなどといったことは
気にしませんから、それがわずらわしく感じないかということを言いたかったのですが。


248 :デフォルトの名無しさん:04/12/16 00:33:19
>>247
言いたいことがよく判らない。
簡単なものでいいから、具体例を出して説明して頂けないか。

249 :デフォルトの名無しさん:04/12/16 00:34:39
お隣のスレの80ですか?

250 :247:04/12/16 01:54:47
構造体のメンバの参照でも同じことですが、
変数名 . 動詞or名詞
と普通のオブジェクト指向言語では書けるところが、
(パッケージ名:動詞 変数名)
あるいは、
(型名-動詞or名詞 変数名)
となって、タイプ量が増えて面倒だと言いたいだけです。
普通はパッケージ名は書かないのかもしれませんが、
複数のパッケージからインポートして、それぞれに整合的でないメソッドが
含まれている場合、シンボルのインポートを諦めるか、
メソッド名に基底クラス名等のプレフィクスを付けるか、
全く違う名前に変更してユニーク性を確保する羽目になります。
型の名前やパッケージ名が繰り返し書かれると、
情報の多重化になりますから、名前を変更する時も面倒です。
本当に複数の引数の型でディスパッチしたい状況というのは少なそうですから、
この負担が割りにあってるかは疑問です。
日常的に使いたくなるのはメッセージ伝達モデルの方であり、
総称関数を使いたい状況の方がむしろ特殊じゃないかと。

オブジェクトをキーワードやシンボルを引数に取るクロージャにして
(funcall 変数名 '動詞)
Schemeなら単に (変数名 '動詞)
と書けるようなオブジェクトシステムを実装するのは簡単なので
やってる人は結構いるんじゃないかと思ったのですが。

総称関数モデルとメッセージ伝達モデルのトレードオフくらい
ここの人は分かってると思ったので、単に
「メッセージ伝達モデルの奴が欲しいんだけど、いいのない?」
みたいな聞き方でも充分通じると思ったのですが。


251 :デフォルトの名無しさん:04/12/16 02:14:35
で、結局のところ何を聞きたいわけですか?

252 :デフォルトの名無しさん:04/12/16 02:33:17
>>250
いや、だから具体例を出してくれはしないだろうか。
何で generic function の名前に型名をつける必要があるのか理解できない。
パッケージについても、まあ名前の衝突はありうるけれども、
それがメッセージ伝達型だと何で解消できるの?
それは総称関数モデルの問題じゃなくて、
Common Lisp のパッケージシステムの問題じゃなかろうか。

取りあえず、何というか、手続きの総称化ということについて
よく判っていないのではないかという印象を受けた。

ちなみにメッセージ伝達モデルの oo については
Paul Graham の"ANSI Common LIsp" で例題として実装している。
まあ、Common Lisp でわざわざ oo 実装するやつも少ないので、
Scheme の方で探して、気に入ったのがあったら移植でもしたらいいんじゃない?
CLOS like なのしか思い浮かばないんで、紹介は出来ないけど。

253 :デフォルトの名無しさん:04/12/16 03:23:45
> 取りあえず、何というか、手続きの総称化ということについて
> よく判っていないのではないかという印象を受けた。

俺も。何か気の毒だからちゃんと勉強して出直すことを期待。

254 :デフォルトの名無しさん:04/12/16 08:35:48
型名をprefixにつけるなんて間抜けすぎ。最近ではOO界でもDuck Typingが
推奨されてるのに。


255 :デフォルトの名無しさん:04/12/16 10:11:09
prefix が問題ではなくて、こんな感じにすると、
1番目の add と2番目の add の引数が違うのでだめじゃんってのが問題なんじゃない
(defclass surface ()
((poins :initform () :accessor points)))
(defclass point ()
((x :initarg :x :accessor x)
(y :initarg :y :accessor y)))
(defmethod add ((surface surface) (point point))
(push point (points surface)))
(defmethod add ((surface surface) x y)
(add surface (make-instance 'point :x x :y y)))


256 :デフォルトの名無しさん:04/12/16 10:32:48
>>255 俺もその手の、同じ名前でラムダリストが違う場合を言いたいのだろうなと思った。
あと、それとは逆でラムダリストはたまたま合同になるけど、処理の内容が
ほとんど別のことを表しているときはどうだろう。なんとなく気持が悪くない?
パッケージで分割できればいいけど。

257 :デフォルトの名無しさん:04/12/16 20:19:14
>>255
ん?
今 Common Lisp の処理系が手元にないので Gauche で試したけど、
それ、ちゃんと動くよ? CLOS だと駄目だったっけ?

258 :デフォルトの名無しさん:04/12/16 20:37:12
CLOSはラムダリストが同じじゃないとダメ。
stklosとかgaucheは制限が緩い。

CLOSでだめなのは最適化かなんかの都合なの?


259 :247:04/12/16 22:06:23
>>255
>>256
言いたいのはそういうことです。良い例をありがとうございます。

>>258
それは知りませんでした・・・
てっきり回避不可能に近い制限なのだろうと思ってたので。
その仕様だと、効率を除けばデメリットは無いですよね・・・
gaucheでいろいろ試してみます。


260 :234:04/12/17 16:19:22
>>238
quasiquoteの展開ってこういうのじゃ駄目でしょうか?

(define-syntax qq
(syntax-rules (uq)
((_ ()) '())
((_ (uq a)) a)
((_ (a . b)) (cons (qq a) (qq b)))
((_ a) 'a)
))

理論上は define-syntaxでなんでも書けるらしいですね。
なにか面白いマクロネタありませんかね。

261 :234:04/12/17 16:42:01
後 quasiquoteを使った quoteの定義

(define-syntax q
(syntax-rules (uq)
((_ ()) (qq ()))
((_ (uq a)) (list (qq uq) (q a)))
((_ (a . b)) (cons (q a) (q b)))
((_ a) (qq a))
))

うーん、なんか見落してる気がする。

262 :234:04/12/17 17:00:02
あ、unquoteの時は計算結果に置き変えないといけないんですか。
evalじゃないだろうし、どうやったらいいか想像できないです。

unquoteがマクロ展開時に計算されるっていうのは、処理系がマクロ展開時、実行時
の2ステップに分かれていれば意味あると思うんですけど、そうでない場合
なにか意味あるんでしょうか? 計算結果は変わらないですよね。

263 :sage:04/12/18 14:50:19
こんな処理をする手続きrember* をつくりました。
  (rember* 'b '(a b c (a b c))) => (a c (a c))
これをcall/ccを使った大域脱出させたいです。
  (rember* 'b '(a b c END d (a b c)) => (a c END (a b c))
  
しかし下のコードでは希望する動きをしません。  
  => (rember* 'b (a c END (a c))

下のコードをつかって、うまく脱出する方法はあるでしょうか?

(define rember*
(lambda (a l)
(call/cc (lambda (escape)
(cond ((null? l) '())
((not-pair? (car l))
(cond ((eq? (car l) a)
(rember* a (cdr l)))
((eq? (car l) 'END)(escape (cons 'END '())))
(else (cons (car l) (rember* a (cdr l))))))
(else (cons (rember* a (car l))
(rember* a (cdr l)))))))))



264 :sage:04/12/18 14:53:28
>>263
見やすく書き込む方法はあるのでしょうか?
2ちゃんねる初心者です(^^;

265 :デフォルトの名無しさん:04/12/18 15:19:27
それ以前に、仕様を明確に定義しろよ。
なんとなくは分かるが、前半の例と後半のコードが一致しないし、typo も多いし、
正しくはどうやりたいのかがみえない。

266 :デフォルトの名無しさん:04/12/18 15:25:23
>>264
とりあえず、下げたいのなら、sageはメール欄に書こうな。

267 :デフォルトの名無しさん:04/12/18 18:10:00
>>264
` ' (半角スペース) を `&nbsp;' に置換する.

268 :デフォルトの名無しさん:04/12/18 18:20:15
call/ccを使う必要ないんじゃ?

269 :デフォルトの名無しさん:04/12/18 19:51:03
ENDは特別扱いなのか?
何がしたいのかわかんねえよヴォケ

270 :デフォルトの名無しさん:04/12/18 23:01:17
>>263
説明不足でご迷惑かけました。改めて
手続きrember* a l は、リスト「l」から再帰的に「a」を除くものです。
(rember* 'b '(a b c (a b c) ((a) (b) (c))))
; -> (a c (a c) ((a)()(c)))
-------------------
(use srfi-1)
(define rember*
 (lambda (a l)
  (cond ((null? l) '())
        ((not-pair? (car l))
         (cond ((eq? (car l) a)
                (rember* a (cdr l)))
               (else (cons (car l) (rember* a (cdr l))))))
        (else (cons (rember* a (car l))
                    (rember* a (cdr l)))))))

271 :デフォルトの名無しさん:04/12/18 23:27:41
>>270
実際にやりたい処理は次です。
『'END にぶつかったならば、処理を終了して、最後に"LAST" を付け
たリストを得る』
 具体的には、下のような処理です。
(rember2* 'b '(a b c (a b c END d e) ((a) (b) (c))))
;-> (a c (a c "LAST") ((a) (b) (c)))

こういう処理は、270以外のやり方の方がいいのかもしれません。
ただ、270は「The Little Schemer」で紹介されている定石なので、
270から発展させた解決策をしりたいです。
アドバイスをお願いします。
PS >>268 call/cc はいらないですね。ども。



272 :デフォルトの名無しさん:04/12/18 23:47:16
>>271
下のrember2* では、....((a)(b)(c))) にはなりません。再帰がとまらないのです。
(rember2* 'b '(a b c (a b c END d e) ((a) (b) (c))))
;-> (a c (a c "LAST") ((a) () (c)))

(define rember2*
  (lambda (a l)
    (cond ((null? l) '())
          ((not-pair? (car l))
           (cond ((eq? (car l) a)
                  (rember2* a (cdr l)))
                 ((eq? (car l) 'END)
                  (cons "LAST" '()))
                 (else (cons (car l) (rember2* a (cdr l))))))
          (else (cons (rember2* a (car l))
                      (rember2* a (cdr l)))))))



273 :デフォルトの名無しさん:04/12/19 01:01:21
汚ないけど一応動くかも

(define rember2*
(lambda (a l)
(letrec ((iter (lambda (a l c)
(cond ((null? l) (c #t l))
((not-pair? (car l))
(cond ((eq? (car l) a)
(iter a (cdr l) c))
((eq? (car l) 'END)
(c #f '("LAST")))
(else (iter a (cdr l) (lambda (b ll) (c b (cons (car l) ll)))))))
(else (iter a (car l) (lambda (b ll) (if b (c #t (cons ll (iter a (cdr l) (lambda (b l) l)))) (c #f (cons ll (cdr l)))))))
))))
(iter a l (lambda (b l) l))
)))


274 :273:04/12/19 01:14:31
長い行は
(else (iter a (car l) (lambda (b ll) (c b (cons ll (if b (rember2* a (cdr l)) (cdr l)))))))
の方が綺麗かな。

275 :(define (´∀`) 'マターリ):04/12/19 01:27:55
(define (rember* a l)
  (let loop ((l l) (cont (lambda (x) x)) (end (lambda (x) x)))
    (cond ((null? l) (cont l))
          ((eq? (car l) a) (loop (cdr l) cont end))
          ((eq? (car l) 'END) (end (list "LAST")))
          ((list? (car l))
           (loop (car l)
                 (lambda (x) (loop (cdr l)
                                   (lambda (y) (cont (cons x y)))
                                   (lambda (y) (end (cons x y)))))
                 (lambda (x) (end (cons x (cdr l))))))
          (else (loop (cdr l)
                      (lambda (x) (cont (cons (car l) x)))
                      (lambda (x) (end (cons (car l) x))))))))

276 :デフォルトの名無しさん:04/12/21 20:25:28
さいきんちらほらとム板スレで出てくるIoって言語は
LISPの思想に近いらしく、基本はすべて
object method(...)
らしい。ただ、これとは別に演算子もある。
これはこれでかなりまとも(というか普通)な発想だと思う。
また、objectとmethodに対するありがちな.(ドット)連結を廃止して、
symbol symbolという並びをobject methodに簡略化した点でも評価できる。
methodの引数をそのまま関数引数形式にしたのもC/C++勢力にも受けると思う。

さて、
object method1(...) method2(...)
とすればmethod1の結果のオブジェクトに対してmethod2を連鎖適用できる。
この書き方はC/C++でもほぼ同じだから馴染み深い。

LISP(Scheme)の関数は適用がいつも先頭引数という決まりなので
(method2 (method1 object ...))
と、見た目の順序が逆になる。
((object method1 ...) method2 ...)
という風にも書けないことはないが、
細工をしない限り機能しない。(言い換えればLISPの一般的な書き方ではない。)
※ここでいう細工とは、マクロで専用インタフェースを書くか、
自分でメソッドディスパッチする必要があるという事。

ここで思うことは、主流のオブジェクト指向をする際、
この連鎖適用における順序の違いが思考の妨げになるのではないかということ。
今主流の言語は(関数型でさえも) object method形式だから、
LISP(Scheme)でやろうとする場合、専用の頭が必要になる。


277 :デフォルトの名無しさん:04/12/21 21:00:52
そもそもオブジェクトとはどういう概念なのか説明してくれないか。

278 :デフォルトの名無しさん:04/12/21 21:02:05
そこでArcですよ

279 :デフォルトの名無しさん:04/12/21 21:33:43
ではIoの構文はどうか。
Ioではifなどの構文もメソッドであるという。
メソッドというからには何かのオブジェクトに従属するはずだが、
Ioでは暗黙のrootオブジェクト(Lobby)という概念を作ってカバーしたらしい。

例えばif式だと
if(test_part, then_part, else_part)
という書き方になる。

構文要素をカンマで区切る辺りが少し不気味な気がするが、
LISPの怒濤の括弧ほどショッキングではないのかもしれない。
ここで注目したいのは、Ioの構文はメソッドであるため、
どうやらマクロの様な特殊な機構は必要ないらしい。
ただし肝心の評価順序の制御がどういう原理で行われるのか正確には不明。
(thisMessage という機構でえらい騒ぎになるらしい)
構文に対する特殊化を先送りしているだけにすぎない様な気もするが、
表向きメソッドとして統一した事に意義があるのだと思う。

ただ、構文をメソッドとして定義するということは、マクロの様に展開する機会がなく、
毎回作成した専用構文の解釈を行うということになるので、
実行効率はかなり犠牲なるはず。
マクロ的な展開機構が導入されれば解決するのかもしれないが、
その辺はかなり道のり遠そうである。
この辺を追求していくとIoの雲行きが怪しくなってくる。
ともあれ、実用性や効率に目をつむればかなり洗練された言語であることは間違いない。


280 :デフォルトの名無しさん:04/12/21 21:38:05
Ioスレでやれ

281 :デフォルトの名無しさん:04/12/21 21:47:13
いや、別にIo使う気ないけど。
LISPでもシンプルなオブジェクト指向ってできねーのかなと思って。
似た言語の筈のIoと何が違うのかなって知識の整理。
要はIoの構文はマクロの代わりにメッセージという裏技でカバーってことね。
基本概念違うから(CLOS程大きいシステムならともかく)適用してもあんま旨みがない。

282 :デフォルトの名無しさん:04/12/21 21:51:42
構文なんて些細な違いにすぎないんだが

283 :デフォルトの名無しさん:04/12/21 21:59:23
>>282
おれは逆にえらい違いだと思ってるわけで。

object method1(...) method2(...)
に対して
(method2 (method1 object ...)...)
((object method1 ...) method2 ...)
やっぱ連鎖適用で括弧がネストするのは美しくないなと。


Ioでは現状おまけみたいなものだけど、
連鎖適用とメッセージを駆使すれば適当な構文が書けたりする。
if (test_part) then (then_part) else (else_part)
とか。
たぶんこれ遅いんだろうなあ。


284 :デフォルトの名無しさん:04/12/21 22:02:55
ここは281のメモ帳じゃない。

285 :デフォルトの名無しさん:04/12/21 22:03:10
数学で、f(g(x), h(y))っていう書き方があるでしょ、
これはLispの表記法と一緒だよね。おれはこの部分でLispに違和感を感じたことはない。

286 :デフォルトの名無しさん:04/12/21 22:05:02
普通に(f (g x))と連鎖適用で括弧がネストするが?

287 :デフォルトの名無しさん:04/12/21 22:06:28
CommonLispにloopみたいなオブジェクト指向用の汎用マクロ作ってもらえ。

288 :デフォルトの名無しさん:04/12/21 22:07:12
いやそうだけど、括弧がネストするのが思考のさまたげにはなりにくいのでは
ないかい? 算数や数学でこの表記法に慣れているから。

289 :デフォルトの名無しさん:04/12/21 22:10:04
いや、数学の話じゃなくて、一般的になりつつある
object methodの書式の話なわけで。
Ioの
object method1(...) method2(...)
はC++では
object->method2()->method2()
ね。
無理解を装ってるだけだろうけど。

290 :デフォルトの名無しさん:04/12/21 22:12:34
上のC++の例は
object->method1(...)->method2(...)
の間違いね。
LISPの場合これぐらいならフロントエンド書けばおしまいだけどね。

291 :デフォルトの名無しさん:04/12/21 22:17:01
いや、無理解を装っているわけじゃないよ。
object methodの書式の話だとして、
CLOSではメソッドが属すジェネリック関数が、普通の関数と同じ書式で呼び出せる
ということに利点を感じて、(gf1 (gf2 obj0) (gf3 obj1))なんて感じの表記に
したのでしょう。

それが主流から外れているというのなら、ふ〜んというしかないけど。
全般的に劣った表記体系かといえば、そうは思わないという話。


292 :デフォルトの名無しさん:04/12/21 22:22:24
だらだら書く場合は、前に戻って関数挿入するのが面倒。
んで、その関数の引数について、こんどは右端までいかないと書けない。
これが主流のオブジェクト指向に向いてないという根拠の1つ。
数アクションぐらい余計に負担が掛かる。

293 :デフォルトの名無しさん:04/12/21 22:26:52
そっ、それは…、エディタがなんとかするということで、妥協できませんか。
すまん、もうねるぽ。

294 :デフォルトの名無しさん:04/12/21 22:38:52
>>292
そんな表面的な部分だけ取り上げて得意気になられてもなあ

295 :デフォルトの名無しさん:04/12/21 22:45:03
どこが表面的なんだか。
根幹に関わる。

296 :デフォルトの名無しさん:04/12/21 22:46:16
そのうちカッコを入力するのも面倒になり、
キーボードを打つのも面倒になるのだろうな。

297 :デフォルトの名無しさん:04/12/21 22:47:38
それこそCでオブジェクト指向できると言い張るぐらい滑稽。

298 :デフォルトの名無しさん:04/12/21 22:50:11
機械語でオブジェクト指向ってできないの?

299 :デフォルトの名無しさん:04/12/21 22:58:41
やりたかったらやりなさいよ。
でもつまらないよ。

300 :デフォルトの名無しさん:04/12/21 23:00:51
>>295
Lisp にとって、構文の問題は「表面的」なんだよ。
macro 書けば解決するから。

301 :300:04/12/21 23:02:15
ごめん、へんなこと書いた。忘れて。

302 :デフォルトの名無しさん:04/12/21 23:42:50
「o君、mしてね」というのだけが、オブジェクト指向じゃなかろうに、
「mしてね、o君」というのでも、オブジェクト指向なんじゃないの、
S式は、後者に適しているというだけなんじゃないの。

303 :デフォルトの名無しさん:04/12/21 23:51:06
オブジェクト指向にするとどんな利点があるのか分からない。

304 :デフォルトの名無しさん:04/12/22 00:42:51
>>302
o君、m1してね p1とp2で その後 m2してね p3とp4で

後でm2してね、最初にm1してね、o君、 p1とp2で ところでm2の件だけどp3とp4使ってね


わかりますか?

305 :デフォルトの名無しさん:04/12/22 00:46:13
つまり

前者が
object method1(p1, p2) method2(p3, p4)

後者が
(method2 (method1 object p1 p2) p3 p4)

なわけです。
後者は文章にするのも大変だということがわかりますか?

306 :デフォルトの名無しさん:04/12/22 00:50:26
オブジェクト指向とかゆうより前置記法が嫌なんだろ。
↓でも参考にして好きなようにすれば?
ttp://www.cliki.net/infix
ttp://lambda.s55.xrea.com/20040325.html


307 :デフォルトの名無しさん:04/12/22 00:51:48
オブジェクト指向は幻想

308 :デフォルトの名無しさん:04/12/22 00:52:20
後者の場合、methodが続くと大変なことになります。

最後にmnするんだけど、そのまえにmn-1してね、・・・
最初にm1してね、o君、
m1の件はp1とp2で。
m2の件ではp3とp4、・・・
mnの件は・・・なんだっけ?

一般人の短期記憶スタックは6〜8ネストぐらいが限界だとどこかで読んだ事がありますが、
口頭で言われた場合、理解できるでしょうか。


309 :デフォルトの名無しさん:04/12/22 00:56:11
>>306
当然ながらフロントエンドについては考えてるよ。

310 :デフォルトの名無しさん:04/12/22 01:04:18
(define-syntax chain
  (syntax-rules ()
    ((_ obj) obj)
    ((_ obj (m . args) . more)
      (chain (m obj . args) . more))))

(chain obj (method1 p1 p2) (method2 p3 p4))) -> (method2 (method1 obj p1 p2) p3 p4)

311 :デフォルトの名無しさん:04/12/22 01:22:35
>>308
そんなにダラダラ書いたらどんな記法であろうと分かりにくくなるのは当然だろ
なんのためのインデント、なんのための一時変数、なんのための括弧、なんのt(ry
要はあんたが前置記法では分かりにくいってだけでしょ
あんたに理解しづらいからといって他の人もそうであるとは限らない

312 :デフォルトの名無しさん:04/12/22 01:23:09
ネストが深くなるとインデントがつがつ入って
横長になっちゃって見辛い、てのはあるかなあ。
適当に切り分ければいいだけの話だけど。

でも、たとえばこんな感じの関数書けば、
(define cascade
  (lambda (x . fs)
    (fold (lambda (f knil) (f knil)) x fs)))
こんな感じに書けるけれど、
(cascade (iota 10) (filter$ even?) (fold$ + 0)) => 20
ちょっとややこしいのになるとあんまり書きやすいと感じなかったなあ。
上記の、インデントの関係で読みやすくはあったけど。

どうしてかな、て考えてみると、自分の場合はまず、結局最後は何やるの?
ていうのを考えて、それに渡す値はどうするの?
更にそれに渡す値は……みたいな感じの思考パターンで考えることが多いみたい。
元の値から結論に向って値を下げ渡していく感じじゃなくて、
最初に結論ありきでそれに向って差し戻していくイメージっていうか。上手く言えないけど。

実際のところ、最終的に何をしたいのかていうのは、
その途中の経路よりははっきりしていることが多いと思うので、
それをまず書いちゃって、それに渡す値を作るところは適当に副関数に切り分けておいて、
後からそれを別立てで書いたほうが思考の流れに沿って作業できないかなあ。

一方で充分にライブラリが揃っていて、後はそれを糊付けしていけばいい、
てところまで状態が整っているならば、obj->metha->methb->...
みたいな書き方のほうが楽かもしれない。

結局のところ、問題の質や切り分け方で、
それに適った思考過程、対応するような記法は変わってくるだろうから、
どういう記法が優れているか、ていう単純な話ではなくて、
それぞれの記法はどのように問題を切り分けるのに向いているか、てことじゃないかなあ。

313 :デフォルトの名無しさん:04/12/22 02:10:10
だらだら書いている間に話が進んでた。
>>304-305
後者について、generic function model で第一引数を
特別扱いするのがそもそも間違っている気がする。
(……なんか最近似たようなことを書いた記憶があるな)
message passing model に基づいて事象をモデル化したら、
message passing model に基づいた記法で書いたほうが素直になるのは当然でしょう。
そこで後者が文章にするのも大変て言われても、それはそうでしょうな、としか言えない。

無理にオブジェクトを人として扱うなら、
「o 君、p1 と p2 で」じゃなくて、「o1 君と o2 君と o3 君で」と考えた方がいい。
もっとも、それだと三人が一人になったり、
逆に(多値を返すような場合)一人が三人になったりして不気味だけど。

そういう意味じゃ、(例えば)オブジェクトを人としてモデル化したいような場合には
generic function model は確かに向いてないかもしれない。
でも、モデルなんて結局のところ問題把握のための道具でしかないんだから。
通用する範囲で便利に使えればいいし、無理があるような場合には脇に置いといたり、
場合によってはあっさり捨ててしまってもいいんじゃないかな。
どっちのモデルであれ、あるいはそれ以外のどのモデルであっても、固執するのは馬鹿らしいと思う。
ていうか、ひとつの完全なモデルがみつかってなら、
何でこれほどたくさんの「オブジェクト指向」言語が作られているのか、て話になる。

で、lisp のいいところっていうのは、
記法をそこそこ柔軟にモデルに合わせて作り変えられるってとこでしょ?
散々言われてきたことだけど。
例えばあるオブジェクトについて、手続きを順々に追っかけさせる、みたいなことをしたいなら、
自分が上に書いたのや >>311 さんが書いたようなやり方で簡単に出来るわけで、
そうした方が問題をすっきり記述できると判断するなら書きゃいいじゃんてことではあるけれど、
でもそれがどの問題についても妥当であるというなら、それは了見が狭いといいたい。

314 :デフォルトの名無しさん:04/12/22 02:24:20
前置記法がわかりずらいってケチつけてるだけだろ
lisp 族がメジャーになることはないんだから、わざわざ粘着するなよ

315 :デフォルトの名無しさん:04/12/22 09:42:44
連鎖適用って、そんなに嬉しいかな。
何か他の値を返すようなメソッドには使えないけど。
返り値がいらないようなメソッドを続けて使うのって、表示周りとかかな…

316 :デフォルトの名無しさん:04/12/22 10:37:35
連鎖適用って途中で切るオペレータが欲しいんだよな。
NULLやnilのような無効値だったらそれ以上進まないようなやつ。
リスト処理だけなら空リストで済むから問題ないんだけどね。


317 :デフォルトの名無しさん:04/12/22 10:54:50
(macroexpand '(-> obj (f0) (f1 arg1)))
=> (let ((obj1 (f0 obj)))
(if obj1 (let ((obj2 (f1 obj1 arg1))) obj2) obj))

というマクロ->を定義するのは簡単だよね。nilになる一歩手前のオブジェクトを
返してくれる。

318 :デフォルトの名無しさん:04/12/22 10:57:17
(define-syntax chain
  (syntax-rules ()
    ((_ obj n) obj)
    ((_ obj n (m . args) . more)
      (let ((c (m obj . args)))
        (if (eq? c n) n
            (chain c n . more))))))

letの変数ってこれで大丈夫なのかな?

319 :デフォルトの名無しさん:04/12/22 11:33:04
後置記法のLispを作ればいいんじゃないの。
データについて考えてみても、cons してから reverse (nreverse)
ってのをよくやる(見る)けど、あれ無駄な気がしてならない。


320 :デフォルトの名無しさん:04/12/22 11:38:33
>>319
前半と後半の繋がりがよくわからない

321 :デフォルトの名無しさん:04/12/22 11:52:55
>>319
consセルの先頭に突っ込むのとケツに突っ込むコストが同じだというのか。キミは。

322 :デフォルトの名無しさん:04/12/22 12:52:36
dequeが欲しけりゃリストの先頭と末尾を指すconsを一個持てば作れるけどな。
破壊的操作が必要になるのであまり嬉しくないけど、
計算量的にそれが必要ならやればいいだけの話。




323 :319:04/12/22 13:11:38
>>321
いやそういうことではなくて…。後置記法Lispの場合、consで先頭に
突っこんでいくと逆さまになるのも気にならなくなるのでは、
ということです。


324 :デフォルトの名無しさん:04/12/22 13:29:57
そんなあなたにDylanを





いえ、すんません。巣に帰りまつ(;´Д`)

325 :デフォルトの名無しさん:04/12/22 13:32:00
アホすぎ。reverseかけるのは気になるならないの問題じゃないんだが。


326 :デフォルトの名無しさん:04/12/22 14:54:18
(define (copy-list1 l)
(let loop ((l l) (r '()))
(if (null? l) (reverse r)
(loop (cdr l) (cons (car l) r)))))

(define (copy-list2 l)
(let loop ((l l) (c (lambda (x) x)))
(if (null? l) (c l)
(loop (cdr l) (lambda (x) (c (cons (car l) x)))))))

(define (copy-list3 l)
(if (null? l) '() (cons (car l) (copy-list3 (cdr l)))))

(define (copy-list4 l)
(let ((n '(())))
(let loop ((l l) (r n) (end n))
(if (null? l) (cdr r)
(begin (set-cdr! end (cons (car l) '()))
(loop (cdr l) r (cdr end)))))))

速度は
copy-list1 > copy-list4 >>> copy-list2 >>>>>> copy-list3
くらいでした。copy-list4 はなんで遅いんだろ。

327 :デフォルトの名無しさん:04/12/22 15:24:59
>>326
リストの長さや処理系によっても随分違うものになるだろうから
それらを特定しない比較には意味が無いような

328 :デフォルトの名無しさん:04/12/22 15:27:26
copy-list4はrが冗長なパラメータだろう。それはそれとして、
リストの長さを変えても傾向は変わらなかったのか?


329 :デフォルトの名無しさん:04/12/22 15:34:46
(define (copy-list5 l)
(apply list l))

330 :デフォルトの名無しさん:04/12/22 15:45:16
>>328
ほんとですね。とりあえず、

(define (fact f n)
  (if (= n 1) f (lambda (x) ((fact f (- n 1)) (f x)))))

(define (num-list n)
  (let loop ((n n) (r '()))
    (if (zero? n) r (loop (- n 1) (cons n r)))))

として

((fact copy-list1 X) (num-list Y))
みたいな感じで計ってみました。
Yを大きくすると copy-list4が速くなると思ったんですが、
copy-list1の方が速かったです。処理系は Gaucheです。
他の処理系でも試してみます。

331 :デフォルトの名無しさん:04/12/22 15:54:51
cons,cdr,set-cdr!が同じ時間で実行できるとして
copy-list1,copy-list4がそれぞれどれくらいの時間でできるか計算してごらん。

copy-list1はgcの時間をのぞいたら変わらないと思うよ。

332 :デフォルトの名無しさん:04/12/22 16:19:22
(define (my-reverse l)
(let loop ((l l) (r '()))
(if (null? l) r
(loop (cdr l) (cons (car l) r)))))

(define (copy-list6 l) (my-reverse (my-reverse l)))

としたら copy-list4 > copy-list6 でした。
つまり copy-list1は組み込みのreverseを使っているから速いってことでしょうか。
リストの長さをNとすると copy-list1は 6N、copy-list4 は 5Nくらいの計算量に
なるんですかね。

333 :デフォルトの名無しさん:04/12/22 16:40:56
guileでも同じ様な結果でした。
ちなみに Gauche組み込み対決では
list-copy と (lambda (l) (reverse! (reverse l)))
が互格でした。
こういうリスト全体の処理では組み込みの reverseを使った方がいいってことですね。
あとからリストの後ろに破壊的に要素を足していきたい場合は deque方式と。

334 :デフォルトの名無しさん:04/12/22 18:15:19
>つまり copy-list1は組み込みのreverseを使っているから速いってことでしょうか。
そうです。

copy-list1は2回cdrをたどってるから2N、copy-list4はNで
reverseがどんなに速くても、copy-list1はNより速くならないと考えるかもしれないけど、
copy-list1は6N、copy-list4は5Nになる。
copy-list1の内reverseにかかる部分が3Nで、コンパイルしたら2倍から10倍で実行できるとすると
4.5Nから3.6Nで実行できるわけです。

実際にどれくらいの速度差で実行してるか調べてみたら?

335 :デフォルトの名無しさん:04/12/22 18:18:48
3.6N -> 3.3N

336 :デフォルトの名無しさん:04/12/23 04:13:37
(defun copy-list (list)
(mapcar #'identity list))

mapcar って組み込みだろうから、ごちゃごちゃコード書くより一番速い気がする。

ご参考
http://www.lisp.org/table/style.htm#efficiency

337 :デフォルトの名無しさん:04/12/23 06:35:11
(define (copy-list l) (append l '()))

338 :デフォルトの名無しさん:04/12/24 11:48:17
そんなに速度気にするんならコンパイルできる処理系で
コンパイルした方がいくない?


339 :デフォルトの名無しさん:04/12/24 21:48:34
自作のScheme処理系のためのコンパイラを書いてるんですが、named let は
次のような感じで変換すればオーケーでしょうか?
letrecをまだ用意していないもので。

(let loop ((a foo)
      (b bar)
      (c baz))
 body)
=>
(let ((loop #f)
   (a foo)
   (b bar)
   (c baz))
 (set! loop (lambda (a b c) body))
 (loop a b c))


340 :(define (´∀`) 'マターリ):04/12/25 03:14:12
(((lambda (f x) (lambda y (apply (x (f f x)) y)))
(lambda (f x) (lambda y (apply (x (f f x)) y)))
(lambda (loop) (lambda (a b c) body)))
foo bar baz)

341 :デフォルトの名無しさん:04/12/25 10:47:50
>>339
foo, bar, bazのスコープにloopが入ったらまずいんでない?


342 :デフォルトの名無しさん:04/12/25 11:06:56
>>341
入るのでしょうか? 入らないように思えるのですが。
gosh> (define loop '|(゚∀゚)アヒャ|)
loop
gosh> (let ((loop #f) (a loop) (c (lambda () loop))) (list a (c)))
(|(゚∀゚)アヒャ| |(゚∀゚)アヒャ|)


343 :デフォルトの名無しさん:04/12/25 11:29:40
>>340
一見しただけでは何が何やらですが、理解に努めてみました。

> (lambda (f x) (lambda y (apply (x (f f x)) y)))
これをF
> (lambda (loop) (lambda (a b c) body)))
これをL
とおくと
((F F L) foo bar baz)
になって、少し展開すると
((let (loop (F F L))
(lambda (a b c) body))
foo bar baz)
みたいになりますね。
このbodyの中でloopを呼ぶと((F F L) a b c) のに戻って繰り返すわけですね。
面白い。こういうのをストリームというんでしょうか。


344 :デフォルトの名無しさん:04/12/25 12:38:59
>>211
ホントですか?
Cygwin 1.5.12-1

Gauche0.8.3 と Gauche-gtk-0.4.1
だと
gauche-glib.cのmakeでエラーがでてしまいます。

どーやったらコンパイルできるようになるのでしょうか?


345 :339:04/12/27 14:13:10
コンパイラが初期化用手続きを吐けるようになりましたので記念上げ。
# いまんとこコンパイラを動かすにはGaucheが必要だったりするんですが

ところで自由変数を参照しない手続きを呼ぶ用語に困っているのですが、
何か適当な用語はあるでしょうか。
環境を持たないクロージャなんですが、組み込みの手続き(コンパイラが即値で
書き込む)を利用するので副作用があって関数とも呼びにくいのです。
ちなみに大域環境はありません。


346 :デフォルトの名無しさん:04/12/27 15:06:23
完成おめ。
これからブートストラップしてくんだね。

ところで環境を持たないクロージャとは、単純にトップレベルで
作成するような関数のことかね?
すなわちその関数内部の変数参照がローカル内で完結している関数
という解釈でいいのかな。
それとも、環境を持たないクロージャというのを、
限定構文を使うなりで明示的に宣言して作成するということかね。
副作用がSchemeからは見えず、処理系の内部的な話なのであれば、
特に区別する必要もない気がするが。
明示的なものであれば、例えばCにトランスレートするのが前提の関数なら
cfuncとかcdefineとか機能や意図に基づいた名前を付けるぐらいしか
思いつかないが。
あとは既存の処理系の名前を漁ってみるしかないんじゃないかな。


347 :339:04/12/27 15:31:35
>>346
どうもです。

> ところで環境を持たないクロージャとは、単純にトップレベルで
> 作成するような関数のことかね?

そうです。レキシカル変数(引数か、内部で積む環境フレーム上の変数)だけ
使うもののつもりでした。



348 :デフォルトの名無しさん:04/12/27 19:27:05
consとかcarとかつかわないの?

349 :デフォルトの名無しさん:04/12/27 21:16:03
>>4
次スレからは

http://swiss.csail.mit.edu/classes/6.001/abelson-sussman-lectures/

もテンプレに加えてちょ。 ビデオ講義がある。 居ながらにしてMITの講義が見れるぞ。

350 :デフォルトの名無しさん:04/12/27 22:00:13
過去スレ以外は別ページにすべきだよ。

351 :デフォルトの名無しさん:04/12/27 22:13:25
まとめサイトがありゃいいけど
おれにはそんなの作る気力がない
まあ当面は>>2以降にだらだらでいいやね

352 :デフォルトの名無しさん:04/12/27 22:17:22
>>349
他の講義のビデオも有ったりするの?

353 :デフォルトの名無しさん:04/12/27 23:51:29
>>344
Gauche 側の gauche.h の SCM_EXTERN から __declspec(dllimport) を削って
Gauche-gtk 側は libgauche-uvector をリンクするよう追加するだけ。
最近の ld と gcc なら dllimport は無くてもよしなにやってくれるから。

354 :デフォルトの名無しさん:04/12/27 23:55:14
冬休み暇なやつがまとめページ作ります

355 :デフォルトの名無しさん:04/12/28 03:14:37
>>352
http://ocw.mit.edu/OcwWeb/index.htm

にMITの講義録やシラバスがあるが、ビデオは数えるほどしかない。 将来的には
もっとビデオを増やすらしい。 

ここはLispスレだし、その方面のバイブルがタダで手に入って、かつ、講義まで全部見れるんだから
世の中便利になったと思います。 

個人的にはSICPは冗長な気がする(特に、1〜3章)けど、4,5章は真面目に読む価値があると
思う。 実際に自分で手を動かして、Schemeのインタプリタやランタイム&コンパイラをJavaや
C++で実装するとホントに理解が深まる。 CSを勉強するときには実際に手を動かした時に学んだ
ノウハウが大きな財産になるから、暇な人はトライしてみる価値がある。

356 :デフォルトの名無しさん:04/12/28 05:47:27
CSって何?

357 :デフォルトの名無しさん:04/12/28 06:12:49
>>356
今年マリノスが勝って終わったやつ。

358 :デフォルトの名無しさん:04/12/28 06:14:58
東経110度でスカパーとかやってるやつ。

359 :デフォルトの名無しさん:04/12/28 06:16:22
無線とかで最初にいうやつ。

360 :デフォルトの名無しさん:04/12/28 06:17:08
シャア専用の略

361 :355:04/12/28 07:09:08
マジレスするとComputer Scienceの略。 コンピュータ・サイエンス専攻なら英語で

I'm a CS major at ** university. で通じるよ。

362 :デフォルトの名無しさん:04/12/28 07:58:20
Computer Systemかと思った。

363 :デフォルトの名無しさん:04/12/28 09:53:15
>>345
> ところで自由変数を参照しない手続きを呼ぶ用語に困っているのですが、
> 何か適当な用語はあるでしょうか。

「自由変数を参照しない手続き」といえばコンビネータだけど
ちょっとニュアンスが違うような気もしないでもない?


364 :デフォルトの名無しさん:04/12/29 06:26:15
「副作用があるから関数とは呼びにくい」って書いてなかったか…?
コンビネータは、普通はあまり副作用のないイメージが。

「閉じた式」(=自由変数のない式)の類推で、「閉じた手続き」じゃ駄目?

365 :デフォルトの名無しさん:04/12/29 17:19:52
関数じゃないならSubとかProcedureでいいじゃん

366 :デフォルトの名無しさん:04/12/31 18:31:22
凄く初歩的なことのような気がするのですが質問良いでしょうか…

(define aaa "hello, world")
(define (bbb) 'aaa)

(ccc (bbb)) => "hello, world"

になるような手続きcccってあるんでしょうか。
evalしかないですか?

367 :デフォルトの名無しさん:04/12/31 21:41:59
あとはマクロぐらいじゃない?

368 :デフォルトの名無しさん:05/01/01 00:02:46
quoteをつけることによって、evalしないわけだから、この場合明示的にevalしなきゃ
いけないんじゃない? sicpの4章を読みましょう。

369 :366:05/01/01 01:41:30
そうですか。ありがとうございます。

とりあえずSICPも読んでみます。

370 :デフォルトの名無しさん:05/01/01 02:09:29
束縛をつかうからダメなだけで、シンボルと値の対応表を別に作ってassqすればいいんでないかい?

371 :344:05/01/04 02:29:37

>>353
遅くなりましたが、教えていただきありがとうございます。
これから試してみます。


372 :デフォルトの名無しさん:05/01/04 13:17:26
関数で、結果が環境に依存せず引数だけで決まり、また、
副作用ももたないものを形容する言葉はありますか?
+や-などがその仲間だとおもいます。よろしくお願いします。

373 :339:05/01/04 13:39:34
明けましておめでとうございます。

返事がおくれてすみません。
>>363,364
さすがにコンビネータはちょっとそぐわない気がいたします。
閉じた手続きはいいかも知れません。closed-procedureでしょうか?

>>348
そういうのは組込みの手続きを用意していてそれをコンパイラが埋め込みます。
初期化段階ではLisp/Scheme的な大域環境が(シンボルも)存在しないので。

>>372
それを関数(function)と呼ぶのではないでしょうか。
副作用があったり環境に依存するものを含めた総称がprocedureではないかと思います。


374 :デフォルトの名無しさん:05/01/04 14:07:48
>>373
> それを関数(function)と呼ぶのではないでしょうか。
> 副作用があったり環境に依存するものを含めた総称がprocedureではないかと思います。
すみません、書き忘れました。Common Lispに限定しますと、規格書やコミュニティー内でも、
そのような区別はされていないようです。
(functionpなんてpredicateはそういう区別をしません。)

375 :339:05/01/04 14:35:39
Common Lispの場合はそうですね。

関数が手続き一般を指す場合、"pure function" というのが使われることが
多そうな気がします。元はfortran用語でしょうか。



376 :デフォルトの名無しさん:05/01/04 15:09:23
>>375 なるほど。ありがとうございました。

377 :デフォルトの名無しさん:05/01/04 20:26:09
>>373
(define (hoge x y) (cons x y))
(define (cons x y) ...)
はどう処理されるの?

378 :339:05/01/04 22:56:14
>>377
いまのところ、そういうことはしない、というのが答です。
というのも、フルセットのScheme環境を用意するための「ローレベルScheme」
みたいなものが趣旨なので。シンボルも環境もこれを使って書くわけです。
# 今のところベクタも文字列もシンボルもありません

現状、大域変数はコンパイル単位で完結し、かつちょっと情けないですが1パスで
> (define (hoge x y) (cons x y))
ここでconsは組込み定数の参照("SCM_OBJ(&cons)"みたいな)に置き換えられ
> (define (cons x y) ...)
以降はconsに割り当てられた大域変数を参照します。
必要なら、lambda中の大域変数の操作をいったん擬似命令として出力する2パスで
今の条件でも(コンパイル単位で完結するのは変わりませんが)例のようなケースの
参照を普通のSchemeのようにできるとは思います。

今のところ大域変数の実体はコンパイル単位全体を包む最下段のレキシカル環境
フレームという身も蓋もない実装です。一段落ついたら、
defineされる大域シンボルのうち定義だけされるものと
変更されるものを区別して、後者のみCの変数を記憶場所に割り当て、
前者は定数化して参照を直接埋め込むようにする予定です。それが済めば
コンパイル単位間で大域変数を共有することも(必要性はともかく)できるはずです。

共通の大域環境を参照する普通のSchemeのコードをどうコンパイルするかは
そのうちシンボルや大域環境をローレベルschemeで書きながら決めます。



379 :デフォルトの名無しさん:05/01/05 17:09:56
Daniel P. Friedman: A Celebration
ttp://www.cs.indiana.edu/dfried_celebration.html

380 :デフォルトの名無しさん:05/01/06 20:14:13
>>380
Schemeで著明な人達の写真が見れるね。
Guy Steeleの顔ぐらいしか知らなかった。

381 :デフォルトの名無しさん:05/01/07 17:30:58
ドレッドヘアーの黒人は誰?

382 :デフォルトの名無しさん:05/01/08 19:24:40
lisper が書く情報科学の wikibooks を見てみたい。

383 :デフォルトの名無しさん:05/01/08 23:12:10
どなたかSECDR-Schemeの再ウプきぼんぬ。
小さくて速い処理系を探してまして、最も有望なBitとSECDR-Schemeのポインタが切れていたもので。

384 :デフォルトの名無しさん:05/01/09 01:40:07
リンクは切れてたけど適当にURL推測したらあったよ>SECDR。
去年の話だけど。


385 :デフォルトの名無しさん:05/01/09 22:54:38
型付きラムダ計算について書いてある資料で、
何かお勧めのやつあれば教えてください。
サイトでも教科書でも構いませんので……

MLのスレで聞いたほうがいいのかな?

386 :デフォルトの名無しさん:05/01/09 22:56:29
型付きラムダ計算について書いてある資料で、
何かお勧めのやつあれば教えてください。
サイトでも教科書でも構いませんので……

MLのスレで聞いたほうがいいのかな?

387 :デフォルトの名無しさん:05/01/10 12:40:00
>>386
MLの偉い人で、大堀先生の本はどうだろう。

共立出版 情報数学口座9「プログラミング言語の基礎理論」
http://www.jaist.ac.jp/~ohori/texts/index.html

この本に
形無しλ計算 → 型付きλ計算 → 多相型λ計算 → ML
の順番で説明されてたと思う。





388 :デフォルトの名無しさん:05/01/10 16:37:40
>>387
その本にもあるかわかんないけど、
おれ論理式がよくわかんなかった。
でかい分数表記のやつ。
つーかあの辺理解できる気がしない。
実際どう動くかコードで示してほしかった・・・なんて無茶か。


389 :デフォルトの名無しさん:05/01/10 16:46:15
>>383
ttp://paw.s2.x-beat.com/up/img/4398.zip
zipの中身がSECDR-Scheme1.0.tgz
これのオリジナルが置いてあった場所はniftyだったと思う。


390 :デフォルトの名無しさん:05/01/10 22:45:48
>>387
レスどうもありがとうです.
とりあえず図書館で探して読んでみるとです.

391 :383:05/01/13 22:48:04
>389
多謝。ドキュメントが詳しいのも良いっすな。

392 :紫藤:05/01/18 11:24:21
reply to 58:
> Paul Graham, ANSI Common Lisp の練習問題の解答を載せた
>ホームページ等、ご存知でしたら教えていただけませんでしょうか

http://www.geocities.jp/shido_takafumi/pacl2.html
に書いたのでよろしかったら見てください。
せっかく書いたのに誰も見てくれないので宣伝します。

393 :デフォルトの名無しさん:05/01/20 22:58:06
習作のSchemeもどきの実装を晒しても良いですか?

394 :デフォルトの名無しさん:05/01/20 23:01:13
>>393
おねがいします。

395 :デフォルトの名無しさん:05/01/20 23:05:12
初めて作った実装なのでダメダメかもしれません。
とりあえず mini-schemeよりは速いはずです。
継続がなくて、マクロもどきや環境がファーストクラスです。
中間コードにコンパイルする方法を勉強して継続を実装したりしたいです。
http://primes.dnip.net/scheme.cpp

396 :デフォルトの名無しさん:05/01/21 10:40:10
>>395
たらい回ししてみようか…と思ったら、比較オペレータは定義されてなかった。
まだまだテスト版だからってことでしょうか。

ちょっと見てみると、scheme_oprtクラスとか無駄してるような…。
C++で実装するというのは、C使いの自分には面白かったです。がんばってください。

これだけのコードでまがりなりにも
処理系を作れてしまうというのが、Scheme(lisp)の良さですよね。

397 :デフォルトの名無しさん:05/01/21 11:44:13
>>396
比較オペレータなどを定義してみました。
scheme_oprtクラスは無駄してるでしょうか? よく分かんないです。
整数や真偽値や基本手続きをポインタではなく即値で埋めこむテクニックを知ったのですが
この先中間コードにコンパイルすることを考えると、今はどっちでもいいのかなあと思いました。

中間コードの話はSICP5章とドラゴンブック以外に参考になる文献はあるでしょうか?
特に継続の実装がさっぱり分からないです。

398 :396:05/01/21 14:45:19
>>397
わっ、反応早い!

scheme_oprtクラスのprintメソッドは、簡単なやり方でも、
とりあえず先にprintf("#<subr ")しておいて、if文でプロシージャ名をprintfして、
最後に">"をprintfしておいた方が、無駄な文字列データが減るはずです。

aplyメソッドも、プロシージャごとに完全なコード書かずに、汎用化するとか。

色んな意味でRHG(Ruby Hacking Guide)とGHG(Gauche Hacking Guide)は
役に立つと思いますが、すでに見ているか。

399 :デフォルトの名無しさん:05/01/21 16:07:14
>>398
printメソッドの話ですか。そこらへんは適当です。
Rubyのは少し見てましたが、Gaucheのは知りませんでした。
C++は細かいとこが直感的に分らないのでCで書きたくなってきました。

質問なんですが、手続き呼びだしの時、環境をコピーするより名前置き変えの方がいいですよね。
あと、SRFI-17の set!を実装するには全てのオブジェクトのサイズを同じにしないといけないんでしょうか?

400 :デフォルトの名無しさん:05/01/22 01:57:46
>質問なんですが、手続き呼びだしの時、環境をコピーするより名前置き変えの方がいいですよね。
クロージャーの呼び出しでは引数を束縛して新しい環境を作るけど、これはコピーとはちょと違うし、名前の置き換えというのも何を意味しているのかちょとわからないなり。
>あと、SRFI-17の set!を実装するには全てのオブジェクトのサイズを同じにしないといけないんでしょうか?
SRFI-17のほうは例えば(define x "hogehoge") (set! (string-ref x 4) 3.14)みたいなことはエラーになるべきだから考えなくていいんじゃないかな。


401 :デフォルトの名無しさん:05/01/22 03:00:08
>>400
>クロージャーの呼び出しでは引数を束縛して新しい環境を作るけど、これはコピーとはちょと違うし、名前の置き換えというのも何を意味しているのかちょとわからないなり。
環境を壊したくないので、クロージャーを呼び出した時点での環境をコピーしてそれに引数の束縛を足して使うという意味です。
新しい環境を作るのにコピーはしないんでしょうか? 名前の置き変えは、環境は一つだけでかぶる引数の名前を全部置き変えるということです。

環境をリストで表現して先頭から新しい束縛を足して、検索するときは先頭から順番に調べるようにすれば、一つのポインタのコピーだけで済んで良いかなあと思いました。
ハッシュと違って検索に束縛の数に比例して時間がかかるのが欠点ですがどんなもんでしょうか。

>SRFI-17のほうは例えば(define x "hogehoge") (set! (string-ref x 4) 3.14)みたいなことはエラーになるべきだから考えなくていいんじゃないかな。
なんか勘違いしてました。ポインタの指す先を変更しないといけないのかと思ってました。

402 :デフォルトの名無しさん:05/01/22 11:15:08
>>401
>環境を壊したくないので、クロージャーを呼び出した時点での環境をコピーしてそれに引数の束縛を足して使うという意味です
ふむふむそういうことだったか....
最初に、クロージャーの呼び出し時にはその意味での環境のコピーはないなり。すでに存在する環境に引数から作った環境をリンクするだけなり。
次に、lambdaでクロージャーを作るときは環境をスタックからヒープに移動することはあるけれど、元のスタック上の環境は以後は使われなくなるなり。
>新しい環境を作るのにコピーはしないんでしょうか?
引数から新しい環境を作ったら以前の環境に対してリンクを張るだけなり。

このへんは >>3 の"Practical Scheme"が詳しい。
特に実装についてはその中の以下のページが素晴らしいなり。
ttp://www.shiro.dreamhost.com/scheme/stack-j.html
ttp://www.shiro.dreamhost.com/scheme/gauche/memo-stack-j.html

403 :402:05/01/22 11:37:42
>すでに存在する環境に引数から作った環境をリンクする
「すでに存在する環境」はクロージャーの持っている環境のことなり。
>元のスタック上の環境は以後は使われなくなるなり
これは完全にゴミになるということなり(実際デバッグ時には"0xcafecafe"とかで破壊するとよい)

どうもShiroのようにはうまく説明できないのう。

404 :デフォルトの名無しさん:05/01/22 12:00:50
secd machineでぐぐれば一発でわかると思う。


405 :デフォルトの名無しさん:05/01/22 12:36:55
>>402
なるほど。ちょっと難しいですが、20%くらい分かった気がします。
名前を検索するときは envポインタからたどって、
一番下の環境->一個上の環境->もう一個上の環境 という風に探していくんでしょうか?
なんか効率が悪いような。環境一つ一つはハッシュなんでしょうか?

>次に、lambdaでクロージャーを作るときは環境をスタックからヒープに移動することはあるけれど、元のスタック上の環境は以後は使われなくなるなり。
なんで使われなくなるのか良く分からないです。これはスタックマシンのVMの話だからまた別の話なのかもしれませんけど。

406 :デフォルトの名無しさん:05/01/22 13:01:52
SICP 4.1.7にあるような構文解析をしようと思ったんですが、quoteや ifに別の値が束縛されていると困ることに気づきました。
妥協案として実行時に defineや lambdaに出食わしたら、その時の環境を使ってボディを構文解析するというのを思いつきますた。

でもそれでは
(define (my-if a b c) (let ((if if)) (if a b c)))
は解析できても
(define (my-if a b c) (if a b c))
というノーマルなやつが解析できないと思いますた。でも Gaucheでは

gosh> (define (my-if a b c) (if a b c))
my-if
gosh> (define if list)
if
gosh> (my-if #t 0 1)
0

となりました。
というか上のバージョンは実行できなかったです。scmでも実行できなくて、scheme48では定義すらできませんでした。
guileでは実行できました。
という訳で、実行時に defineや lambdaに出食わしたら rootも含めた環境でボディ部を構文解析するというのでいいのでしょうか?
それとも ifを別の名前に束縛してる場合は諦めて、ifが上書きされてないか気合いでチェックして実行前に構文解析してしまうのがいいんでしょうか?

407 :デフォルトの名無しさん:05/01/22 13:06:23
>>405
>一番下の環境->一個上の環境->もう一個上の環境 という風に探していくんでしょうか?
基本はその通り。
>なんか効率が悪いような。環境一つ一つはハッシュなんでしょうか?
間違いなく効率が悪い。だからインタープリターでも中間コードを使ったり、コンパイラはさらに気合いを入れた最適化をするなり。
>環境一つ一つはハッシュなんでしょうか?
トップレベルだけはハッシュを使う実装が多い。
>なんで使われなくなるのか良く分からないです
これは環境の複製を作って、オリジナルと複製の両方を使うということがないという意味で書いてみたんだけと、説明の書き方が悪かったかなりね。

>>404 secd machineでぐぐれば一発でわかると思う。
いいね〜SECDマシーン。

ちなみに、SECDによるScheme実装にはLispMeもあるなり。こっちは"SECD LispMe"でググルべし。
(LispMeという名前だけどSchemeだよん)

408 :デフォルトの名無しさん:05/01/22 13:33:54
>>406
(define (my-if a b c)
 (let ((if if))
  (if a b c)))
--> syntax errorまたはunbound variable 'if みたいなエラー

(let ((if list))
 (define (my-if a b c)
  (let ((if if)) (if a b c)))
 (if 1 2 3))
--> (1 2 3)

これはifに束縛値があれば変数として扱い、なければsyntax keywordとして扱っているからで、構文解析するときにはトップレベルから発生しているすべての束縛を記録しておく必要があるなり。これはよくcompile time environmentと呼ばれているなり。

ちなみにgaucheで実行できるのは、
gosh> (define (my-if a b c) (if a b c))
で中間コードに変換されるときにifがsyntaxのifとして中間コードに書き込まれていて後の
gosh> (define if list) の影響を受けないから。
gosh> (define if list) (define (my-if a b c) (if a b c)) (my-if #t 0 1)
とやれば(#t 0 1)が返されるはず。
gosh> (define (my-if a b c) (let ((if if)) (if a b c)))
はやはりエラーになるんじゃないかな?

最後に、どのmy-ifの定義もifと同等の定義にはなっていないよ。これは念のためなり。

409 :408:05/01/22 13:39:37
おっと、
(let ((if list))
 (define (my-if a b c)
  (let ((if if)) (if a b c)))
 (if 1 2 3))

(let ((if list))
 (define (my-if a b c)
  (let ((if if)) (if a b c)))
 (my-if 1 2 3))
のまちがいなり。4行も書くとバグがでるなりね(笑

410 :デフォルトの名無しさん:05/01/22 13:54:59
>なり
ウザイ

411 :デフォルトの名無しさん:05/01/22 14:05:02
>>408
えっと上のやつは
(define my-if (let ((if if)) (lambda (a b c) (if a b c))))
の間違いです。アホでした。どちみちエラーなんですけど。
>これはifに束縛値があれば変数として扱い、なければsyntax keywordとして扱っているからで、構文解析するときにはトップレベルから発生しているすべての束縛を記録しておく必要があるなり。
なるほど。記録しておく、というのは束縛が発生しているかいないかくらいでいいんでしょうか。

>これはよくcompile time environmentと呼ばれているなり。
compile time environmentですか。この言葉だけで全てが分かった気になりますた。
マクロの展開の話もこれですよね。つまりSICPみたく (analyze exp)とはできず (analyze exp compiletime-environment)
でないといけないと。

412 :デフォルトの名無しさん:05/01/22 14:15:07
>>407
>間違いなく効率が悪い。だからインタープリターでも中間コードを使ったり、コンパイラはさらに気合いを入れた最適化をするなり。
やっぱそうですか。それが嫌で、コピーするようにしたんですよね。どうせクロージャ作る時はマージするんだろうし、と思って。
でもコピーのコストが気になるのと set!に対応できないので >>401みたいなことを考えたんです。トップレベルだけがハッシュというのも納得できる
気がします。

>これは環境の複製を作って、オリジナルと複製の両方を使うということがないという意味で書いてみたんだけと、説明の書き方が悪かったかなりね。
単純にそういうことですか。理屈で分かっても実際にどういう風に操作をするのか想像できないので、ちょっと理解できなかったです。
たぶん、単にVMを作ったことないからだと思いますが。

413 :デフォルトの名無しさん:05/01/22 14:47:21
おれはマクロや構文のキーワードの参照したらエラーとして
弾いちゃって良いと思うけどなあ。
混乱するだけでなんも良いことないし。
それよりSchemeは名前空間関係を整備してほしい。

414 :デフォルトの名無しさん:05/01/22 15:09:12
>>412
ローカル変数へのset!のことを考えると、基本的に環境はコピーできない。
ただ、set!されるローカル変数は静的に解析できるので、それだけを
ヒープアロケートしたメモリに置いて間接参照し、それ以外(参照only)の
変数はコピーしてしまう、という手法はある。ディスプレイって言ったっけ?
もう記憶があやふやだが。


415 :デフォルトの名無しさん:05/01/22 16:32:19
>>414 のいってるやつは"orbit compiler scheme"でググればタダで論文が読めるぞ。
いろいろな最適化を幅広く解りやすくまとめてあるので
ttp://www.ccs.neu.edu/home/will/Twobit/ultimate.html
もお勧めだ。いざ進め地獄の果てまでも(笑

416 :デフォルトの名無しさん:05/01/22 16:42:14
>>414 >>415
そういう方法も研究されてるんですね。調べてみます。
みんな物知りですね、ほんと。

417 :デフォルトの名無しさん:05/01/23 00:21:04
>>415
また一人の男が門をくぐった…その門の名は lambda の門。
ガンガレおまいらw

418 :デフォルトの名無しさん:05/01/23 00:58:21
俺も今schemeのインタプリタ作ってるので非常に参考になります…。

419 :デフォルトの名無しさん:05/01/23 23:27:34
シンボルから引けるオブジェクトをスタック構造にするというのは問題あるでしょうか?
set!にも対応できるし、クロージャを作るときはトップだけをコピーすればいいし問題ないように思えるんですが
(どれをpopするか覚えとかないといけないですけど)、継続が絡むと破綻するってことはあるんでしょうか?

あと Gaucheは ifだけでなく consみたいな基本手続きも埋めこんでる様なんですが、これは時に仕様に反しないでしょうか?
(define (cons a b) (cons a b))
(cons 0 0)
は無限ループになるべきだと思うんですけど。
(define (cons a b) (cons a b))は
構文解析でcons, a, bは束縛変数だと分かるのでそれらには埋め込めないですよね
consが上書きされたら自分にアクセスされなくなるので、consに自分自身を埋めこむのはありかなと思ったんですが、
(define cons2 cons) (define cons list) とかされる可能性もあるのでやっぱ埋めこめないですね。
最適化の為に目をつぶったって感じでしょうか。

>>402 のGaucheのVMのスタック操作っていうページはかなり素晴らしいですね。
環境の扱いが検索する側にとって非効率に見えるんですけどそれでもあの速度がでるんですね。
上に書いた実装じゃ継続の実装も変わってくるだろうし、総合的に見たらどうなんですかね。

あと、実行前に構文解析するようにしても速度変わりませんでした。
lambdaとifくらいしかやってないんですけど。速くなるべきなんですかね。

420 :デフォルトの名無しさん:05/01/24 00:29:06
lambdaの最適化について妄想ですが、
クロージャを作るときにボディを構文解析して第一引数の使われる場所に間接参照(ポインタのポインタ)を置いておく。
第二引数以下の使われる場所にもそれぞれ別の間接参照を置いておく。間接参照は評価されると参照先のものになる。
applyされるとそれぞれの間接参照がそれぞれの引数を指すようにする。set!は間接参照をいじることで実現する。
っていうのでトップレベルの変数以外のlookupが無くなる気がするんですが、どうでしょうか。
evalの扱いが微妙になるとは思うんですが。

421 :デフォルトの名無しさん:05/01/24 01:32:50
>あと、実行前に構文解析するようにしても速度変わりませんでした。
>lambdaとifくらいしかやってないんですけど。速くなるべきなんですかね。
式のタイプによる分岐を実行前に事前にしておくのが肝なので、
他の構文や手続きの適用、シンボル等もやらないと。
速度は一割五分ぐらいよくなるかなあ。

422 :デフォルトの名無しさん:05/01/24 02:01:29
>>421
そうですか。かなり地道な作業ですよね。コードの量が一気に増えるので微妙にためらってしまいます。
シンボルの構文解析って意味あるんですかねえ。SICPレベルだと全然意味ない気がします。

ところで()の評価は仕様で決まってないんでしょうか?
仕様を見る限り()は式では無いように思えるんですが、実際には()を返す処理系がたくさんあります。

423 :デフォルトの名無しさん:05/01/24 02:28:41
SICPのような実装だと意味がある。
環境を辿って束縛している値を探す、正味の実行時間は変わらないけど
評価のたびごとにcondの条件判定をしている部分が省けて、
手続きの適用をするだけになって高速化するわけだから。
(condの条件判定をするよりも手続きの適用の方が速いと仮定して)

型タグの値でcase文を使って分岐してるんなら、高速化の余地は少ないと思う。

424 :デフォルトの名無しさん:05/01/24 03:11:55
>>423
なるほど。すでに型は分かっているから多態は必要ないんですね。
C++ならファンクタでどうにかなるかもしれません。
Cなら、グローバルもしくはスタティック変数使えばできなくもないかもしれないけど、すごく難しそう。

425 :デフォルトの名無しさん:05/01/24 09:21:23
>>419
>あと Gaucheは ifだけでなく consみたいな基本手続きも埋めこんでる様なんですが、これは時に仕様に反しないでしょうか?
>(define (cons a b) (cons a b))
>(cons 0 0)
>は無限ループになるべきだと思うんですけど
これは具体的にはトップレベルの定義をinternal definitionとみなしてletrecで束縛する処理系ならば無限ループになる。
本来ならそうあるべきなのであろうが、そうならないGaucheが仕様に反しているかは微妙だ。なぜならインタラクティブなトップレベルの規定が不明確だからで....
例えばGaucheでも
(let ()
 (define (cons a b) (cons a b))
 (cons 0 0))
とやれば当然無限ループとなる。
それじゃトップレベルもそれに合わせれば良さそうだが....
(define hoge 8)
(list hoge)
(define foo +)
(foo 8)
を単純に
(let ()
 (define hoge 8)
 (list hoge)
 (define foo +)
 (foo 8))
はできない。シンタックスエラーだからだ。
どうするR6RS???(笑

426 :デフォルトの名無しさん:05/01/24 10:19:26
>>425
トップレベルの規定が不明確というのは
(define a 1)
(define (b) a)
(set! a 10)
(b)
として1が返ってきてもいいということでしょうか?

427 :デフォルトの名無しさん:05/01/24 10:25:32
>>422
>ところで()の評価は仕様で決まってないんでしょうか?
>仕様を見る限り()は式では無いように思えるんですが、実際には()を返す処理系がたくさんあります。
()は#tや#fみたいに評価すると自分自身になるオブジェクト。括弧がついてるけどリストではない。

例えば (eq? () '()) --> #tだ

ところで、#nilとかにしないで()を使うことになってるのには何か理由があるんだろうけど...だれか知ってる?


428 :デフォルトの名無しさん:05/01/24 10:38:36
>>427
R5RS 的には quote が必要
4.1.3 Procedure calls
Note: In many dialects of Lisp, the empty combination, (), is a
legitimate expression. In Scheme, combinations must have at least one
subexpression, so () is not a syntactically valid expression.

429 :デフォルトの名無しさん:05/01/24 10:51:06
not valid ではあるけど、invalid とされているわけでもなく
扱いも明記されていないので、結局処理系依存?


430 :デフォルトの名無しさん:05/01/24 11:42:33
>>427
ちょっと長くなるけど....
R5RSの5.2.2 Internal definitionsより
"Such definitions are known as internal definitions as opposed to the top level definitions described above. The variable defined by an internal definition is local to the <body>. That is, <variable> is bound rather than assigned ..."
とあるので、裏を返せばtop level definitionはassignmentsつまりset!と同じ動作だと推察できる。
これによれば、
(define a 1) (define (b) a) (set! a 10) (b)

(set! a 1) (set! b (lambda () a)) (set! a 10) (b)
となると考えられ、結果は10になるべきだと思う。
"本来ならそうあるべきなのであろうが"と書いたのはこれを根拠としてみた。
"不明確"と書いたのは、これだけでは次の動作の説明ができないと思ったからだ。
(define (hoge x) (if x "foo" "bar")) (hoge #t) (define if list) (hoge #t)
を先のように書き直すと、
(set! hoge (lambda (x) (if x "foo" "bar"))) (hoge #t) (set! if list) (hoge #t)
でも2つのhogeが返すのは両方とも"foo"でないといけない!

じゃあ本当のところはどうすればいいのか?
でも5.2.1 Top level definitionsにはほとんど何も書いてないし.....
いずれにしても1を返すのはまずいとは思う。


431 :デフォルトの名無しさん:05/01/24 11:44:06
>>428
そのまんま書いてありましたね、すいません。近くまでは見てたんですが。
R5RSで invalidなものを validとして扱えてもR5RS互換といえるから大丈夫なんでしょうね。
これを validにするメリットがあるなら知りたいですが。

>>419の一段落目と >>420についてはどうでしょうか?

432 :427:05/01/24 11:50:28
>>428
ほんとだ、しかも(list? '()) -> #t だし。
マリアナ海溝より深く反省します m(_ _)m

433 :デフォルトの名無しさん:05/01/24 11:58:24
>>430
>(set! hoge (lambda (x) (if x "foo" "bar"))) (hoge #t) (set! if list) (hoge #t)
>でも2つのhogeが返すのは両方とも"foo"でないといけない!
いけないっていうのは良く分かりませんが、とりあえず ifは構文なので無理矢理納得するとしても
cons でも埋めこまれてるから納得できなかったんです。
(define (hoge x y) (cons x y)) (hoge 3 4) (define cons list) (hoge 3 4)
の結果は処理系によってまちまちです。


434 :デフォルトの名無しさん:05/01/24 13:38:56
>>433
ちょっと説明を整理してみた。
>(set! hoge (lambda (x) (if x "foo" "bar"))) (hoge #t) (set! if list) (hoge #t)
>いけないっていうのは良く分かりませんが
最初に、トップレベルでは(set! if list)はできない。
これはトップレベルのifが変数でないことを意味する。
次に、(define if list) (if 1 2 3) -> (1 2 3)
これは新しい変数ifを作りlistを束縛して呼び出し、結果の(1 2 3)を得ている。
では(define if list)の前に使われたifをどうするか?
そこではifは変数ではないので値を書き換える事はできない。
これが
(define (hoge x) (if x "foo" "bar")) (hoge #t) (define if list) (hoge #t)
でhogeが両方"foo"を返さなければならない理由。

>(define (hoge x y) (cons x y)) (hoge 3 4) (define cons list) (hoge 3 4)
>の結果は処理系によってまちまちです。
これは主なトップレベルの実装方法に2種類あるためで、明確な規定が無い為どっちが正しいとも間違いとも決められない現状ではしかたのないことではなかろうか。
ちなみに最初の方法は、
*すべてのシンボルが<undefined>という特別な状態に束縛されているとする。
*defineをset!として解釈する。
これは5.2.1 Top level definitionsに"Some implementations ..."と書いてある方法だ。
これによれば、次の様に解釈する
(set! hoge (lambda (x y) (cons x y))) (hoge 3 4) (set! cons list) (hoge 3 4)
結果は (3 . 4)と(3 4)
もう一つの方法は、トップレベルの式をbeginのシーケンスの様に解釈する。つまり
(begin (define (hoge x y) (cons x y)) (begin (hoge 3 4) (begin (define cons list) (begin (hoge 3 4)))))
みたいに扱う。
(注:実際のトップレベルでは(begin ...)の最初の式を評価した結果をディスプレイなりに出力する特別なbeginにする)
結果は(3 4)と(3 4)となる。

どっちにするかは好みだが、5.2.2との絡みから個人的には最初の方法に一票入れたい。

435 :デフォルトの名無しさん:05/01/24 14:03:17
>>434
(3 4)と(3 4)を返す処理系ってあるんでしょうか?
guile gosh scm scheme48 csi(checkin) biglooでは guileと goshが (3 . 4) (3 . 4)を返します。他は(3 . 4) (3 4)です。
(define kons cons) (define (hoge x y) (kons x y)) (hoge 3 4) (define kons list) (hoge 3 4)
にすると goshだけになります。
トップレベルの実装方法の違いというより最適化の問題の気がします。
goshは上の例でも(3 . 4)を返しますし、(set! cons 1)とできるからです(ifでもできます)。
ちなみに上の中で(set! cons 1)ができないのは scheme48だけです。

436 :434:05/01/24 14:17:23
ごめんなさい。最初のやつの結果が(3 . 4)(3 . 4)次のやつの結果が(3 . 4)(3 4)でした(滝汗
ちなみに
(begin (define (hoge x y) (cons x y)) (begin (hoge 3 4) (begin (define cons list) (begin (hoge 3 4)))))
をそのまま評価すると(3 4) (3 4)となるけど、これは処理系がdefineをletrecに変換してしまうからで。
それで勘違いしてたです。中身をflattenしないbeginと思って読んでくださいませ。


437 :434:05/01/24 14:35:20
>>435
> (define kons cons) (define (hoge x y) (kons x y)) (hoge 3 4) (define kons list) (hoge 3 4) にすると goshだけになります。
ふむ。 たしかにその振る舞いは最適化に問題がありそうですね。

>goshは上の例でも(3 . 4)を返しますし、(set! cons 1)とできるからです(ifでもできます)。
goshで(set! if ...)ができてしまうとは.....意外だ。

438 :434:05/01/24 14:43:56
>>434
ああ、また間違えてる。最初が(3 . 4) (3 4)、次が(3 . 4)(3 . 4)。まったく俺って情けない(涙

439 :デフォルトの名無しさん:05/01/25 01:11:30
構文やマクロキーワードは処理系開発側からするといじらんでほしい。
最低でも警告出すか、エラーにしてしまってもいいとさえ思える。

440 :デフォルトの名無しさん:05/01/25 10:59:19
ちょっと思ったんですが、型タグを使うよりも直接関数ポインタをメンバに持てばswitchを省けますよね。
オブジェクトのサイズが大きくなるから現実的ではないかもしれませんが。
構文解析後のオブジェクトはSICP風にやるなら環境を引数にとるメソッド一つがあれば十分なので、
それを関数ポインタメンバとして持つ、という感じでいいんでしょうか。

441 :デフォルトの名無しさん:05/01/25 17:41:55
Gaucheでsyntax-caseは使えるのでしょうか?
slibを使おうとしたらslib:eval-loadが未定義だったので
まずslib.scmを修正してコメントアウトされていたslib:eval-loadを有効にし、
(use slib)
(require 'syntax-case)
しました。
しかしdefine-syntaxでsyntax-caseを使おうとすると
*** ERROR: define-syntax needs a syntax-rules form, but got (lambda(x)(syntax-case (以下略
というエラーが出て、どうもsyntax-rulesしか使えないような気がします。

UNIXでsyntax-caseを問題なく使える処理系があれば教えてください。
目的はsyntax-caseの練習です。


442 :デフォルトの名無しさん:05/01/25 18:03:49
お騒がせしてしまってすみませんが、標準手続きへの割り当ての問題は R5RSの Chapter6の最初
に思いっきり書いてありました。ただ >>435の例のも OKなのかは良く分かりませんが。

>A program may use a top-level definition to bind any variable. It may subsequently alter
>any such binding by an assignment (see 4.1.6). These operations do not modify the behavior
>of Scheme's built-in procedures. Altering any top-level binding that has not been introduced
>by a definition has an unspecified effect on the behavior of the built-in procedures.

>>441
良く知らないけど Chikenというので使えるらしいです。

443 :デフォルトの名無しさん:05/01/25 18:53:48
>>441
slibのマクロ実装って、repl(もしくはload)を乗っ取らないといけない
んじゃなかったっけ。もし対話的に実行してるなら、goshのプロンプト直接
じゃなく、slibのreplを起動する必要があるはず。
そうしてるのにエラーが出たなら、gaucheのslibサポートが不完全なんだろう。



444 :デフォルトの名無しさん:05/01/25 19:32:51
>>441
>目的はsyntax-caseの練習です
それなら ttp://www.scheme.com/csv6.9c/ のpetite chez schemeがお勧めだ。(バイナリーで動くシステムが限られてるけど....)
なんといってもsyntax-caseの家元だからね!

445 :デフォルトの名無しさん:05/01/26 18:58:02
>>444
それは確かに道理なので、Petite Chez Schemeを入れてみました。
おお、syntax-caseが使える! 日本語使えないけど(Windows版)
しばらく遊んでみます。
うーん、これがどの処理系でも使えるようになればいいんだけど、
R6RSでは使えるようにしてくれたりはしないのかしら。

ところでsyntax-caseってidentifierとかのコンテクスト周りが
ややこしそうなんですよね。皆さん使いこなせるんでしょうか。



446 :デフォルトの名無しさん:05/01/26 23:40:47
syntax-caseで使うfree-identifier=?とかbound-identifier=?とかがいまひとつ
よくわからないような、ちょっとわかったような。

(syntax-object->datum obj)
"datum"を返すらしいが、ようするにシンボルとかquoteされたS式
(テンプレートに入ってる式の字面)が入っていると考えればいいんだろうか。

(free-identifier=? obj1 obj2)
変数として束縛されていない場合のみマッチさせたい場合は
free-identifier=?を使うということでいいのかしら。

(bound-identifier=? obj1 obj2)
bound-identifier=? ってのは同じ束縛を参照してるってことなんかなあ。
これが一番よくわからない。


447 :デフォルトの名無しさん:05/01/29 02:19:45
R6RSの検討ってしてるのね。
http://www.schemers.org/Documents/Standards/Charter/2004-10-13.pdf

448 :デフォルトの名無しさん:05/01/30 01:59:20
>>447
前スレで既出。

449 :万物流転:05/02/03 09:20:18
Gaucheで
(ref (sys-localtime (sys-time)) 'mon) => 1
になるのは私だけでしょうか?


450 :デフォルトの名無しさん:05/02/03 09:45:40
>>449
自分もなりますけど、何か問題あるっけ?

一応言っておくと、
monをrefして返る数字は0-11、つまり1が2月ですよ。
以下を参照。
http://www.shiro.dreamhost.com/scheme/gauche/man/gauche-refj_131.html

451 :万物流転:05/02/03 10:45:41
≫450
マニュアルをきちんと読まない私が馬鹿でした。
お騒がせしました。

452 :デフォルトの名無しさん:05/02/03 11:20:10
ありゃ、いつの間にやら、こんなスレッドが。

【SICP】計算機プログラムの構造と解釈【Scheme】
http://pc5.2ch.net/test/read.cgi/tech/1107345738/

ついでに、下のスレッドも紹介しておきます。
【一日】CommonLisp【一門】
http://pc5.2ch.net/test/read.cgi/tech/1106587515/

453 :デフォルトの名無しさん:05/02/03 11:45:20
>>451
よい経験をなさいましたな。
小生、テスターに届いたときには既に時限爆弾で期限切れとなっていたというベータ版を知っております。仕様の勘違いから1ヶ月計算がずれたわけですな。
今では懐かしい想いで..... はあと。

454 :デフォルトの名無しさん:05/02/03 20:13:45
schemeで末尾再帰でない再帰関数を書くことがあると思うんですが、
Cのスタックをそのまま使って evalと applyの相互再帰で実装すると
わりと簡単にスタックオーバーフローで segmantation faultになって
しまいませんか?
やっぱスタック(もしくはCPS?)から自作しないといけないんですかねえ。

455 :デフォルトの名無しさん:05/02/03 21:25:06
減らしたほうがいいのは確かだが、
規格上は末尾再帰でなかったらスタックをバカ食いしてもOKだと思う。

456 :デフォルトの名無しさん:05/02/03 22:02:04
>>455
メモリ使用量の話ではなく、スタックオーバーフローの話です。
ヒープに自作スタックを置けばメモリの許す限り使えるし、
連続した領域じゃなくてもいいかもしれないから、良いことが多いん
じゃないかと。継続も実装しやすいでしょうし。
デメリットとしてスタック積むのが遅くなったりするのかも知れませんが
どの程度か良くわからないです。

schemeでたかが5000回程度の再帰で溢れてしまうので問題かなあと思ったんですが
guileはもっと浅くても溢れてしまうので OKなんでしょうか。
SECDR(これは当たり前?)や minischemeでさえ溢れないのに。

457 :デフォルトの名無しさん:05/02/03 22:11:39
じゃあそうすればいいじゃん

458 :デフォルトの名無しさん:05/02/03 22:56:15
どういう目的で使うかによるが、個人的にはスタック溢れで
落ちる処理系はとても使いにくい。テストデータで通って、
いざ本番を流してみたら入力データの特異点 (たまたまひとつだけ
再帰が非常に深くなるようなもの) で落ちてくれると、髪を
かきむしりたくなる。

459 :デフォルトの名無しさん:05/02/04 00:42:36
Schemeはcontinuationがあるからマシンスタックをそのまま使って実装することは
あまりないと思うんだけどそうでもないのかな?


460 :デフォルトの名無しさん:05/02/04 01:04:14
>>459
そうなのかもしれませんね。継続のことを考えないで作り始めたので、
途中で困ったんですが guileのソース見て真似して作りました。
マシンスタックをそのまま使っているので激しく環境依存だと思われます。
マシンスタックそのまま使う方法だと自動的に、作るときと実行するとき
両方でスタックをコピーすることになるので、とても効率が悪いと思います。
他の方法に比べると実装がとても楽なのが良い点だと思います。

まあいろんな意味でスタックもしくは継続を自作した方がいいってことですかね。
マシンスタック使う方が速いってことはあるんでしょうか?
SCMはマシンスタック使ってるのに、スタックが溢れない気がするので
そこらへん調べてみます。

461 :デフォルトの名無しさん:05/02/04 18:06:31
SCMはマシンスタックだねえ。そのかわり環境は全部ヒープに作る。でも環境キャッシュがあるので早いけど。
ただしcall/ccと継続の起動は遅い。マシンスタックを全部セーブするから。
スタックオーバーフロウで止まらないのは、スタックを継続としてヒープにセーブしてスペースを空けてるから。
call/ccと継続の起動が無ければやっぱマシンスタックの方が早いね。
ところで最近「lambda の門」が賑わってるね、ラムダ饅頭でも作って仲見世で売ってみるかな(笑

462 :デフォルトの名無しさん:05/02/04 23:00:07
>>461
>SCMはマシンスタックだねえ。そのかわり環境は全部ヒープに作る。でも環境キャッシュがあるので早いけど。
素朴な疑問なんですがヒープよりスタックの方がアクセスが速いんでしょうか?

>スタックオーバーフロウで止まらないのは、スタックを継続としてヒープにセーブしてスペースを空けてるから。
なるほど継続として扱ってスタックを退避させてるんですね。Gaucheと一緒ですね。

>call/ccと継続の起動が無ければやっぱマシンスタックの方が早いね。
やっぱりそうですか。マシンスタック使うのは Cでないと無理だし環境依存だし美しくないので
どうにかしたいものですが。

ベクタってなんで評価できないんでしょうか? 単なるデータだから自分自身を返してもいい気がするんですけど。
評価できないオブジェクトって束縛されてないシンボル、不正なリスト、ベクタの3種類だけですよね。

463 :デフォルトの名無しさん:05/02/04 23:23:27
>>462
> ベクタってなんで評価できないんでしょうか?

SCM:
> #(1 2 3)
#(1 2 3)

ってことじゃなくて?



464 :デフォルトの名無しさん:05/02/04 23:27:42
(eval (lambda (x) x))

465 :デフォルトの名無しさん:05/02/05 00:43:37
>>463
クォート付けないといけないって仕様に書いてあるんで。

実行前の構文解析をして実行時の条件分岐や仮想関数呼び出しを無くしたんですが
逆に遅くなりました。型タグでの分岐や仮想関数呼び出しは大したネックにはならない
んですかね。速くする方法が分からないんですが、VM化すれば3,4倍くらい速くなるんでしょうか?

466 :デフォルトの名無しさん:05/02/05 00:59:49
最低限、数字と文字列は自己評価してくれってことでしょ。

467 :デフォルトの名無しさん:05/02/05 01:13:31
>>465
どういう風にしたんですか?
実行時の条件分岐や仮想関数呼び出しよりも高速な形式にしなきゃ速くならないでしょう。

468 :デフォルトの名無しさん:05/02/05 01:32:07
>>467
構文解析済みオブジェクトに関数ポインタメンバを持たせて evalする時は
それを呼びだすという感じです。

struct analyzed_obj {
func_ptr ev;
scheme_obj value;
scheme_obj car;
scheme_obj cdr;
};

scheme_obj const_obj(analyzed_obj obj, enviroment e){
return obj.value;
}

struct analyzed_obj *analyze(scheme_obj obj){
if(numberp(obj) || boolp(obj) || charp(obj) || stringp(obj)){
struct analyzed_obj *a = new_analyzed_obj();
a->ev = &const_obj;
a->value = obj;
}
...
}

scheme_obj eval(analyzed_obj obj, enviroment e){
return obj->ev(obj, e);
}

469 :デフォルトの名無しさん:05/02/05 01:48:05
よく分からないけど、 evには構造体をポインタで渡してるの?

470 :デフォルトの名無しさん:05/02/05 01:55:37
上のコードいろいろ間違ってました。 carとか cdr の型は analyzed_objで
analyzeの中もヒープに確保したりとかは擬似コード的には余計でした。
evalの中も->じゃなくて.ですね。

>>469
実際には全てのオブジェクトをヒープに確保してて、全部ポインタ渡しです。
副作用起こせないだろ、とかそういうことですか?

471 :デフォルトの名無しさん:05/02/05 01:59:38
アーキテクチャにもよるけど、関数ポインタのcallって重いよ

472 :デフォルトの名無しさん:05/02/05 02:03:48
いや、コピーして渡してたら、そこが足を引っ張ってるのかなと思ったので。
これだったら仮想関数呼び出しと大差ないと思うんだけど、何で遅くなるんだろうね。

473 :デフォルトの名無しさん:05/02/05 02:08:25
>>471
そうですか。仮想関数呼び出しが無くなる変わりに関数呼び出しが一つ増えてるんですよね。
型タグで分岐せずに直接関数ポインタを使うっていうのもなんか不毛な感じがしますし。

こまごまとしたエラーチェックを実行時にしなくていいっていうのはありますが、
>>423 が言うような高速化は気にしなくてもいいんですかね?
まあ、423も高速化の余地は少ないと言ってますし。


474 :デフォルトの名無しさん:05/02/05 15:03:01
>>462
> 素朴な疑問なんですがヒープよりスタックの方がアクセスが速いんでしょうか?
アクセス速度の方はほとんど変わらない。局所性が上がる分だけ微妙に良い程度だと思う。
環境をスタック上に作るのはヒープの消費を押さえるためで、一般的にはこれが速度に貢献することを期待している。
ただしクロージャーを作るときにはヒープへのコピーが発生するわけで、コンパイラの性能やプログラムによっては逆効果になることもある。
そのへんは確かorbitの論文に詳しかったように思う。

>>473
>471が既に言ってるけど、関数ポインターの使用は最近のCPUでは遅い。理由は
1. 飛び先の分岐予測が外れやすい(ぼぼ100%外すやつもあり)のでハザードが多い。
2. 飛び先の分岐予測が外れるのを嫌ってコードのアッチコッチから飛ばしていると、今度はリターンの予測が外れて(ぼぼ100%外すやつもあり)ハザードになる。
んじゃどうするか?そこでFORTHですよ!騙されたと思ってthreaded codeでググってみよ!
FORTHマニアは友達にはなれそうも無いけど、やつらはVMには気合いが入っている。勉強になることが多い。
あ、FORTHでSCHEME書くのを勧めてるわけじゃないからね(笑

475 :デフォルトの名無しさん:05/02/05 17:06:09
>>462
> 素朴な疑問なんですがヒープよりスタックの方がアクセスが速いんでしょうか?
ハード依存。
スタック領域とヒープ領域が別々のメモリになっていたら、多くの場合スタックの
方が早くなるように作られている。
でも大抵のPCは同じメモリ上にスタックもヒープもあるからアクセス速度はほとんど
同じだと考えて問題ないと思う。
ハードが特殊な場合は気を付けて。

476 :デフォルトの名無しさん:05/02/05 17:31:36
>>474
なるほど。ラベルをデータとして扱えたらなーと思ってたんですが、GCCならできるらしいですね。
これは threaded codeと関係あるのかなあ。まだ threaded codeのことは全然分かんないですが、
Scheme関連でいうと QSchemeというのが使ってるらしいですね。

VMのことは全然分からないヘタレなのでとりあえずドラゴンブック読みます。
あと >>395 のコードをいろいろ改良しました。いろんな構文や型を足して、
set!や継続を実装しました。すぐに スタックオーバーフローになるのと
継続が環境依存かつ遅いのが弱点で、SECDR-Schemeと同じ程度の速さです。

477 :デフォルトの名無しさん:05/02/08 11:56:14
PC-98で使えるメモリ制限なし(EMSを使用してくれる)のschemeないですか


478 :デフォルトの名無しさん:05/02/08 12:34:50
一万数千円くらいする処理系があったような

479 :デフォルトの名無しさん:05/02/08 14:04:56
フリーではないですかね

480 :デフォルトの名無しさん:05/02/08 15:06:20
niftyとか行けばいくらでもありそうだが

481 :デフォルトの名無しさん:05/02/08 15:31:57
EMSなんて使うのあるかね?
djgcc+DOSエクステンダなものならありそうとも思うが。



482 :デフォルトの名無しさん:05/02/08 15:52:35
将来的に見てもパソコンに搭載されるメモリは
640キロバイトもあれば十分ですよ

              by ビル・ゲイツ

483 :教えて君:05/02/14 13:12:58
GaucheのMD5は

(use rfc.md5)
(open-input-file "Q:/000 SF/backup/(readme)/readme.txt")
(md5-digest)

で良いでしょうか?

(md5-digest-string "test")は応答がありますが
(md5-digest)は応答がありません。

484 :デフォルトの名無しさん:05/02/14 13:30:57
マニュアル読め。

といいつつ、ワシも読んでないが、多分

(use rfc.md5)
(with-input-from-file "Q:/000 SF/backup/(readme)/readme.txt" md5-digest)

Gauche だと foo-string があるとき、foo は (current-input-port) から読んで
(current-output-port) に書き出すプロシージャになってることが多い。


485 :483:05/02/14 21:55:25
>484
ありがとうございました

486 :デフォルトの名無しさん:05/02/16 17:30:55
入門SchemeってHTML版ないの?
PDF死ぬほど読みにくい・・・
リンクもないしさー

487 :デフォルトの名無しさん:05/02/16 23:16:12
>486
書き方が変だから読みにくいんだよ。用語も少しおかしいし、眠くなるし。
プログラミング言語Schemeの方がいいよ。原書はただで読めるし。
そういえば何時の間にか3rd editionになってますね。

488 :デフォルトの名無しさん:05/02/16 23:35:57
Schemeなんて最初はとりあえず普通のLISP(CommonLisp系)と、
その違いを知っておけばいいぐらいじゃない?
ネットに転がってるSICPやら入門サイトでも流し読みすればいい。
結局R5RSとかの規格書しか読まなくなる。
あと理解を深めるには処理系依存度が高い言語だから、
どれか1つの処理系に詳しくなるか、自作でもした方がいいね。

489 :デフォルトの名無しさん:05/02/17 00:01:38
普通のLispを知らなかったらどうするんだ

490 :デフォルトの名無しさん:05/02/17 00:17:24
開発の滞っていない、フリーなCommonLisp処理系ってどんなのがありますか?

491 :デフォルトの名無しさん:05/02/17 00:17:56
CLispでいいやん

492 :デフォルトの名無しさん:05/02/17 12:27:58
CMUCL
disassembleして眺めるのが好き。


493 :デフォルトの名無しさん:05/02/17 23:38:23
Lisp入門はホフスタッターのが面白い

494 :デフォルトの名無しさん:05/02/18 00:09:27
>>493
なんて本?

495 :デフォルトの名無しさん:05/02/18 00:15:26
あれを入門としていいのか

496 :デフォルトの名無しさん:05/02/18 00:57:52
たしかに漏れがLISPを初めて知ったのは「メタマジック・ゲーム」だったが

497 :デフォルトの名無しさん:05/02/18 10:37:18
schemeの継続が理解できません
クロージャないのトップレベルで(call-with-current-continuation (c) c)して継続を
得た場合この継続は何を指してるんですか?


498 :デフォルトの名無しさん:05/02/18 11:29:06
その式から戻るという継続

499 :デフォルトの名無しさん:05/02/18 11:41:50
ということはこの継続を例えば(define cc (call-...)しといて後で(cc 0)とすると
この次の関数に処理の流れが戻るということですか


500 :デフォルトの名無しさん:05/02/18 14:01:26
それは誰にもわからない。
誰にもわからないなんて凄すぎる。
いや、実はトップレベル継続の呼び出しは処理系依存。
トップレベルにも戻るというだけは保障されてるが、
次が何なのかは決まってない。

501 :デフォルトの名無しさん:05/02/18 17:34:22
なるほどありがとうございます
このスレのひとはなんかかっこいい


502 :デフォルトの名無しさん:05/02/18 18:25:08
>>493
むしろあれはLISP信者への入信本かな
あの本には不思議な魅力があるよね

503 :デフォルトの名無しさん:05/02/18 20:28:08
>(define cont #f)
>(list 1 2 3 (call/cc (lambda (c) (set! cont c) 'foo)) 4 5 6)
1 2 3 foo 4 5 6
>(cont 'hoge)
1 2 3 hoge 4 5 6
でなんとなく想像つくかな?

504 :デフォルトの名無しさん:05/02/18 20:31:59
> (define cc (call-with-current-continuation (lambda (c) c)))
> (cc 80)
> cc
80
これならどうだ?

505 :デフォルトの名無しさん:05/02/18 20:47:57
ついでに
> (define cont #f)
>((call-with-current-continuation (lambda (c) (set! cont c) cdr)) '(1 2))
(2)
> (cont car)
1
でもって、
>(call-with-current-continuation (lambda (c) (set! cont c) 'bye))
bye
>(cont 'hello)
hello
ということになる。

506 :デフォルトの名無しさん:05/02/18 20:50:31
わけわかんねえよ

507 :デフォルトの名無しさん:05/02/18 21:26:34
こういうのは初心者スレに隔離しようぜ

508 :デフォルトの名無しさん:05/02/19 01:01:20
あいにくSchemeの初心者スレはないのだ
別にどこでもいいじゃん

509 :デフォルトの名無しさん:05/02/19 01:07:46
>>494
http://www.amazon.co.jp/exec/obidos/ASIN/4826900430/qid%3D1108742823/249-7335580-3753166

510 :デフォルトの名無しさん:05/02/19 01:13:50
立てるべきは下らないメタ議論専用スレだ

511 :デフォルトの名無しさん:05/02/20 10:57:28
shiroさんが Scheme 本を書く予定とかってないのですか?

512 :デフォルトの名無しさん:05/02/20 14:00:52
Part7 の833辺りからがとても参考になるんですが、ちょっと分からないところ
があります。引数をスタック上に作ると (lambda (a) a) みたいに引数が返り値に
使われるときに困らないでしょうか。返り値がスタックにあるかチェックしてヒープ
にコピーしたりするんでしょうか。

頭の中がまとまってないので変なこと言ってたらすいません。

513 :デフォルトの名無しさん:05/02/20 14:26:57
スタックから返り値用のレジスタにコピーするだけでしょ。

514 :デフォルトの名無しさん:05/02/20 14:49:53
>>513
コピーはネックにならないんでしょうか?
GCいらない代わりにコピーが必要なのとコピーがいらない代わりにGCが必要なのは
どちらがいいか微妙じゃないですか?

515 :デフォルトの名無しさん:05/02/20 15:11:00
メリット、デメリットを考えてそうしてるんでしょ。

516 :デフォルトの名無しさん:05/02/20 15:17:44
そういうことですか。納得しますた。

517 :デフォルトの名無しさん:05/02/27 19:30:49
(2005/02/26 15:24:15 PST)
http://www.shiro.dreamhost.com/scheme/wiliki/wiliki2.cgi?Shiro
Lisp 脳ワラタ

参考:森昭雄教授,講演で「ゲームが原因で自閉症になる」発言
http://slashdot.jp/article.pl?sid=05/02/26/1219202&topic=42&mode=nested&threshold=-1

518 :デフォルトの名無しさん:05/02/27 19:50:35
>>517
Lisp 脳か。おれも気をつけようw

519 :デフォルトの名無しさん:05/02/27 20:19:06
(((((;゚Д゚)))ガクガクブルブル)

520 :デフォルトの名無しさん:05/03/01 00:18:43
(define (´∀`) 'マターリ)

521 :デフォルトの名無しさん:05/03/01 00:19:28
>>80

522 :デフォルトの名無しさん:05/03/02 14:59:36
xyzzy で ChezScheme を書いている人は,私のほかにいませんか?
私は今のところ,lisp-mode で書いて,Petite Chez Scheme のコンソールに
コピペしています.もっと良いやり方は無いものでしょうか?
Emacs の *scratch* バッファがうらやましい.


523 :デフォルトの名無しさん:05/03/02 15:27:25
xyzzyもwin上のchezも知らないんだけど、サブプロセスとして走らせられないの?


524 :522:05/03/02 16:51:00
>>523
それはできるのですが,いくつか問題があって,

・プログラムの戻り値は表示されるが,ユーザの入力値は消えてしまう.
・サブプロセスの起動は,非力なマシンだと重い.

などの理由があって,今のところ Petite Chez Scheme を単独で動かしています.


525 :522:05/03/03 11:42:01
やっぱり,スレ違いだったかな.xyzzy のスレに行ってみます.

526 :デフォルトの名無しさん:05/03/05 03:52:53
Schemeのマクロが全然判らないんですが
良さそうな情報源ないでしょうか

527 :デフォルトの名無しさん:05/03/05 12:44:02
google

528 :デフォルトの名無しさん:05/03/05 13:28:34
>>526
オンラインなら,犬飼大の『入門Scheme』
http://www4.ocn.ne.jp/~inukai/scheme_primer_j.html

英語でよいなら,Kent Davig "Programming Language Scheme"
http://scheme.com/tspl3/

書籍なら,その邦訳のケント・デイヴィグ『プログラミング言語Scheme』
http://www.amazon.co.jp/exec/obidos/ASIN/4894712261

しかしこれも FAQ だなあ.これに答えるの,もう3回目ぐらいだよ.


529 :デフォルトの名無しさん:05/03/05 13:39:46
>>528
> オンラインなら,犬飼大の『入門Scheme』
> http://www4.ocn.ne.jp/~inukai/scheme_primer_j.html

これは「良さそうな」情報源には入らないと思うなあ。


530 :デフォルトの名無しさん:05/03/05 14:03:03
>>529
批判があるのはよく分かるが,ほかに日本語で読める,R5RS のマクロの文献は
私はほかに知らない.あとはR5RS そのものになってしまう.
この本のマクロの部分は,R5RS そのものよりはまだ読みやすいよ.


531 :デフォルトの名無しさん:05/03/05 22:33:09
言語間のコストをどうみるかは人それぞれだけど、
英語でもTSPLの説明の方が簡潔かつわかりやすいと思うな。
どうせR5RS分だけならすごく短いし。
chezのsyntax-caseの説明もあって長いけどそっちは興味ないなら全く見なきゃいいし。

すげー短いから、ここだけ和訳を立ち読みしてもいいんじゃない。
サンプルとかはwebにある英語と変わらないんだから必要なら参照できるし。


532 :デフォルトの名無しさん:05/03/06 03:31:52
実例を伴う資料が少なすぎるんじゃボケェェェェ!
と太陽に吠えてみる

533 :デフォルトの名無しさん:05/03/06 03:33:26
Schemeのsyntax-ruleってそんなにわかりにくいか???
ほとんどlambdaと一緒だろ。

534 :デフォルトの名無しさん:05/03/06 03:56:38
分かる奴が分からない奴のことなんて分かるわけがないだろう

535 :デフォルトの名無しさん:05/03/07 12:15:20
成長すれば分かるようになる

536 :デフォルトの名無しさん:05/03/07 17:54:08
>>534
paradox

537 :デフォルトの名無しさん:05/03/07 22:44:15
中年男がテレビに出るらしい

538 :デフォルトの名無しさん:05/03/07 23:14:15
ライブドアの社長役か?

539 :デフォルトの名無しさん:05/03/12 21:28:13
『ハッカーと画家』のブックレビュー集がありました.
http://www.linux.or.jp/bookreview/BR85.html

驚くほど,評価が低い.誉めているのは最後の評者ぐらい.おまいらはこの本を,
どこまで理解してレビューしているのか,小一時間問い詰めたい.とにかく,
この本の内容の熱気が,評者らには全然伝わってない感じなんである.

と言うか,なんか考えさせられました.普通の人の反応って,こんなものです
よね.みんなが面白がるはずはない.それを改めて実感させられました.



540 :デフォルトの名無しさん:05/03/12 21:36:30
>>539
Lispを知らない人(つまりほとんどの人)にとっては「なんのこっちゃ」って部分があるのは
確かだろうね。前半は割と万人に勧められると思うけど。
でも、こういう本をきかっけに Lisp に興味を持ってくれる人も多いのではないかと個人的
には期待してるよ。
そういう人たちの次のステップとなるためにも「Lispで作るWebアプリ」みたいな本が出ると
いいよね。

541 :デフォルトの名無しさん:05/03/12 21:53:28
萌えLispきぼんぬ。

542 :デフォルトの名無しさん:05/03/12 22:19:48
括弧たん(;´Д`)ハァハァ

543 :デフォルトの名無しさん:05/03/13 00:41:14
Lisp用超セクシーな括弧の書体きぼん。

544 :デフォルトの名無しさん:05/03/13 03:30:42
乳首がついてるとか?

545 :デフォルトの名無しさん:05/03/13 04:20:37
}

右向いた oppai

)

右向いた oppai (陥没乳首)

546 :デフォルトの名無しさん:05/03/13 04:23:02
すまん、くだらなかった

547 :デフォルトの名無しさん:05/03/13 04:39:55
(おっぱい! :cup 'f)
  _  ∩
 ( ゚∀゚)彡
    ⊂彡

548 :デフォルトの名無しさん:05/03/13 09:06:07
sexp

549 :デフォルトの名無しさん:05/03/13 10:42:00
>>540>「Lispで作るWebアプリ」みたいな本が出るといいよね。

このスレで議論して、本をだしてはどうだろう?
「電車男」に続いて。
煽りではない、マジレス

550 :デフォルトの名無しさん:05/03/13 11:24:15
>>539
「日本語がこ難しい」という評はちょっと理解できん。
おれは良い訳だと思うし、最後の人の評がぴったりくるな。
まぁマンセー評ばっかりだと逆に嫌だけどw

>>549
多分 CGI よりも(勿論サーブレットよりも)
圧倒的に動きが分かりやすいから、良いと思う。
関数が呼ばれて文字列を返す、それをマクロで囲むだけ。

さてどこから議論するかだな。
とりあえず portable aserv と clsql 位の導入から始める?

ただし、圧倒的に高度な事をしないと Lisper は満足しないだろうし、
そうすると素人にはチンプンカンプン、という難しさはあるw

551 :デフォルトの名無しさん:05/03/13 11:43:07
Webアプリで、Lispのパワーが生かせる場面があるか、じゃないかなあ
今はJavaにあわせてやれることを決めてるって感じだし

552 :デフォルトの名無しさん:05/03/13 11:46:54
>>550
確かにふつーのWebアプリ作るだけなら「PHPでいいじゃん」って言われそうだよね。
CMSっぽいのを1から作るとかやれば面白いかな。

553 :デフォルトの名無しさん:05/03/13 11:57:34
>>551>>552
本物の(汎用的って意味ね)プログラミング言語である Lisp じゃなきゃ
できない事ってのを見せつけなきゃな…
すぐには出ないけど皆で考えたらなんかあるんじゃない?
FireFox ががんばってWebブラウザを再定義しようとしているように。

554 :デフォルトの名無しさん:05/03/13 12:20:57
>>549
Lispを世に広めるためになら、敷居を低くすべきだろうな。
でないと、Lisperしか注目しないし、それでは意味がない。
面倒なんで、入門・初級・中級・上級とレベル別に議論すべきか?
そうすると、UNIX・Linux環境だけでなくWindowsも視野に入れねば
ならないか?
今のWebサービス系のPGやSEにアピールするためにはいきなり高度な
ことをせずに「とりあえず触ってみるか」と思ってもらえるように
しないといけない。となると、やっぱりWindowsなのかなぁ。。。

555 :デフォルトの名無しさん:05/03/13 12:41:42
敷居っても色々あるよな。
まずは最初の壁を下げるために、Lisp/SchemeスペシャルなKNOPPIX CDが要るな。
ブータブルなKNOPPIX CD入れたらいきなりLispが動かせて、
必要なライブラリも揃ってるような奴。
できたらログインシェルを emacs にしといてやれw


556 :555:05/03/13 12:44:27
追加。WindowManager は当然sawfishだ。

557 :デフォルトの名無しさん:05/03/13 14:17:08
>>555
そういうの存在するはず。なんか一通りLispの処理系のエディタが入ってるやつ。
名前なんだっけ。


558 :デフォルトの名無しさん:05/03/13 15:04:56
Lisp Resource Kitのことか?
最近チェックしてないけどACLのライセンス期限とかまだ平気なんかね。まぁ更新させて
くれるんなら問題ないんだけど。
ttp://common-lisp.net/project/lisp-res-kit/

559 :デフォルトの名無しさん:05/03/13 16:55:36
継続やらなんやらを駆使して、データベースとのやりとりやセッション管理を意識せずにWebプログラムが作れるようにするとLispっぽいかも。

560 :デフォルトの名無しさん:05/03/13 17:32:40
>>550
| 「日本語がこ難しい」という評はちょっと理解できん。

評価した人の日本語理解力が訳者の意図したレベルに到達してなかったものと思われる。
幼稚園児に小学生の教科書を読ませたみたいな感じかな。
ただ幼稚園児は批評することなくわからないと言うのに対し、ある程度年をくってくると
自分が理解できない文章は書いた奴が悪いと文句を言うようになる。よくあることさ。

561 :デフォルトの名無しさん:05/03/14 00:15:50
>>559 Kahuaとか?

562 :デフォルトの名無しさん:05/03/14 00:36:07
>>556
時々でいいですから GWM のことも思い出してやってください

563 :デフォルトの名無しさん:05/03/14 00:48:09
>>556
sawfishはクソな気がするんですが

564 :デフォルトの名無しさん:05/03/14 00:49:46
Squeakみたいなのが欲しい。
仮想VM環境入るとLISPづくしって感じの。


565 :デフォルトの名無しさん:05/03/14 00:54:15
んで、どっかの学校で子供達がそのLISP環境で遊んでる写真も欲しいね。
子供を使った宣伝だね。
括弧だいすき!とか適当なフォーラムでっちあげて、
いかにも低年齢からでもLISP使えますよ?って誤解^H^H理解を広める。



566 :デフォルトの名無しさん:05/03/14 01:11:33
いや、実際LISPさわるのは低年齢の方が良いと思うんだ。
Smalltalkと同じ様な理由で。

567 :デフォルトの名無しさん:05/03/14 06:21:26
やっぱ環境か・・・。
Lisperの標準的な環境ってなんだろうね?
やっぱemacsなんですかね?

個人的に、フランツがACLの日本語のドキュメントを
本にすりゃいいのに、と思う次第。
(あいつら日本でLisp広める気あんのか?)

568 :デフォルトの名無しさん:05/03/14 10:26:14
日本法人なんて入る奴は基本的に他人の褌で相撲をとることしか考えないやつだから
そんなの望むべくもなさそうな。


569 :デフォルトの名無しさん:05/03/14 10:36:19
>>559
Common Lisp なら Uncommon Web.
次のリリースでは CLSQL と連携もできるらしい。
問題は、多少手を入れないと日本語が通らないこと。


570 :デフォルトの名無しさん:05/03/14 12:40:09
>>565
LISP使いって聞くと、どうしても髭もじゃのキモオタ(=RMS)ってイメージが付きまとうから
そういった固定概念の除去という意味でも子供を使ったアピールってのは有効だと思う。
身寄りのない子供を預かってLISPの英才教育するネバーランドでも設営するとか。

571 :デフォルトの名無しさん:05/03/14 12:56:08
もしFranzの誰かにメールで、
「日本語ドキュメントとかないとACL導入しにくいな〜」
とか言ったら、ドキュ用意してくれるかな?





無理かw

572 :Scheme初心者:05/03/14 15:10:28
(define (disp-list-of-lists a)
(cond ((null? a))
(else
(display (car a))
(display "\n")
(disp-list-of-lists (cdr a)))))

((1 2 3)(2 3 4)(3 4 5))というようなリストの入れ子を
(1 2 3)
(2 3 4)
(3 4 5)
と表示したく、上のコードを書いたのです。このコードの添削お願い。
これみたいに帰結節が複数の式を含む場合、ifは使えないかな?

573 :デフォルトの名無しさん:05/03/14 15:22:52
beginね.

(define (disp-list-of-lists a)
(if (not (null? a))
(begin
(display (car a))
(newline)
(disp-list-of-lists (cdr a)))))


574 :デフォルトの名無しさん:05/03/14 16:00:04
Schemeの健全なマクロと伝統的なマクロではどう違うのか。
伝統的なマクロではどういうときに不都合が起こるのか教えてプリーズミー

575 :デフォルトの名無しさん:05/03/14 16:58:55
>>574
伝統的なマクロでも不都合は防ぐことはできる。
そういった対策を自動でやってくれるのが健全マクロ。
何が不都合なのかというと

(define-macro (hage test . body)
 `(let ((var ,(test))) (var ,@body) (var ,@body)))

こんなマクロを作った場合にvarという名前が既に環境に入ってたら意味が違ってくる。
これを以下の様に直すと不都合がなくなる。

(define-macro (hage test . body)
 (let ((var (gensym)))
  `(let ((,var ,(test))) (,var ,@body) (,var ,@body))))

こういう事を自動でやるのが健全なマクロ。
でも健全マクロは冗長で独自の構文を覚えなきゃならない意味で個人的に嫌い。


576 :デフォルトの名無しさん:05/03/14 17:11:08
>>575
ありがd!

577 :デフォルトの名無しさん:05/03/14 18:07:29
>>575
varだけじゃなく、hageが使われる文脈でletが束縛されていると
(普通は)困ったことになる。これはgensymじゃ防げない。
Schemeはそのへんに妙なこだわりがある。
CLは「letを束縛するような奴はいねえよ」で済ませるんだが。


578 :デフォルトの名無しさん:05/03/14 18:18:24
>>577
CLはパッケージがあるし、変数と関数の定義空間が違うから、基本的にはその手の
トラブルは起きにくいと言えるね。

579 :デフォルトの名無しさん:05/03/14 18:32:13
>>577
そうかあ。
まあそれってSchemeのキモイとこの1つだよね。
そういう心配してる割にパッケージとかの名前空間周りの改善が一向に見られないし。
Javaのパクリでもなんでもいいから適当なモデルを決めて欲しい。

580 :デフォルトの名無しさん:05/03/14 19:03:45
Schemeってそのまま人間が使うより、
その上に適当に使いやすい人間様用のレイヤを被せて使うべきなんだよ。
MIT Scheme+とか。


581 :デフォルトの名無しさん:05/03/14 19:27:56
>>580
詳しく!

582 :デフォルトの名無しさん:05/03/14 21:20:32
>572
(define (disp-list-of-lists a)
(for-each (lambda (x) (display x) (newline)) a))

583 :デフォルトの名無しさん:05/03/14 22:49:30
Schemeキモイか?
あれは妥協することなくDo the right thing.を徹底して貫く姿勢を維持してる
結果じゃないの? 適当なモデルとかで決めちゃうんじゃなくて全員が納得しない限り
規格には採用しない、っていうのは何でも取り込んで言語仕様がカオスになるよりは
いいと思うけど。処理系毎に色んな実験を試みるのも推奨してるみたいだし。

あと >>571
日本語ドキュメント用意した見返りに何ライセンス購入する? 向こうもビジネスなんだぜ。

584 :デフォルトの名無しさん:05/03/14 23:15:51
ACLって1ライセンスいくらよ?

585 :デフォルトの名無しさん:05/03/14 23:17:30
>>567
| 個人的に、フランツがACLの日本語のドキュメントを
| 本にすりゃいいのに、と思う次第。

詳細きぼんぬ。買うと日本語のドキュメントついて来るの? 内容いい感じ?

586 :デフォルトの名無しさん:05/03/15 00:02:34
ポールの本とは違うの?

587 :デフォルトの名無しさん:05/03/15 01:22:02
日本語ドキュメントって別に要らない気がするけど…
そもそもFranzって日本法人なんて無いんじゃなかった?

まぁもし日本語ドキュメントが必要なら、
日本語ドキュメントを簡単に整備するための Lisp ベースのシステムを作る、
ってのはどう?

588 :デフォルトの名無しさん:05/03/15 01:33:13
で、日本語ドキュメントを整備するためのシステムが出来た時点で満足すると。
なんか火事になったときの数学者と科学者とエンジニア(だっけ?)の小話みたいな…


589 :デフォルトの名無しさん:05/03/15 02:27:01
Gaucheを皆で盛り上げよう!

590 :デフォルトの名無しさん:05/03/15 05:52:55
まず隗より始めよ。


591 :デフォルトの名無しさん:05/03/15 07:09:53
Allegro Common Lispのマニュアルとか、aserverのマニュアルとか
の日本語版があればな〜。

592 :デフォルトの名無しさん:05/03/15 11:50:32
Gaucheなんだが、不完全文字列というものは必要?
文字の列の文字列とバイト列(u8vector)との区別だけで十分。
APIも、あるところではu8vector、別のところでは不完全文字列と
いうように統一感に欠けるような。

593 :デフォルトの名無しさん:05/03/15 13:40:09
http://www.franz.com/support/documentation/6.2/doc/aserve/aserve.html
http://www.franz.com/support/documentation/6.2/doc/aserve/tutorial.html
http://www.franz.com/support/tech_corner/webactions.html
http://www.franz.com/support/tech_corner/using-webactions.html

このあたりを日本語に訳していけばいいのだろうか?

594 :デフォルトの名無しさん:05/03/15 14:06:04
>>592
だいぶ昔にMLで話題になってたような気がする。不完全文字列は無くす方向とか。


595 :デフォルトの名無しさん:05/03/15 16:25:04
既出かと思うが始めて気づいた。

2ちゃんねるには、
http://hobby7.2ch.net/car/
http://pc5.2ch.net/cdr/
car板とcdr板がある!

596 :デフォルトの名無しさん:05/03/15 16:37:46
わろた

597 :デフォルトの名無しさん:05/03/15 21:38:36
素朴な疑問なんだが、日本語のドキュメントがあると何か状況が変わる?
そんなに日本語日本語いう理由を列挙してみて欲しい。
Franz Inc.の人もココ見てるから何か反応あるかもよ。

598 :デフォルトの名無しさん:05/03/15 21:57:42
Franz Incの人見てるの?
ふざけた値段設定やめて。

599 :デフォルトの名無しさん:05/03/15 22:24:20
>>598
ワロタ。
ほんじゃいくらだったら妥当な価格だと思うかとか議論する?
初心者スレでやった方がいいような気もするけど。

あとACLが商用Common Lisp処理系の頂点に君臨しているみたいな
暗黙の了解があるみたいだけど、LispWorksユーザとか、Scieneerユーザとかの
意見も聞きたい。取っ付き易い環境とか日本語がとか言うならゲイツOSの上で
Cormanを日本語化するとかどうよ。あれ200ドルくらいでソースコード付いてるよね?

600 :デフォルトの名無しさん:05/03/15 23:10:34
つか技術者で英語が苦手です、って正直どうかと思うぞ。
英語ドキュメントしかないからその技術には手をださない、なんて奴は
日本語ドキュメントがあっても手を出しゃしないよ。
価格の話もスレ違いだろ。
>>588
詳細キボン

601 :572:05/03/15 23:42:26
>>573
>>582
ありがとです。define,lambdaの直下のとき以外でも、beginで複数の式を連続して書けるのね。
for-eachってのもあるのね。


602 :デフォルトの名無しさん:05/03/16 00:06:05
>>599
某とかゲイシの所の開発環境くらいの値段だろうな。

603 :デフォルトの名無しさん:05/03/16 00:28:37
日本語でドキュメントと統合開発環境が揃って、2〜3万円とかいうパッケージを出せば
それなりに市場性はあるんじゃないかとは思うよ。裾野を広げるのも大事だと思うな。

604 :デフォルトの名無しさん:05/03/16 00:31:39
>>603
普通の開発環境買ったことないだろ?

605 :デフォルトの名無しさん:05/03/16 00:55:04
数十万円が妥当

606 :デフォルトの名無しさん:05/03/16 01:00:13
>>599
LispWorks、以前開発中のプログラムでベンチマークしたときは ACL の倍くらい
速かったよ。(どちらも無料版での計測だけど)
結構良い印象を持っている。(でも cmucl のほうがさらに速かったけど)

607 :デフォルトの名無しさん:05/03/16 01:01:44
ちなみに同じ計測でインタプリタ最速は CLISP だったと思う。

608 :デフォルトの名無しさん:05/03/16 01:04:20
無制限の配布ライセンス付きで20万くらい。

609 :デフォルトの名無しさん:05/03/16 01:19:00
いつ撤退するか教えてくれますか。

610 :デフォルトの名無しさん:05/03/16 01:37:22
小俣さんガンガレ

611 :デフォルトの名無しさん:05/03/16 06:37:27
>>600
一PGに限ればそのとおりだと思うよ。
でも導入のために上司説得したりする時に日本語ドキュメントないと
結構辛いんだわ。協力会社・派遣・外注にLisperの募集かけてすぐに
頭数揃うと思う?JAVAerでも揃わないのに。
だとするとLispの教育ってコストをかけなきゃいけない。
そのときに英語という余計なコストがかかる、と聞いて上司がいい顔
するわけないだろ?

趣味と仕事を一緒にするなってw

612 :デフォルトの名無しさん:05/03/16 06:59:33
頭数が必要ならJavaにしとけ。

言語を何とか教えたところで、経験ない連中と一緒だと、高階関数×、マクロ×
みたいな条件で書く羽目になるぞ。

613 :デフォルトの名無しさん:05/03/16 07:16:24
確かにLispは趣味的に惚れこんでる奴多そうだな。

だけどLispで何人も使うような仕事ってあるのか?
どうせ少人数でやるんだから、
英語なんかに抵抗なく、新しい言語を覚えるのにも抵抗のない、
優秀な奴集めようぜ。
頭数がいるような仕事はJava、ってのは禿しく同意。
Lispは逆。

614 :デフォルトの名無しさん:05/03/16 07:57:54
Lispが流行るということは、LispがJavaやVBのように使われるということであります。

615 :デフォルトの名無しさん:05/03/16 09:53:32
>611
じゃあRubyにしとけや(プゲラ

616 :デフォルトの名無しさん:05/03/16 13:52:01
おいおい、仕事にLisp使うってネタだろ???
Lispは素晴らしいとは思うが、使える奴が少なすぎる。

617 :デフォルトの名無しさん:05/03/16 17:45:37
ま、おのおの立場があるようで・・・。
とりあえず>>593を訳すよ。
できたら>>611にもあげるから。

>>611
Lisperとjava技術者だったらjava技術者の方が集めやすくない?
なんでLispなわけ?
初心者スレのほうで会社にACL導入しようとしていた人がいたけど、
同一人物?

618 :デフォルトの名無しさん:05/03/16 18:12:00
>>616
なことを書いてると Paul Graham に殺されるぞ。
ttp://www.shiro.dreamhost.com/scheme/trans/beating-the-averages-j.html

619 :デフォルトの名無しさん:05/03/16 18:40:42
>>618
それはレベルの高い海外で、その中でも偶然PGがレベル高かった
から成り立った事例だよ。

620 :デフォルトの名無しさん:05/03/16 19:03:54
所詮島国。
日本では仕事で使われる言語や処理系の定番というものがほぼ固定化してる。
それにテンプレートやOOに振り回されて他の概念にまで手が回らないんだろう。
総人口で考えても向こうは仕事する人数ぐらいは集まりそうだが、
日本ではLisperを見つける事自体が難しい。
Lispで仕事したかったら海外に飛んだ方が早い。

621 :デフォルトの名無しさん:05/03/16 19:14:49
(((())))系を天下のMITが教育に取り入れてるからってのもあるかもな。ないか。

622 :デフォルトの名無しさん:05/03/16 19:15:25
海外でもあんま変わんないよ。
Lispで仕事したかったら自分で事業を起こせ。組織に頼っちゃ駄目だ。

623 :デフォルトの名無しさん:05/03/16 19:44:15
618も、まあそういう話でつね。

yahooに買収されてから、lisp技術者がいないからって理由で
他の言語に書き換えられたらしいし。当然その頃にはPaul
Grahamの手は離れてたらしいけど。
どこの国も同じ。

624 :デフォルトの名無しさん:05/03/16 20:07:56
あうあうあー

625 :デフォルトの名無しさん:05/03/16 20:08:44
LISPはともかくMLはもうちょとメジャーになって欲しい。
OCamlで開発してー

626 :デフォルトの名無しさん:05/03/16 20:11:15
ぼた?

627 :デフォルトの名無しさん:05/03/16 20:49:49
>>623
がーん。lisp から書き直されたのか…。
その言語と、情報ソース分かれば知りたいっす。

628 :デフォルトの名無しさん:05/03/16 21:16:14
C++とperlで書き直されたらしい。
Paul Graham のメッセージ。
ttp://people.csail.mit.edu/people/gregs/ll1-discuss-archive-html/msg02367.html

まあ、まだS式は使ってるらしい。
Paulは、これやっぱり腹を立ててるんでしょうな。


629 :デフォルトの名無しさん:05/03/16 21:19:33
糞言語コンビですなあ。

630 :デフォルトの名無しさん:05/03/16 21:24:39
て、よくよく思い出すと、これ、618の原文かなにかで
読んだんだった。

http://www.paulgraham.com/avg.html
から
In January 2003, Yahoo released a new version of the editor written in
C++ and Perl. It's hard to say whether the program is no longer
written in Lisp, though, because to translate this program into C++
they literally had to write a Lisp interpreter: the source files of
all the page-generating templates are still, as far as I know, Lisp
code.
628でも↑でも、S式解釈してるからLispインタープリタを相変わらずもって
るんだって主張してるけど、そのS式の部分、どれくらいLisp的なんだろうなあ。
かなり宣言的というかデータに近いもののような気もしなくもない。

631 :デフォルトの名無しさん:05/03/16 23:22:30
雑談だとスレが伸びるなぁ。初心者スレとか質問スレとか分けた意味ないじゃん(w

632 :デフォルトの名無しさん:05/03/16 23:36:59
>>631
ここでこういう話は特に問題ないのでは?
何が気になんの?

633 :デフォルトの名無しさん:05/03/17 00:06:53
>>617
自ら動こうとしているおまいは立派だぜ。
おれは正直日本語じゃなくても良いけど、何かあったら手伝わせてくれ。
ただ翻訳はWikiとか使っても精度が上がらないから、
出来上がりを読んで何か言うくらいしかできないけど…
>>620, 622
おれはLispがしたいんじゃなくて、良い仕事をしたい。
そのための良い道具がLisp、と思う。

634 :デフォルトの名無しさん:05/03/17 00:07:31
別にlispに関係無い話というわけでもなし
他に話題があるなら積極的にふれば?

635 :デフォルトの名無しさん:05/03/17 00:31:39
Practical Common Lispってあるじゃん。あれくらい実用に重点を置いた
ドキュメントの日本語版を作る、ってのならある程度意義はあると思うんだけど。
Peter Seibelに勝手に訳して適当にウェブで晒していいか?って質問したら
Apressのしかるべき担当を見付けて連絡するからちっと待て、と言われてもう10日以上・・・

636 :デフォルトの名無しさん:05/03/17 01:09:29
ちょっと期待

637 :デフォルトの名無しさん:05/03/17 08:06:54
>>630

商品データフォーマットの宣言
商品データ自体に加え、
システムの各種設定が簡単なS式になってるのと、
あと、店舗ページ生成のためにLISPをベースにした
非常に簡単なスクリプト言語を用意しているんだけど、それが
内部的にはLISPというか簡単なS式になって格納されている。 (US Yahoo!の場合)

http://help.yahoo.com/help/us/store/edit/advanced/advanced-09.html
(このページ、説明としてはぜんぜん足りないんだけど雰囲気だけはわかる)



638 :デフォルトの名無しさん:05/03/17 15:16:19
>>633
訳精度はあんま期待しないでね。
というわけでAllegro Webactionsを10%程度翻訳中。

639 :デフォルトの名無しさん:05/03/17 23:13:38
>>638
がんがれ!

640 :通りすがり:05/03/18 02:02:05
ドキュメントうんぬんより、実績かなぁ。見せて欲しいの。
Lisp/Schemeだとこんなことができるんだぜ!!っていうの、ないの?
言語間の機能比較どうねんこうねんより、実際に無料で試せる処理系の上で動く
アプリケーションでLispで書かれているスゴイもの、って何?

(X)Emacs/xyzzyは便利に使わせていただいてますが、それだけじゃ説得力ない希ガス。

641 :デフォルトの名無しさん:05/03/18 03:06:30
(define (apply-multi-proc a p)
 (define (iter a p)
  (if (not (null? a))
    (begin
     ((car p) (car a))
     (iter (cdr a) (cdr p)))))
  (if (= (length a) (length p))
   (iter a p)
   (error "Error: apply-multi-proc")))

(define main
 (apply-multi-proc '(1 2 3) '(a b c)))
(define (a x) (display x))
(define (b x) (display (* x 2)))
(define (c x) (display (* x 3)))

このコードが動かないわけを教えてください。
(a 1)がInvalid Applicationと言われてしまいます。

642 :デフォルトの名無しさん:05/03/18 03:22:12
main の記述がおかしいから。

643 :デフォルトの名無しさん:05/03/18 03:26:05
どうおかしいのでしょうか?

644 :デフォルトの名無しさん:05/03/18 03:29:17
おまいの目は節穴か

645 :デフォルトの名無しさん:05/03/18 03:39:30
初心者ッス。あと、mainは、今ここに載せるために書いたので、
実際には別のprocedureから呼び出してます

646 :デフォルトの名無しさん:05/03/18 03:49:43
外の a と中の a とかぶってね?

647 :デフォルトの名無しさん:05/03/18 03:51:16
そうですね。それもエラーの原因になるかもしれないですが、
載せる前の元のプログラムはちゃんと違う名前でした。

648 :デフォルトの名無しさん:05/03/18 04:07:54
((car p) (car a))



( 'a 1 )

になるんじゃない?

649 :デフォルトの名無しさん:05/03/18 04:47:39
>>641
とりあえず main の '(a b c) -> (list a b c)。
必要なのは a,b,c ていうシンボルではなく a,b,c の値である関数だから、
a,b,c を評価した結果をリストにする必要があります。

ていうか、(map (lambda (x y) (y x)) '(1 2 3) (list a b c)) でいい気がします。

650 :デフォルトの名無しさん:05/03/18 12:11:55
>>641
引数と関数が同じ数だと保障されてるなら、
(define (apply-multi-proc a p) (for-each (lambda(x y) (x y)) p a))

エラー付け足すなら
(define (apply-multi-proc a p)
 (if (not (= (length a) (length p))) (error ...))
 (for-each (lambda(x y) (x y)) p a))


(define (a x) ...)
(define (b x) ...)
(define (c x) ...)
(apply-multi-proc '(1 2 3) (list a b c))

quoteをうまく使えてないだけだと思う。

651 :デフォルトの名無しさん:05/03/18 12:12:42
>>649
副作用を起こすのが目的みたいだからmapじゃなくてfor-eachかと。
まあ知らんけど。

652 :デフォルトの名無しさん:05/03/18 13:55:09
>>671
これじゃダメなのか?
http://jp.franz.com/base/seminar/2004-06-10/aserve.files/frame.htm

653 :デフォルトの名無しさん:05/03/18 18:57:45
MIT Schemeがいつのまにか MIT/GNU Schemeに化けとる……。



654 :デフォルトの名無しさん:05/03/18 20:36:56
>>653
知らんかった?
木村巌さんのサイト全然更新してくんない (´・ω・`)

URL変更あったヤツとかだいぶ前にメールしてあるんだけど...


655 :641:05/03/18 21:46:36
ありがとです。うまく動きました。いまいちquoteの意味は理解できませんが。

656 :デフォルトの名無しさん:05/03/18 22:48:19
> いまいちquoteの意味は理解できませんが。

それじゃだめだろ。

657 :デフォルトの名無しさん:05/03/18 22:54:05
Allegro CL 3.0.2 を手にいれたんだけど、
これって、最近の Allegro CL と比べて使える範囲内に入る?


658 :デフォルトの名無しさん:05/03/19 16:10:03
低レベルな例だけど、自作のアドベンチャーゲームツールにScheme処理系を組み込んでみました。
http://www.stormsoft.org/~pc/game/clicktest/index.html
XMLがメインのツールで、Schemeはごく一部にしか使ってない。
組み込んだ処理系は湯淺氏のJavaアプリケーション組み込み用のLispドライバ。

659 :デフォルトの名無しさん:05/03/20 05:03:52
まえにLisp処理系を組み込んだFTPクライアントとか見かけた覚えがあるが、知らないか?

660 :デフォルトの名無しさん:05/03/20 16:48:18
>>659
SIODっていうEXEも作れるScheme処理系のサンプルにftpクライアントがあるけど。
でもperlみたいにライブラリの整備がされてないから処理系固有になって
使いづらいと思う。

この辺ネットワークモジュールインターフェースみたいなの考えて
各処理系で使い回しできる様にならないかな。
FFIで繋ぐだけで各処理系からftp使えるようにするとか。
BSDsocketっていやらしい部分があるけど。

661 :デフォルトの名無しさん:05/03/20 17:17:16
昨年、ある脳生理学者が、Lispハッカーがハッキングに没頭している時の脳波を計測した。
すると「人間らしさ」を司る前頭前野において、α波が優位になりβ波が低下したという。

α波はリラックスしている時に見られる脳波と言われる。
「たくさんの開き括弧と閉じ括弧が、寄せては返す波のリズムのように作用し、脳に影響
 をあたえているのではないか」と研究を行ったエム博士は述べている。

エム博士はインタビューでさらに衝撃的な理論を明らかにした。
「この波形は痴呆症の患者のものとよく似ている」
というのだ。
「Lispは専門家の間ではとても危険な言語として知られています。
 JavaやC++といった正統的な言語では、プログラマはよく考えてから
 プログラムを書かないと、実行する以前にコンパイルエラーになってしまいます。
 しかし、Lispにはそのような規律が全くありません。
 でたらめなコードでも実行できてしまい、エラーが起きてもそこで適当に
 数値を書き換えて実行を続けることができてしまうのです。
 こんな言語を使っているプログラマはものを考えなくなり、
 適当に式を打ち込んで、動けば良いという習慣がついてしまいます。」

662 :デフォルトの名無しさん:05/03/20 17:18:05
エム博士は続けた。
「考えることを止めたルーズなLispプログラマは、やがてコンピュータに合わせて
プログラムを書くのではなく、あたかも自分がコンピュータを操っているかのような
全能感に囚われます。自分が一番であるというこの全能感のために、Lispプログラマ
は他の言語を使うプログラマを馬鹿にし始めるのです。」
博士はそのようなプログラマの脳は「Lisp脳」になっているのだと言う。
「この感覚は麻薬のようなものです。一度溺れてしまうと、
そこから抜け出すのは容易ではありません。」
Lisp脳の症状としては、「他の言語を馬鹿にする」の他にも、
「定められた勤務時間を無視する」、「見積りを出す前にプログラムを書き上げてしまう」、
「会議でじっと上司の話を聞いていることができない」、等があるという。

Lispの一種であるSchemeというプログラミング言語は、プログラミングの入門教育
で使われることがある。そのことにインタビュアーが触れると博士は激昂した。
「それは殺人教育です。アメリカでは軍事予算でLispの研究をやっている。
 日本でも最近はゆとり教育だの何だのと言って子供に好きなようにやらせている。
 もともと日本には、芸事はまず形から入るという文化があった。
 師匠の真似をして、一通り形ができるようになって、それから心がわかるのです。
 まずは紙の上で、誤りが一切無いプログラムを書けるようになるまで修行すべきです。
 私が学生の頃は皆そうやっていた。」


663 :デフォルトの名無しさん:05/03/20 17:23:23
また最近の研究では、Lispプログラマの能力と、高機能自閉症の一種であるアスペルガー症候群
との間に関連が見られるという。「Lispで自閉症になるんです」エム博士はこう断言する。
「コンピュータを自由自在に操れる全能感に溺れ、自分の殻の中に閉じこもるのです。」
 博士は一枚の紙を取り出した。「典型的なLispプログラムの見かけはこのようなものです。」

((((;゚Д゚)))

「ほら、冷汗をかいて震えている人間のように見えませんか。これはLispプログラマの対人恐怖
という潜在意識がプログラムコードの上に滲み出ているからなのです。」


664 :デフォルトの名無しさん:05/03/20 17:24:56
((((;゚Д゚)))
  ↑
LISP脳のおまいらw

665 :デフォルトの名無しさん:05/03/20 18:34:26
>>661-664
某サイトのコピペかよ。
あんま迷惑かけんなよ。

666 :デフォルトの名無しさん:05/03/20 19:01:09
外出 >>517

667 :デフォルトの名無しさん:05/03/20 20:14:44
訳文の公開許可をフランツに問い合わせたのに、
全然メールが来ない・・・
許可されたと思っていいのだろうか?

668 :デフォルトの名無しさん:05/03/20 20:28:46
いいわきゃないだろ

669 :デフォルトの名無しさん:05/03/20 20:31:40
だよな
しかし、このままでは徹夜の労が無駄になるな

670 :デフォルトの名無しさん:05/03/20 21:13:57
その労を別のものに使え。

671 :デフォルトの名無しさん:05/03/20 21:46:07
GaucheをWin2kのcygwinで使ってますが、
(use srfi-4)
で単一型ベクタのモジュールを使おうと思ったのですが、
failed to link "libgauche-uvector" dynamically: dlopen, Win32 error 193
ってエラーが出てきてうまくいきません。どうしたらいいのでしょうか?
Winの対応は完全ではないようですがそのせいでしょうか。
(use srfi-1)はできました。

672 :デフォルトの名無しさん:05/03/20 22:10:01
193 ってことは ERROR_BAD_EXE_FORMAT ?
ファイル壊れてるんじゃね?インストールし直してみたら

673 :デフォルトの名無しさん:05/03/20 22:44:57
どうもuvectorだけuseできないみたいっす。
とりあえず普通のvectorで書いて、ひまを見てインストール(コンパイル)
しなおしてみます。


674 :デフォルトの名無しさん:05/03/20 23:30:45
Gaucheでもうひとつ質問っす。
byteのlistから作ったvectorから、マルチバイト文字列に変換する方法を教えてください。
(list->string (map integer->char v)))
だと日本語は文字化けしちゃいました。


675 :デフォルトの名無しさん:05/03/20 23:40:15
あんま処理系固有の話はMLかなんかで聞いた方が早いかと。

676 :デフォルトの名無しさん:05/03/20 23:51:01
MLって書くと紛らわしい。

677 :デフォルトの名無しさん:05/03/21 03:23:17
MastersLeague

678 :デフォルトの名無しさん:2005/03/21(月) 07:34:29
推論してくださいよ


679 :デフォルトの名無しさん:2005/03/21(月) 07:38:14
MoeLisp

680 :デフォルトの名無しさん:2005/03/21(月) 08:18:29
>>674
「文字」と「バイト(オクテット)」は別物と思った方がいい。
低レベルでふたつを変換するにはu8vector->stringとかがあるけど、
srfi-4が使えないってことなら、output-string-portを作って
write-byteしてからget-output-stringしたらどう?


681 :デフォルトの名無しさん:2005/03/21(月) 18:57:05
>>659 Roxas ?

682 :デフォルトの名無しさん:2005/03/21(月) 20:46:48
syntaxについて教えてください。
R5RS英語版p.14にある例が理解できません。
whenがあるmacroとして定義されているとき、

(let ((if #t))
(when if (set! if 'now))
if) => now

となるのですが、評価の過程でどのような順に
「if」が置き換えられていくのでしょうか?
whenのマクロ定義の内部で使われている「if」が
置き換えられないことはわかります。


683 :デフォルトの名無しさん:2005/03/21(月) 20:53:29
682です。
もう少し具体的に言い換えますと、ソースコード中に現れる最後の3個のifが
なぜ#tに置き換えられてしまわないか、という質問です。


684 :デフォルトの名無しさん:2005/03/21(月) 20:56:35
683です。訂正します。

誤「最後の3個の」
正「最後の2個の」


685 :デフォルトの名無しさん:2005/03/21(月) 21:02:49
TSPL読め。


686 :デフォルトの名無しさん:2005/03/21(月) 21:35:26
>>685
ありがとうございます。
TSPL読んでもよくわからなかったので質問させてもらったのですが…
マクロ展開と引数の評価の順番が理解できていないのかもしれません。
先にマクロ展開、そのあと引数の評価、という順番で評価が進むと考えて
よいのでしょうか?
そのとき、展開後のコードに含まれるシンボルは、通常のスコープとは異なる
スコープをもつということなのでしょうか?混乱してます。


687 :デフォルトの名無しさん:2005/03/21(月) 22:08:32
>>680
ありがとです。うまくいきました。

688 :デフォルトの名無しさん:2005/03/22(火) 00:13:01
LISPを学ぶとCなどのプログラミングの勉強になるといいます。
確かに、LISPで学んだアルゴリズムやリストの使い方をCでアプリケーションを
組んだときに活かすことができれば、美しいプログラミングができそうです。

そこで、LISPでのリストの処理をする関数などがCから利用できるライブラリのような
ものはないものでしょうか?

また、みなさんはもし、CやJAVAなどでLISPで学んだことをどのように活かしておりますでしょうか?

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

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

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