CommonLisp Scheme Part12

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
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はジェネリックプログラミングでオブジェクト指向とは別物だっちゅ〜の!
1514: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 ...))
みたいなやつはどうなるかな?
実験してみたいが、時間がないので直感だけですまね。
2019: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 辺りが似たようなことをしてるね。
私も簡易名前空間作ろうとして、そんな感じのコード書いたことあるし。
2217: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))))
2423:04/11/18 01:12:05
いかーん間違えとる(涙
2523: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の方もシャドウする?
2817: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を考えてるみたいだから考えなくてもいいんかな。
3017:04/11/18 22:50:13
>>29
うむむ、それも考えてませんでした。
今回はその判別は任意ですね。
より完全さを目指したい人はやってみてください。
3123: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
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のソース内にいまだに残るドイツ語を英語に直すと喜ばれそう.
4017: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なら掲示板作るのが楽そうなので。
4417: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に渡して再帰させるんじゃない?
6966: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)
7266: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))
これは無視してください。
7671:04/11/23 05:25:32
>>72
> そうすると再帰的な関数で組めるかかなり不安です(´・ω・`)

簡単に書けるよ。二変数A, Bを取る末尾再帰の関数で、
f (A:入力リスト) (B:空リスト) で呼び出して、
で入力Aを削りつつ、Bを書き換えていって、Aが無くなったらBをかえす。
7766: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
フィールドの数によったりしないかね。
多値ってのはそんなに多くの数を想定してるわけじゃないから。
9566:04/11/24 02:48:36
>>78
ソースありがとうございます!これなら何とかわかりそうです!
実装できたので後は後半部分を読み解いてみます。
>>79
残念ながら課題です・・・。
9666: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))))
102101: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
103101: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しといたら?
105101: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) '(+ - * /))
もいらないだろ。
一回変換したやつを省いているだけだろ。
10766: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
リストでスタック実現すればいいのでは?
110101: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
123デフォルトの名無しさん:04/11/26 00:44:15
前の初心者スレはどうなったんだ?
124116: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
130デフォルトの名無しさん:04/11/28 19:20:54
PocketSchemeね。RSR4+αくらいの仕様で、Windows APIも叩けたはず。
サンプルデモにグラフィックスの表示とかあった。
131130: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
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
私の言っていることは間違いである
193not 178:04/12/05 21:22:08
でLispWorksはどうなったのよ。
4.3のEnterprise Edition評価版ちろっと使った経験しかないから漏れからなんとも。
いまこれが動かせればACL 7.0リリース版とベンチ採って比較したりできたんだけどな。
194デフォルトの名無しさん:04/12/05 21:37:28
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章はチュートリアルらしいね
205199: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 もオッケーのはず。他の処理系でもあったはず
だけど思い出せない。
224218:04/12/08 09:51:01
>>219-223
ありがとございます。普段48使ってるんですが、scshがいけるとは盲点でした。
biglooは Serializationが面白そうな予感。
225218: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
231228: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? があります。
236229: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ですか?
250247: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でだめなのは最適化かなんかの都合なの?
259247:04/12/16 22:06:23
>>255
>>256
言いたいのはそういうことです。良い例をありがとうございます。

>>258
それは知りませんでした・・・
てっきり回避不可能に近い制限なのだろうと思ってたので。
その仕様だと、効率を除けばデメリットは無いですよね・・・
gaucheでいろいろ試してみます。
260234: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でなんでも書けるらしいですね。
なにか面白いマクロネタありませんかね。
261234: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))
))

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

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

264sage: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))
)))
274273: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 書けば解決するから。
301300: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を一個持てば作れるけどな。
破壊的操作が必要になるのであまり嬉しくないけど、
計算量的にそれが必要ならやればいいだけの話。


323319: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でエラーがでてしまいます。

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

ところで自由変数を参照しない手続きを呼ぶ用語に困っているのですが、
何か適当な用語はあるでしょうか。
環境を持たないクロージャなんですが、組み込みの手続き(コンパイラが即値で
書き込む)を利用するので副作用があって関数とも呼びにくいのです。
ちなみに大域環境はありません。
346デフォルトの名無しさん:04/12/27 15:06:23
完成おめ。
これからブートストラップしてくんだね。

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

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

>>353
遅くなりましたが、教えていただきありがとうございます。
これから試してみます。
372デフォルトの名無しさん:05/01/04 13:17:26
関数で、結果が環境に依存せず引数だけで決まり、また、
副作用ももたないものを形容する言葉はありますか?
+や-などがその仲間だとおもいます。よろしくお願いします。
373339: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はそういう区別をしません。)
375339: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) ...)
はどう処理されるの?
378339: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
レスどうもありがとうです.
とりあえず図書館で探して読んでみるとです.
391383: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章とドラゴンブック以外に参考になる文献はあるでしょうか?
特に継続の実装がさっぱり分からないです。
398396: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
403402: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と同等の定義にはなっていないよ。これは念のためなり。
409408: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についてはどうでしょうか?
432427: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だけです。
436434: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と思って読んでくださいませ。
437434: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 ...)ができてしまうとは.....意外だ。
438434: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
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) に書き出すプロシージャになってることが多い。
485483: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
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
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も知らないんだけど、サブプロセスとして走らせられないの?
524522:05/03/02 16:51:00
>>523
それはできるのですが,いくつか問題があって,

・プログラムの戻り値は表示されるが,ユーザの入力値は消えてしまう.
・サブプロセスの起動は,非力なマシンだと重い.

などの理由があって,今のところ Petite Chez Scheme を単独で動かしています.
525522: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
556555: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
572Scheme初心者: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
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
詳細キボン
601572: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
653デフォルトの名無しさん:05/03/18 18:57:45
MIT Schemeがいつのまにか MIT/GNU Schemeに化けとる……。

654デフォルトの名無しさん:05/03/18 20:36:56
>>653
知らんかった?
木村巌さんのサイト全然更新してくんない (´・ω・`)

URL変更あったヤツとかだいぶ前にメールしてあるんだけど...
655641: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で学んだことをどのように活かしておりますでしょうか?
689デフォルトの名無しさん:2005/03/22(火) 18:01:33
>>683
(let ((if #t))
 (when if (set! if 'now))
 if))
はマクロ展開されると、だいたい
(let ((#:if1 #t))
 (if #:if1 (begin (set! #:if1 'now)))
 #:if1)
な感じになる。というわけで結果はnowとなる。
こんなんでいいのかな?
690本田:2005/03/22(火) 20:35:55
>>688

>Cで、あるいはもっと賢く、Schemeでリンク・リストを使う技法
http://www-6.ibm.com/jp/developerworks/linux/050304/j_l-listproc.html

>GLib
http://developer.gnome.org/arch/gtk/glib.html
691デフォルトの名無しさん:2005/03/22(火) 21:18:56
>>689
マクロ展開した結果じゃなくて、
工程を聞いてるんだと思うけど。
692デフォルトの名無しさん:2005/03/22(火) 22:05:18
そういってもなあ。解釈時の展開と実行時の束縛を混同しているように思える。
693デフォルトの名無しさん:2005/03/22(火) 22:14:32
>>689
>>691
682-684です。早速ありがとうございます。
689さんの展開結果の疑似コードはマクロ展開の行程を
推測するのに参考になります。
マクロシンボルは通常のスコープにあるシンボルと
かち合わないような名前に変更されて置換される、
と理解しました。
686の最後に書いた「展開後のコードに含まれるシンボルは、
通常のスコープとは異なるスコープをもつ」というのは
だいたいこのようなことを想像していて、それを書いた
つもりでした。
ただし、この例の場合はさらに複雑で、letのスコープも
絡んできますよね。
689さんの説明では、letブロックの中のシンボルも
置換されてしまっていますが、マクロシンボルの置換の
対象になるのは飽くまでも(when ....)のブロックの内部
だけに限られますよね。
(689さんが説明のためにすべてのシンボルを置換されたのは
理解していますが、厳密にいうと、です。)
結局、まず(独自のマクロシンボルのスコープを用いて)マクロ
展開が行われ、その後、展開式の評価が通常のメカニズムで行われる、
と理解できかけているような気がします。
まだ完全にはわかっていない感がありますので、もう少し考えてみます。
どうもありがとう!
694デフォルトの名無しさん:2005/03/22(火) 22:16:59
>>692
693です。まさにそういうことみたいですね。
695デフォルトの名無しさん:2005/03/22(火) 22:19:25
あれで納得したならいいけど。
696デフォルトの名無しさん:2005/03/22(火) 22:23:28
694ですが、
「そういうこと」=「解釈時の展開と実行時の束縛を混同している」
という意味でした。
697本田:2005/03/22(火) 22:30:34
>>688

>Gauche(ゴーシュ)は、
>スクリプトインタプリタとしての使い易さに重点を置いて開発を行っているR5RS準拠のScheme処理系です。
>日常業務の中でのちょっとした処理を行うスクリプトを気軽にSchemeで書きたいなあ、
>という願望のもとに、起動が速いこと、
>システムへのアクセスが組み込まれていること、
>最初から多国語対応を考慮していること、
>リスト処理ライブラリとして他のC/C++プログラムから簡単にリンク可能であること、
>などを目標としています。
http://www.shiro.dreamhost.com/scheme/gauche/index-j.html
698デフォルトの名無しさん:2005/03/23(水) 23:13:13
WindowsXPでclispを起動したら↓こんなエラーメッセージが出てしまいました。

*** - invalid byte #x83 in CHARSET:ASCII conversion

clispはcygwinのインストーラでインストールしました。
エラーが出たからといって動作に不都合はないみたいなんですが、気持ち悪いので
できればなんとかしたいです。解決方法知ってたら教えてもらえませんか。
699デフォルトの名無しさん:2005/03/23(水) 23:23:20
R5RSでScheme勉強中なんですが、以下の"implicit forcing"を備えた実
装ってどれぐらいあるんでしょうか。ちょっとググった限りでは見つけ
られませんでした。

+ Some implementations may implement "implicit forcing," where the value
of a promise is forced by primitive procedures like `cdr' and `+':

(+ (delay (* 3 7)) 13) ==> 34
700デフォルトの名無しさん:2005/03/24(木) 00:37:41
>>698
export LANG=
してから実行するとエラー消えたりしない?
701698:2005/03/25(金) 00:46:48
>>700
アドバイスありがとう。でも残念ながらダメでした。
特に特殊な環境や設定で動かしているわけじゃないのになんでなんだろ。
702デフォルトの名無しさん:2005/03/25(金) 03:03:16
>>698
touch ~/.clisprc
703698:2005/03/26(土) 02:08:43
>>702
解決しました。ありがとう。
704デフォルトの名無しさん:2005/03/26(土) 13:36:44
なんかpython 3000ではlambdaだけでなくmapやreduceも捨てるといってるそうだが、

リスト内包表現って構文であって、
その操作自体をfirst class objectとして扱えないよね?
つまり持ち運ぼうと思ったら関数を定義して名前を与えざるを得ないよね。
その場合のための統制語彙があるに越したことはないのに、
「俺様が理解に詰まるものは捨て捨て」
だそうだ。何考えてるんだ。もったいない。
705デフォルトの名無しさん:2005/03/26(土) 14:08:48
別に理解に詰まってるわけじゃないだろ。
しかし、なんで捨てるんだろうな。
俺が知ってるのは、Lispが他の言語より優れてるというgrahmaの意見に対する
Python側の反論で、lambdaはPythonコミュニティでは失敗とみなされてる
ってのがあったんだけど、なぜだかは知らない。
もしかしたらlispの方が優れてると言わせたくない思惑があるのかも?
706デフォルトの名無しさん:2005/03/26(土) 14:13:47
pythonで匿名関数を扱うにはどうすれば良いですか
707デフォルトの名無しさん:2005/03/26(土) 14:32:29
名前欄を空にする。
708デフォルトの名無しさん:2005/03/26(土) 14:41:37
>>705
>Python側の反論で、lambdaはPythonコミュニティでは失敗とみなされてる
>ってのがあったんだけど、なぜだかは知らない。

素人にはお勧めできないから。
709デフォルトの名無しさん:2005/03/26(土) 16:24:18
lambdaかっこいいのに・・
710デフォルトの名無しさん:2005/03/26(土) 16:27:24
まぁ所詮 Python は Lisp ではなかったってことだな。
711デフォルトの名無しさん:2005/03/26(土) 17:03:45
Lisp ってすごいよね、ほんと。
最後まで生き残るんじゃないかな。
712デフォルトの名無しさん:2005/03/26(土) 17:15:22
細々とな(w
713デフォルトの名無しさん:2005/03/26(土) 18:45:29
>>705
> grahma

grandmaに見えた。Lisperおばあちゃんw
714デフォルトの名無しさん:2005/03/26(土) 19:13:37
Lispばあさん。誰か物語書いてー
715デフォルトの名無しさん:2005/03/26(土) 19:44:30
ぼくの おばあちゃんは 明治生まれのLisper
再帰 高階関数 なんでもどんとこいさ
λにmapcar クロージャをapply
マクロでDSL
オブジェクトも楽々 CLOSでさくさく
得意の総称関数
716デフォルトの名無しさん:2005/03/26(土) 19:47:04
>>715
ラップですか
717デフォルトの名無しさん:2005/03/26(土) 19:51:34
うは。「コンピュータおばあちゃん」を知らない世代?
718デフォルトの名無しさん:2005/03/26(土) 19:59:49
知らない世代ならば逆に喜ばしいことじゃないか
719デフォルトの名無しさん:2005/03/26(土) 20:01:05
>>717
まだ私が生まれていないころですね。
720デフォルトの名無しさん:2005/03/26(土) 20:01:42
ハッスルばあちゃんなら知ってるが。
721デフォルトの名無しさん:2005/03/26(土) 20:40:59
実写版いじわるばあさんなら知ってる。
あれは世界観が最高だった。
722デフォルトの名無しさん:2005/03/26(土) 22:05:52
コンピュータおばあちゃん世代だらけとは加齢臭漂うスレだな
723デフォルトの名無しさん:2005/03/26(土) 22:16:02
俺は真っ暗森世代だよ
724 :2005/03/26(土) 23:04:22
サーバサイドのプログラムなのですが、
lisp で書き溜めたいつくかの処理があってこれをCから使いたい
のですが、こういう処理って
fork→exec してパイプでつないで結果を得る、
みたいな方法になるんでしょうか?

clispとCが連携しているケースのソースなんか
あったら参考にしたいのですが、参考になるプロジェクトとか
サイトとかありませんか?
725デフォルトの名無しさん:2005/03/26(土) 23:10:43
Lispはpythonよりも最先端の言語だよ。
726デフォルトの名無しさん:2005/03/27(日) 08:48:45
plt scheme の最新版 (v299.100)がリリースされました。
http://download.plt-scheme.org/

v300 シリーズのα版だそうで、今までとはいろいろ変わってるっぽいです。
詳細は以下参照。

http://groups-beta.google.com/group/comp.lang.scheme/browse_thread/thread/920f08175520f833/25bd80a2a97d9cda#25bd80a2a97d9cda

個人的に嬉しかったのはマルチバイト文字、文字列が普通に扱えるようになったところ。
DrScheme 上で試したらこんな感じ。

> (string-length "ほげ")
2
> (string-ref "ほげほげ" 3)
#\げ
> (char->integer #\λ)
955

そういや chez scheme の v7.00 ていつ出るんだろう。
727デフォルトの名無しさん:2005/03/27(日) 09:21:43
Common Lisp やばい。。。
今勉強してるんですが、まじ感動してます。

ほら、そこのリスパー!
俺に質問してみれ
728デフォルトの名無しさん:2005/03/27(日) 09:26:39
>>727
car板とcdr板があるのにcons板がないのはなぜですか
729デフォルトの名無しさん:2005/03/27(日) 09:27:20
Emacs Lisp でファイルをプログラムに入力して、その内容により
midi 作るってことできるのかい? いや、できるのはわかっている。
でも、それを簡単にする Auxiliary パッケージはあるかい?
730デフォルトの名無しさん:2005/03/27(日) 09:29:52
>>728
Vacuous.

car板とcdr板なんてないじゃん。
cons は List (ってかツリー) をCONStruct するんだYO.
(cons (cons (cons ... ) ... ) ... )
の一番外側の cons をツリーのルートと見てもよい。

わかったか。 > リスパー
731デフォルトの名無しさん:2005/03/27(日) 09:31:54

昔、スコーンというおかしがあった。 てか今もある。
cons は

スコーン => scon => sconsconscon => cons cons cons

という見方もあるのである。
732ぱんつマニアアアアア ◆6Vxxv8cFbA :2005/03/27(日) 09:34:35
isomorphism が大切。

例えば、上の例の `sconsconscon' の先頭 `s' と
一番最後のキャラクター `n' をくっつけてみると、一つの輪ができる。
この時、この輪は consconscons とも sconsconscon とも
解釈することができるのであるYO.



わかったか >lisper
733デフォルトの名無しさん:2005/03/27(日) 09:35:28
734デフォルトの名無しさん:2005/03/27(日) 09:36:23
>>730
>595
735ぱんつマニアアアアア ◆6Vxxv8cFbA :2005/03/27(日) 10:03:19
俺はまだリスパーではない。
ヽ(`Д´)ノヽ(`Д´)ノヽ(`Д´)ノ
736デフォルトの名無しさん:2005/03/27(日) 10:10:11
お前つまらないからもうカエレ
737デフォルトの名無しさん:2005/03/27(日) 10:11:16
例えば、上の例の `こちんこちんこちん' の先頭 `こ' と
一番最後のキャラクター `ん' をくっつけてみると、一つの輪ができる。
この時、この輪は ちんこちんこちんこ とも こちんこちんこちん とも
解釈することができるのであるYO.
(・∀・)
738ぱんつマニアアアアア ◆6Vxxv8cFbA :2005/03/27(日) 10:17:52
Re:>736 お前が帰れ。
Re:>737 Topology でも学べ。
739デフォルトの名無しさん:2005/03/27(日) 10:25:59
>>726
ついにDrSchemeも日本語使えるようになったのか。
やっと使える処理系になったな。
740デフォルトの名無しさん:2005/03/27(日) 11:48:39
>>726
おお,よく知らせてくれた.
ここに書いてもらわなかったら,絶対視界に入らなかった.
741デフォルトの名無しさん:2005/03/27(日) 12:37:55
  カァ    クダァ
((・∀・) . (・∀・))
742ぱんつマニアアアアア ◆6Vxxv8cFbA :2005/03/27(日) 12:49:08
  ス    コーン
((・∀・) . (・∀・))

car + cdr == whole list

+ オペレーションは CONS
つまり、スコーン!
743ぱんつマニアアアアア ◆6Vxxv8cFbA :2005/03/27(日) 12:50:25
まちがってサゲちまった
744デフォルトの名無しさん:2005/03/27(日) 13:00:49

新種のスクリプトですか?
745デフォルトの名無しさん:2005/03/27(日) 13:01:33
なんで荒らされてんの?(w
746 :2005/03/27(日) 13:07:45
むずかしいことには誰も答えられないんだね
747デフォルトの名無しさん:2005/03/27(日) 13:13:18
なぜcons板がないかっていうこと?(w
748デフォルトの名無しさん:2005/03/27(日) 13:19:47
(nth 1) (nth 2)
749デフォルトの名無しさん:2005/03/27(日) 13:26:42
>>726
日本語がぁ!感激です。・゚・(ノД`)・゚・。
750デフォルトの名無しさん:2005/03/27(日) 13:58:12
>>726
MrEd でも日本語使えるようになってる?
751デフォルトの名無しさん:2005/03/27(日) 14:23:18
なってる
752ぱんつマニアアアアア ◆6Vxxv8cFbA :2005/03/27(日) 14:38:05
Re:>749 やったじゃん
753デフォルトの名無しさん:2005/03/27(日) 15:29:49
>>752
ぱんつって何かおもしれ〜www
何気に変なこと知ってるし
754デフォルトの名無しさん:2005/03/27(日) 16:10:27
(・∀・)
755デフォルトの名無しさん:2005/03/27(日) 16:43:56
Re:の後にレス番を続ける形式を何回か見たことあるが、全てトリップ付きのかなりな厨だった
756デフォルトの名無しさん:2005/03/27(日) 19:38:03
なんかキチガイが暴れてるな
757大原ゆき ◆6iqfpMYUkI :2005/03/27(日) 19:39:48
呼びましたか
758デフォルトの名無しさん:2005/03/27(日) 21:02:44
759デフォルトの名無しさん:2005/03/29(火) 00:57:48
拡張子がpltなファイルがあったんだけど、
どうやって解凍すんの?
760デフォルトの名無しさん:2005/03/29(火) 18:54:14
Windows2000/XPでDrSchemeをインストールして、*.scmファイルをダブルクリック起動すると、
*.scmファイル中の日本語が化ける。
Definitions Window内で日本語入力した場合は、化けずにちゃんとSJISで保存できるのに。
761デフォルトの名無しさん:2005/03/29(火) 22:30:50
Definitions Window から保存すると UTF-8 になってるはずだよ。
他のエディタで書いたものを読ませたいなら、UTF-8 にすれば問題なし。
762760:2005/03/30(水) 09:34:32
ほんとだ。Definitions Windowからのは、秀丸が自動的にUTF-8で読んでた。
763デフォルトの名無しさん:2005/03/30(水) 15:37:15
いつの間にか SBCL と SLIME の組み合わせでも UNICODE が使えるようになってた。
CL-USER> (length "ほげ")
2
CL-USER> (aref "ほげほげ" 3)
#\げ
CL-USER> (char-code #\λ)
955
764ぱんつマニアアアアア ◆6Vxxv8cFbA :2005/03/30(水) 17:52:33
Re:>ALL みんな、最近どうだ?
Re:>754 やあ。
Re:>757 吾と寝ろ。 >大原ゆき
765デフォルトの名無しさん:2005/03/30(水) 20:02:52
数学板のうんこコテじゃないよな
766デフォルトの名無しさん:2005/03/31(木) 08:27:02
S式とXMLの相互変換というのをやりたいのですが、
それっぽいライブラリがもうあったりしますか?
767デフォルトの名無しさん:2005/03/31(木) 11:35:41
>>766
SXMLでぐぐれ
768デフォルトの名無しさん:2005/03/31(木) 23:29:00
こいつ試した人居たら使用感報告ヨロ。
ttp://agentsheets.com/lisp/XMLisp/
769デフォルトの名無しさん:2005/03/31(木) 23:58:03
>>768
うひょ、リーダでそのままXML読めるのか。面白いな。
770デフォルトの名無しさん:int 2ch =05/04/02(土) 00:28:48
The Fate Of LAMBDA in PLT Scheme v300 or Lambda the Ultimate Design Flaw
http://article.gmane.org/gmane.lisp.scheme.plt/8710

……日付変わっちゃったけど一応。
771デフォルトの名無しさん:int 2ch =05/04/02(土) 13:52:42
>>770
う〜ん もう一つひねりが欲しかったな。座布団は出ないかも。
772デフォルトの名無しさん:2005/04/02(土) 22:52:30
>>771
ひねり?ハァ?

そのまんまだろ。
何か問題でもあるのか?
773デフォルトの名無しさん:2005/04/03(日) 02:45:23
ふと思ったんだが、v3.00からしてネタだったり....まさかそんなことないか(笑
774デフォルトの名無しさん:2005/04/04(月) 06:51:31
cygwinでGauche-0.8.3使ってます。

windows形式でのパス(C:\cygwinとか)を元にファイル操作をするには
どうすれば良いでしょうか?

string-trの使い方を分かってないみたいです。
775デフォルトの名無しさん:2005/04/05(火) 00:06:27
cygpath
776ぱんつマニアアアアア ◆6Vxxv8cFbA :2005/04/05(火) 10:37:00

お          ね
  め          \
    \          ん
      ら          だ
        つ          Y
          ま          O
            ん
777ぱんつマニアアアアア ◆6Vxxv8cFbA :2005/04/05(火) 15:59:31

         吾はプログラマーではない; 論理学者であるぞ
               貴様等とは格が違う
778デフォルトの名無しさん:2005/04/05(火) 16:02:19
>>777
何研究しているの?
779ぱんつマニアアアアア ◆6Vxxv8cFbA :2005/04/05(火) 16:06:43

>>778
                主に数学論理である
          それとモダン論理システムにも手を出している
780デフォルトの名無しさん:2005/04/05(火) 16:08:17
>>779
モダン論理システムってどんなもの?
781デフォルトの名無しさん:2005/04/05(火) 16:10:50
相手にするなよ
782デフォルトの名無しさん:2005/04/05(火) 16:11:18
ボロが出ないうちに去った方がよいぞよ
783ぱんつマニアアアアア ◆6Vxxv8cFbA :2005/04/05(火) 16:11:43

       Modal 論理、Conditional 論理、 Relevant 論理などである
784デフォルトの名無しさん:2005/04/05(火) 16:12:02
>>780
モダン焼きみたいなもんだろ
785ぱんつマニアアアアア ◆6Vxxv8cFbA :2005/04/05(火) 16:12:34

                貴様等とは格が違う
                ふぁふぁふぁふぁ
786デフォルトの名無しさん:2005/04/05(火) 16:13:23
>>785
それには同意
787ぱんつマニアアアアア ◆6Vxxv8cFbA :2005/04/05(火) 16:15:39

               ところでこのスレッドに
                Lambda Calculus
             を完全に修得した者はおるか?
788デフォルトの名無しさん:2005/04/05(火) 16:19:40
λ文字山くらいしか知らん
http://wwwfun.kurims.kyoto-u.ac.jp/MtLambda.html
789ぱんつマニアアアアア ◆6Vxxv8cFbA :2005/04/05(火) 16:20:05

なあ、コテハン変えてもいい?
なんか発言といまいちマッチしないねん
790ぱんつマニアアアアア ◆6Vxxv8cFbA :2005/04/05(火) 16:23:58
(´・ω・`)ショボーン
791デフォルトの名無しさん:2005/04/05(火) 16:26:14
>>787
このスレにいるならラムダくらい使うだろ。
「完全」ってのがどの程度かは知らんが。

>>789
このオレが名付け親になってやろう。
貴様は「フルーツジョッキー」だ。
792ぱんつマニアアアアア ◆6Vxxv8cFbA :2005/04/05(火) 16:31:04

      君は Lambda 関数と Lambda Calculus を一緒にしていないか?

>このオレが名付け親になってやろう。
                調子にのんなばか。
793デフォルトの名無しさん:2005/04/05(火) 16:32:59
いちおう初歩的な数理論理学とアルゴリズム論ぐらいなら知ってる。
794デフォルトの名無しさん:2005/04/05(火) 16:35:52
「完全に修得」って秘伝の武術みたいだな。w
795デフォルトの名無しさん:2005/04/05(火) 16:47:13
一子相伝だったりして
796デフォルトの名無しさん:2005/04/05(火) 17:02:37
ぱんつマニアアアアアよ、説明せよ。
797デフォルトの名無しさん:2005/04/05(火) 19:31:07
フルーツジョッキー(formerly known as ぱんつマニアアアアア)ってばタイミングよく入るCMみたいだな。
でも番組が再開したら消えろよ。
798デフォルトの名無しさん:2005/04/05(火) 19:47:24
(´Д`) フルーツジョッキーてなんずらと思てぐぐってみたけんど、なんもヒットしん。。。
799デフォルトの名無しさん:2005/04/05(火) 20:07:26
>789
うんこイータアアアアアア でじゅうぶんだろ
800800:2005/04/05(火) 20:23:47
最近LISPとForth作ったんだけどよ
Forth意味不明だった
Forthはワード定義と制御構造が無茶苦茶汚くなる
やっぱ一貫性のあるLISPだよな
まあGCイラネって意味ではRPNも良いんだけどよ
801デフォルトの名無しさん:2005/04/05(火) 21:39:55
>>800
おまいのほうが意味不明だべ
802800:2005/04/05(火) 21:43:02
ForthはRPNだとか言いながらワード定義や制御構文は
それに全然従ってねえってことよ
803800:2005/04/05(火) 21:44:02
LISPは(アクション 引数〜)で一貫環てるじゃねーか
括弧のネストがウザイけどな
804デフォルトの名無しさん:2005/04/05(火) 22:10:47
括弧は見易い!
805デフォルトの名無しさん:2005/04/05(火) 22:30:35
Python みたいにインデントで構造を表すLispとかあったら面白いとおもわんか?
面白いだけだが。
806デフォルトの名無しさん:2005/04/05(火) 22:32:14
ML系の方が見やすいわ。
807デフォルトの名無しさん:2005/04/05(火) 22:32:40
>>805
二次元構文って何がいいの?メリットがよくわからんのだけど。
808デフォルトの名無しさん:2005/04/05(火) 22:45:23
>>807
他人のプログラム読むときに変なインデントになってる心配がない。w
809デフォルトの名無しさん:2005/04/05(火) 23:22:10
Python 書いてると、明示的に閉じないせいか、ズボンのチャックを
空けっぱなしのような不安感がつきまとう。
810デフォルトの名無しさん:2005/04/06(水) 00:57:01
あるある。結構無理して;を書かないようにしてる。
あんまりPythonやってるとCで書いてる時に閉じ忘れたり。
811ぱんつマニアアアアア ◆6Vxxv8cFbA :2005/04/06(水) 11:28:13
Re:>805
                  つまらん
812デフォルトの名無しさん:2005/04/06(水) 20:28:46
お前ら、Lispを広めるチャンスがきましたよ
ここに、Lispの有用な例を書き込めばLispを知らしめることができるぞ
http://codezine.jp/a/default.aspx?cid=225
813デフォルトの名無しさん:2005/04/06(水) 20:50:10
コールド・ジン みたいでかっこいいな。
814デフォルトの名無しさん:2005/04/06(水) 22:22:18
情報システム板で古典パンにやられてる屑コテハンが、
こんなところで暴れてるのな。悲惨
815デフォルトの名無しさん:2005/04/06(水) 22:26:15
しかも、Lispが最高だとか未だに勘違いしてる馬鹿っぷり。
うんこだな
816デフォルトの名無しさん:2005/04/06(水) 22:27:30
判りやすい馬鹿はスルーでよろしく
817デフォルトの名無しさん:2005/04/07(木) 00:39:55
馬鹿とはスレをあげてる奴の事ですか?
818ぱんつマニアアアアア ◆6Vxxv8cFbA :2005/04/07(木) 14:20:26
Reply-to:>>814
> 情報システム板で古典パンにやられてる屑コテハンが、
> こんなところで暴れてるのな。悲惨

           吾はそんな板に出没したことはないぞ。

____________
"Self" is that which is in the process of becoming... --Zeno
Today's Lucky Number: 348
819デフォルトの名無しさん:2005/04/07(木) 20:04:14
内容が無い言い訳をいちいちする辺り、奴とそっくり
820デフォルトの名無しさん:2005/04/07(木) 20:38:20
ぱんつ以下略って2chぶらうざで書いてないのか?
821ぱんつマニアアアアア ◆6Vxxv8cFbA :2005/04/07(木) 20:43:32
Reply-to:>>820
> ぱんつ以下略って2chぶらうざで書いてないのか?

                いや、navichだな。

Reply-to:>>819
> 内容が無い言い訳をいちいちする辺り、奴とそっくり

              その「奴」ってのは誰だ?

____________
If T is consistent, T !|- G_T.
822デフォルトの名無しさん:2005/04/07(木) 20:49:45
ぱんつ以下略ってもしかして就職活動中?
この業界にLISPの仕事はないよ。
823ぱんつマニアアアアア ◆6Vxxv8cFbA :2005/04/07(木) 20:52:08

Reply-to:>>822
              いや、今のところ違うが。

____________
If T is consistent, T !|- G_T.
if T is ω-consistent, T !|- ¬G_T.
824デフォルトの名無しさん:2005/04/07(木) 20:58:34
教職狙え。
825デフォルトの名無しさん:2005/04/07(木) 21:05:42
いやきっと、汚いパンツくんは、Frantz Lispに入るんだろうw
826デフォルトの名無しさん:2005/04/07(木) 21:06:38
あっそ言えば、情緒不安定でとみに著名な某氏の会社もあったなw
827デフォルトの名無しさん:2005/04/07(木) 21:07:56
パンツの中身は、ここ数年就業経験のない無職粘着中年
828ぱんつマニアアアアア ◆6Vxxv8cFbA :2005/04/07(木) 21:10:14
Reply-to:>>824
             恐らくそれが一番楽であろう。

Reply-to:>>825
       吾は Lisper ではないから Franz にはいかないであろう。
     Computer Science でいくのであれば AI 系の会社に入るだろうね
           なににしてもつまらん仕事はしたくない。

____________
If T is consistent, T !|- G_T.
If T is ω-consistent, T !|- ¬G_T.
829デフォルトの名無しさん:2005/04/07(木) 21:17:37
汚れパンツくん、
一週間に一度くらいはパンツ履き替えろよ

あと、signature風のその見苦しい虚栄心をなんとか白w
830デフォルトの名無しさん:2005/04/07(木) 21:18:37
>>829
キチガイ中年の今度のタ〜ゲットは、AIか。悲惨だなキチガイ粘着=パンツ
831デフォルトの名無しさん:2005/04/07(木) 21:20:35
>>828 ガンバレキチガイ
832828の母:2005/04/07(木) 21:28:38
この子は小さい時から粘着力だけは凄かったんです。
頑張って、この粘着世界一位を目指して欲しいんです。
他は全然駄目だけど、馬鹿な子ほど可愛いって言うじゃないですか(涙
833デフォルトの名無しさん:2005/04/07(木) 21:31:35
>>818なんてsignatureもどきを Zeno ◆5nZQbNmQPs のときのまま変え忘れてるしw
834658:2005/04/08(金) 23:30:00
Schemeで自作ゲームのマップ自動生成ツールを作成中。
って、道のりは遠いが。
Lispは
S式で何かデータを記述 → S式のデータを元に別のデータを出力
だと異様に生産性が高いね。
Paul Graham氏のViawebはそんな感じか?
835デフォルトの名無しさん:2005/04/08(金) 23:58:04
>>834
だよね。XMLの代わりにS式が流行ってたら俺たちの天下だったのにな。w
まぁちょちょいのちょいで変換できるからいいけどさ。
836デフォルトの名無しさん:2005/04/09(土) 00:36:02
macro & sexp マンセー。
`(,foo ,@bar ,(baz ))
837デフォルトの名無しさん:2005/04/09(土) 00:46:05
>>834
別にS式だから生産性が高いというわけではなくて、関数型の一般的な性質。
Lispは副作用もかけるけど。
838デフォルトの名無しさん:2005/04/09(土) 01:14:01
>>835
SGMLのスタイルシートの記述言語 は、Schemeだたーよ。
でも流行らなかった罠。
839デフォルトの名無しさん:2005/04/09(土) 01:15:03
>>837
例によって例のごとく、ズレまくった発言して、
フレーム議論でも始める準備ですか(呆
840デフォルトの名無しさん:2005/04/09(土) 01:30:41
>>839
ずれまくるのは仕様です。
なぜなら、最後の3レスぐらいしか読まないから。
841デフォルトの名無しさん:2005/04/09(土) 03:08:20
何の仕様?
842デフォルトの名無しさん:2005/04/09(土) 03:17:07
>>841
俺の仕様。3レスぐらいしか読まないっていう仕様。
843デフォルトの名無しさん:2005/04/09(土) 03:23:29
それは仕様じゃなくてバグじゃないのか?
844デフォルトの名無しさん:2005/04/09(土) 03:38:04
>>843
そやないよー。
コンピュータでの数値計算だって1/1+1/2+1/3+…の計算をするとき、実際には有限回の計算しかしないよね?
レスだって有限とは言えたくさんあるのでPart1から全て読むなんてことなんてしないもん。
俺は読む量がちょっと少ないだけ。
845デフォルトの名無しさん:2005/04/09(土) 03:44:08
せめて fixnum レス分くらい嫁
846デフォルトの名無しさん:2005/04/09(土) 12:50:22
>>845
fixnumは実装依存だからなぁ
847デフォルトの名無しさん:2005/04/09(土) 14:05:59
kusosure
848デフォルトの名無しさん:2005/04/09(土) 14:06:56
korosuke
849デフォルトの名無しさん:2005/04/09(土) 14:50:55
>>846
普通は10ビットか20ビットくらいあるはず
850デフォルトの名無しさん:2005/04/09(土) 15:24:33
>>842氏のfixnumは2ビット(-2〜+1)でつ
851デフォルトの名無しさん:2005/04/09(土) 15:27:40
う〜ん、違うなぁ。3レスぐらいっていうからには4レスという可能性もあるわけだ。
たぶん平均3の正規分布になるだろうね。
852デフォルトの名無しさん:2005/04/09(土) 15:29:56
> 4レスという可能性もあるわけだ。

そーゆーときはbignumで対処しまつ
853デフォルトの名無しさん:2005/04/09(土) 18:10:12
LISPの一部のコードに型推論を実装することってできるよね。

誰かやってよ。
最強に生まれ変わるよ。
854デフォルトの名無しさん:2005/04/09(土) 18:35:50
既にLISPは最強ですがなにか?
855ぱんつマニアアアアア ◆6Vxxv8cFbA :2005/04/09(土) 18:40:37

      「何かが最強」であると考慮する時、それが何を相対として、
         何について最強であるかが述べられていない場合、
            その行為は全くもって無意味である。


____________
If T is consistent, T !|- G_T.
If T is ω-consistent, T !|- ¬G_T.
856デフォルトの名無しさん:2005/04/09(土) 18:46:32
>>853
多くのCommon Lispコンパイラは既にやっている。
もちろんdeclareがあればそっちを優先するけど。
857デフォルトの名無しさん:2005/04/09(土) 18:47:25
多くのって・・
具体手にには何?
clispはやってますか?
858デフォルトの名無しさん:2005/04/09(土) 18:51:17
>>857
cmuclはやってるね。clispは中間言語コンパイラだからやってないかも。
859デフォルトの名無しさん:2005/04/09(土) 18:56:53
cmuclだけ?
他には?
860デフォルトの名無しさん:2005/04/09(土) 19:02:48
もしかして最適化レベルのこと言ってんの?
861デフォルトの名無しさん:2005/04/09(土) 19:04:40
860は何いってんの?
862デフォルトの名無しさん:2005/04/09(土) 19:08:05
>多くのCommon Lispコンパイラは既にやっている

今は「既にやっている」「多くのCommon Lispコンパイラ」を列挙する場面でつ
863デフォルトの名無しさん:2005/04/09(土) 19:19:36
>>858
今ソース読んでるけどcmuclのどの辺に型推論やってるとこある?
864デフォルトの名無しさん:2005/04/09(土) 19:45:48
俺はソース読んでないけどcmuclのドキュメントにはやってるって書いてあった希ガス
865デフォルトの名無しさん:2005/04/09(土) 19:48:27
common lispの仕様外でしょ?
866デフォルトの名無しさん:2005/04/09(土) 20:17:23
そんなこと関係ないが
867デフォルトの名無しさん:2005/04/09(土) 20:17:46
で、「多くの」はどこに掛かってるわけ?
868デフォルトの名無しさん:2005/04/09(土) 20:25:24
結局cmucl以外やってないということでいいですね。
cmucl自体やってるか疑わしい、と。
>>856がさっさと列挙してくれれば一番良いのですが。
869デフォルトの名無しさん:2005/04/09(土) 20:29:39
アレグロもやってる





と、思う
870デフォルトの名無しさん:2005/04/09(土) 20:32:16
>多くのCommon Lispコンパイラは既にやっている
と思う。
871デフォルトの名無しさん:2005/04/09(土) 20:36:29
「多くの」に粘着するのを見てても面白くないんで、
むしろ>>853の「最強」が気になる。
現存の全ての処理系に勝るには何をどのようにやればいいのかな?
872デフォルトの名無しさん:2005/04/09(土) 20:37:22
認知されてない時点でやってないも同じ
873デフォルトの名無しさん:2005/04/09(土) 20:37:46
はやく列挙しろよ
874デフォルトの名無しさん:2005/04/09(土) 20:43:38
別にLispに型なんていらねーな。
型推論とかあっても邪魔。
875デフォルトの名無しさん:2005/04/09(土) 21:38:46
型推論いるよ派
    型推論やると最強だよ派
    多くのCommon Lispコンパイラは既にやっているよ派
      cmuclはやっているよ派
        cmuclのソース見てもやっているかわからないよ派
        ドキュメントにはやってるって書いたあった希ガス派
      はやく列挙しろよ派
    多くのCommon Lispコンパイラは既にやっていると思うよ派
      アレグロもやってると、思うよ派
      認知されてない時点でやってないも同じだよ派

型推論いらないよ派
    型推論は邪魔だよ派
876デフォルトの名無しさん:2005/04/09(土) 21:58:18
((型推論いるよ派
  (型推論やると最強だよ派
    (はやく列挙しろよ派)
    (cmuclのソース見てもやっているかわからないよ派)
    (認知されてない時点でやってないも同じだよ派))
  (多くのCommon Lispコンパイラは既にやっているよ派
    (cmuclはやっているよ派
      (ドキュメントにはやってるって書いたあった希ガス派)))
  (多くのCommon Lispコンパイラは既にやっていると思うよ派
    (アレグロもやってると、思うよ派)))

(型推論いらないよ派
  (Lispに型はいらないよ派
    (型推論があっても邪魔だよ派))))
877デフォルトの名無しさん:2005/04/09(土) 22:02:18
↑のリストに

(型推論いらないよ派
    (既にLISPは最強ですが抜けてますよ派))

を追加するプログラムを作れよ派
878デフォルトの名無しさん:2005/04/09(土) 22:08:34
おれはむしろLISPにも静的型が書けたらいいよ派
declareとかtheとかキショイよ派
879デフォルトの名無しさん:2005/04/09(土) 22:13:34
scheme派
880デフォルトの名無しさん:2005/04/09(土) 22:14:00
schemeにも型推論が必要だよ派
881デフォルトの名無しさん:2005/04/09(土) 22:14:06
Schemeの方がシンプルでいい。
882デフォルトの名無しさん:2005/04/09(土) 22:15:47
schemeに足りないのはdeclareみたいな型指定子とパッケージみたいな名前空間だけ
883デフォルトの名無しさん:2005/04/09(土) 22:15:57
↑末尾に派を付けない派
884デフォルトの名無しさん:2005/04/09(土) 22:19:21
CommonLispは名前が長いよ派
885デフォルトの名無しさん:2005/04/09(土) 22:41:21
schemeに型推論は蛇足だよ派
886デフォルトの名無しさん:2005/04/09(土) 23:44:55
>>882
Gaucheとかはモジュール化機構があるよ派
887デフォルトの名無しさん:2005/04/09(土) 23:48:04
だから何?派
888デフォルトの名無しさん:2005/04/09(土) 23:51:20
Scheme は方言が多いよね派
Scheme に飽きた Guy Steele が作ったのが Common Lisp だよね派
でもそのあと Guy Steele は Java にも加担しちゃったんだよね派
889デフォルトの名無しさん:2005/04/10(日) 00:16:16
SchemeはもともとLispの方言だよね派
890デフォルトの名無しさん:2005/04/10(日) 00:16:42
SchemeがLISP方言なわけだが。
あとは処理系の実装の違い。
891デフォルトの名無しさん:2005/04/10(日) 00:17:09
>>888は方言と言いたかっただけのNOOB
892デフォルトの名無しさん:2005/04/10(日) 00:19:28
>>889-891
もし>>888に言っているのであればLisp全体とその方言のCommon Lispを混同してないか派
893デフォルトの名無しさん:2005/04/10(日) 00:21:12
方言の使い方間違ってないか?
CommonLispは言わば標準語。
894デフォルトの名無しさん:2005/04/10(日) 00:28:41
標準語⊂方言 のように「方言」という単語を定義すれば矛盾しない。
Common Lisp, Scheme ∈ {Lispの様々な方言}
895デフォルトの名無しさん:2005/04/10(日) 00:31:02
>CommonLispは言わば標準語
そう言い切られるとISO ISLISPが可哀想派
896デフォルトの名無しさん:2005/04/10(日) 01:05:19
そもそもLispに標準を求めるのが間違いだよ派。
っていうか自分で作ろうぜ派。
897デフォルトの名無しさん:2005/04/10(日) 01:47:26
どれでも受けつける処理系をきぼんぬ派
898デフォルトの名無しさん:2005/04/10(日) 10:16:24
Common Lisp

CommonLisp+-(Scheme)

Common Lisp #

?←これ何て呼ぶんだろう
899デフォルトの名無しさん:2005/04/10(日) 10:59:38
Dommon Lisp
900デフォルトの名無しさん:2005/04/10(日) 14:30:29
>>899
Dommonってなんだよw
そういうのはGガンダムで勘弁な。
901デフォルトの名無しさん:2005/04/10(日) 14:56:47
SchemeにCommonLispの型やパッケージが入れば、
CommonLisp不要になるんだよね。
結局わざわざCommonLisp使う理由ってパフォーマンス以外にないから。
Biglooみたいなやつから発展しないかなあ。
902デフォルトの名無しさん:2005/04/10(日) 15:41:17
>>901
Gacuheの次期バージョンではコンパイラ(っていうかCへのトランスレータ)
が実装される予定だからパフォーマンス的には期待できるかも。
903デフォルトの名無しさん:2005/04/10(日) 16:01:06
declare みたいなのがないと高速なコードに静的にコンパイルするのは難しいでしょ。
それよりも、最近の流行としては HotSpot みたいに実行時のプロファイルを使った
動的コンパイル&動的最適化かも。誰か挑戦しない?
904デフォルトの名無しさん:2005/04/10(日) 17:39:38
An Infrastructure for Profile-Driven Dynamic Recompilation (1998)
Robert G. Burger and R. Kent Dybvig
International Conference on Computer Languages
905デフォルトの名無しさん:2005/04/10(日) 20:49:04
>>853
あぁ〜、これだから初心者は・・・。
最初に「型変数」を実装した実装系は、
CommonLispコンパイラ。
当然、型推論も一部行っている。
906デフォルトの名無しさん:2005/04/11(月) 03:41:35
>>903
Gaucheの次期バージョンで限定的に実装されるCへのトランスレータは、
VMコードをCのベクタに落とすだけなので、性能には寄与しないでしょ。
コンパイルが省略できるぶん少し早くなるだろうけど。
907デフォルトの名無しさん:2005/04/15(金) 01:18:37
フジ「恋におちたら」出演おめ


908デフォルトの名無しさん:2005/04/15(金) 01:26:38
熊本大学が中国にクラッキングされた。
http://www.kumamoto-u.ac.jp/

反撃したいやつは、VIP板に集合
http://ex10.2ch.net/news4vip/index.html
909デフォルトの名無しさん:2005/04/15(金) 02:34:15
ああ、中年男の日は昨日だったのか。さっくり忘れてた。
910デフォルトの名無しさん:2005/04/15(金) 03:41:05
>>909
ちゃんとエンドロールに名前も出ていた。
セリフもあった。
911デフォルトの名無しさん:2005/04/15(金) 03:57:47
その話題とこのスレの関係は何?
912デフォルトの名無しさん:2005/04/15(金) 08:32:32
>>911
Gaucheの作者であるかわいさんが出演してたのです。

913デフォルトの名無しさん:2005/04/15(金) 11:34:27
>>912
へぇ〜。つか、そういう面白いことは放送前に教えてくれよ。
914デフォルトの名無しさん:2005/04/15(金) 17:01:01
もまいら
Common Lisp Hyper Specが更新されてましたよ。

http://www.lispworks.com/documentation/HyperSpec/index.html
915デフォルトの名無しさん:2005/04/15(金) 20:02:59
>>912
( ゚д゚)ナニー!?

>>913同様に、そういう事は早く言えよ。
916デフォルトの名無しさん:2005/04/15(金) 23:10:46
しばらく前からwilikiに書いてあったよ
917デフォルトの名無しさん:2005/04/16(土) 00:03:34
ドラマの件はさ〜っぱり忘れてた。誰かビデオでも撮ってないかな。

Common Lisp HyperSpecは変更点がよくわかんないけどダウンロードしとこ。
関係ないけどLispWorks 4.4のPersonal Editionまだ来ないね。
ILC2005行けばEnterprise Editionの評価版貰えるかも知れないけどウェブサイト
見る限りじゃちゃんと準備が進んでいるのかあやしげな悪寒。業務で行くのは無理か。
918デフォルトの名無しさん:2005/04/20(水) 22:01:48
文字コードをeuc-jpからutf-8に変換するライブラリで
lispの方言(librep)でも使えるものってありませんか?
919デフォルトの名無しさん:2005/04/21(木) 02:17:59
そういう事にLISP使うのは間違ってる気がする
本来そういった文字セットとかを超越した所にS式は存在するべきなんだよ
920デフォルトの名無しさん:2005/04/21(木) 02:25:22
>>919
青いな
921デフォルトの名無しさん:2005/04/22(金) 01:28:15
Scheme初心者です。FAQだったらごめんなさい。
syntax-rulesで作成したマクロは通常define-syntaxで
シンボルにバインドしているようですが、なぜdefineでは
いけないのでしょうか?試してないけどそれもアリ?
ひょっとしてマクロとそれ以外のオブジェクトとで
異なるScopeを持たせたいってことでしょうか?
922デフォルトの名無しさん:2005/04/22(金) 01:41:50
921です。
試してみましたが、やはりdefineではエラーになります。
defineを使ってマクロをシンボルにバインドするような実装も
可能だと思うのですが。
そうした場合、どういう不都合がありますか?
923デフォルトの名無しさん:2005/04/22(金) 03:40:28
>>922
define はあくまで変数を定義してそれに値を与える(たまたま値がラムダ式であれば
関数を定義したことになる)だけです。マクロは文法上、変数ではないので define で
定義するのは一貫性を欠くことになります。また define-syntax はトップレベルでしか
使えないなど、制約事項も異なります。
924デフォルトの名無しさん:2005/04/22(金) 04:00:48
>>922
あと、コンパイルと実行が別々になっている場合、マクロはコンパイル時に
展開するのが普通だから、マクロ定義と通常の束縛とが区別できる形に
なってないと困る、ってのもある。
925デフォルトの名無しさん:2005/04/22(金) 21:34:00
お前等逝けよ。 >ALL
逝けってば。
早く逝けっつってんの。
926デフォルトの名無しさん:2005/04/22(金) 21:45:25
最近LISPでない言語でプログラム書いたら、
LISPの偉大さ心に染みた。
927デフォルトの名無しさん:2005/04/22(金) 21:47:22
処理系実装して解るLispの(_|_)さ。
928デフォルトの名無しさん:2005/04/23(土) 05:09:27
どういうところがどうだと言いたいのかさっぱりわからん。
929デフォルトの名無しさん:2005/04/23(土) 06:01:09
>>927
(_|_)
↑この顔文字?の意味がわからん。
930デフォルトの名無しさん:2005/04/23(土) 06:09:10
ウルトラ・・・かな
931デフォルトの名無しさん:2005/04/23(土) 08:55:29
>>923,924
921です。ありがとうございます。
コンパイラの場合、話はわかりやすいですね。
インタプリタの場合はどうでしょうか?
(実装依存、という話ではなく、どのようにあるべきか、です)
たとえば
(define-syntax some-operation (syntax-rules ...) ;;マクロ
(define some-operation (lambda ...) ;;手続き
とした場合、
(some-operation ...)
という呼び出しは、やはりマクロ定義のほうを優先するのが順当なのでしょうか。
ただし、呼び出し時の字面は全く同じだと仮定します。
932デフォルトの名無しさん:2005/04/23(土) 09:22:25
あるべき姿としては、コンパイルしてもインタプリタで実行しても
同じように実行できるのがいちばんいいんじゃないの。もっともこれは
Lispが随分苦労してきた問題で、いまだにすっきりした解決は無いと
思うけど。(comp.lang.schemeあたりで、マクロと分割コンパイルの
話題を探すと色々出てくると思う)

マクロと手続き、両方定義したらどうなるかっていう話は、綺麗な仕様は
無いような気がする。ナイーブに上から実行してくインタプリタなら
後から出てきた方が上書きしちゃうだろうけど、例えば別ファイルで
some-operationにset!されたらどうなるかとか。921は何かアイディアがあるのか?

933デフォルトの名無しさん:2005/04/23(土) 09:59:05
>>932
>921は何かアイディアがあるのか?
何もありません。ただ、R5RSをみても、define-syntaxの説明があまりにも
簡略でdefineとの関係がよくわからなかったのでおたずねしました。
Scheme勉強中なのでできるだけ実装系に依存しない理想的な挙動をイメージ
しておきたかったのですが、
[1]コンパイラなら話は簡単(924のように)
[2]インタプリタでもコンパイラと同じ挙動が期待される(932のように)
[3]ナイーブに上から実行してくインタプリタなら後から出てきた方が上書き(932のように)
ということですね。
931に挙げた例だと[2]と[3]とは矛盾することになりますが、
[2]は人間様にとって実装によらず常に同じ結果を返すようにするように期待したもので、
本来の「自然な」Schemeの振る舞いは[3]のほうである、と理解しました。

しかし、もし[3]の立場をとるとすると、define-syntaxとdefineとは同じscopeを
共有することになり、define-syntaxの存在意義がよくわかりません。
>>923さんは「マクロは文法上、変数ではない」と書かれましたが、
マクロを変数に「バインドする」ことならやってもよいのでは?(初心者です)
define-syntaxでなければできないことって、何かありますか?
具体的な例をいただければ理解できると思います。
934デフォルトの名無しさん:2005/04/23(土) 10:12:27
初心者です・・・

人間様にはR5RS schemeのdefine-syntaxは理解できません・・・

初心者です・・・
935デフォルトの名無しさん:2005/04/23(土) 10:14:28
初心者です・・・

具体的な例をいただけないと理解できんとです・・・

初心者です・・・
936デフォルトの名無しさん:2005/04/23(土) 10:16:56
921です。自省
コンパイラの存在なしで話をしようとしていたのが誤りだったのかも。
結局Schemeといえども単なる言語処理系であって、形而上学的な理想像を
追い求めてはいけない、ということでしょうか。
937デフォルトの名無しさん:2005/04/23(土) 11:23:16
>>936
私も初心者だけど、defineとdefine-syntaxは概念として全然違うものだと思うので、
なんでそんなにしつこく同一視できると思うのかよくわからない。
ただ、うまく説明できるほどには習熟してないのでもどかしい。

あえて説明を試みるならdefineは実行環境が持っている保存領域になんかいれるもので、
define-syntaxはコンパイラ(インタプリタ)に覚えさせる指示ってカンジ?
Cでいうならステートメントや式とコンパイラディレクティブの差みたいなもの。
変なこと言ってたらスマソ。
938デフォルトの名無しさん:2005/04/23(土) 11:36:35
>>933
変数値として「マクロ」を認めてしまうと、当然実行時の動的な値に従うべきということに
なるので、実際問題としてコンパイラを作るのが非常に難しくなってしまうよね。

文法上「マクロ」は通常の Scheme の実行環境の「外側」にあると考えられるわけ。
マクロ展開時の「実行時環境」を考えたくないので、手続き的な方法ではなく宣言的な
方法での定義を強制させているのだろうね。

でも、個人的には危険が危ないがなんでもできる Common Lisp 風のマクロのほうが
好きだったりするのだが。w
939デフォルトの名無しさん:2005/04/23(土) 12:29:09
921です。
>>937
>Cでいうならステートメントや式とコンパイラディレクティブの差みたいなもの。
>>938
>文法上「マクロ」は通常の Scheme の実行環境の「外側」にあると考えられるわけ。
なるほどね。
個人的には、SchemeのマクロはCのプリプロセッサ的なものと理解しました。
かなり納得。
940デフォルトの名無しさん:2005/04/23(土) 12:36:10
921です。939の続き。
となると、やはり933の[3]的な考えは正しくなく、どのような場合でも、
まずマクロ展開が行われてから、通常の評価が行われる、ということになりますね。
ふむふむ、納得。
間違っていたらご指摘ください。
941デフォルトの名無しさん:2005/04/23(土) 12:55:21
>>940
むしろ、仮に [3] のような処理系であっても結果がなるべく同じになるように考えて
define と define-syntax を分離していると考えることもできる(ような気がする)。
942デフォルトの名無しさん:2005/04/23(土) 13:50:55
>>929
未定義
943デフォルトの名無しさん:2005/04/23(土) 22:49:26
jythonのようにjavaソースやclassファイルに落とせるlispの処理系って
何かありますか?
javaでは面倒な処理をLispで書けが生産性があがる気がするのですが。
944デフォルトの名無しさん:2005/04/24(日) 00:07:51
>>943
最近のは試してないけど kawa はいかが?
http://www.gnu.org/software/kawa/
945デフォルトの名無しさん:2005/04/24(日) 00:27:25
単発QAは荒しのサイン
946デフォルトの名無しさん:2005/04/24(日) 00:41:53
>>921
schemeでシンボルといったら'nameで表されるようなオブジェクト、または
それらの型を言う場合が多い。あなたが言っているものは名前とか識別子と
呼ぶのが適当だ。もし混同していたのなら、これを機に復習してくれ。

識別子には種類が二つあって、それは(defineやlambda式で導入される)変数名
と(define-syntaxやlet-syntaxで導入される)構文キーワード名だ。
これらは同じ名前空間で管理される(別の言い方では同じスコープ規則に
従う)が、扱いは別。
(932が言っているのは、ソースファイルとかモジュールというような概念が
定義されてないschemeにおいて、それらをどう扱うかという話。)

>>933
[1], [2], [3]はなんというか視点がずれてる。
コンパイラ、インタープリタ問わず処理系は (some-operation ...) を処理
するときには二つのsome-operationのバインドのうちどちらかしか見えない
ので、その式を処理する方法は常に一つしか存在しない。
つまり、some-operationを変数名だとみなしたら手続き呼び出しだし、
構文キーワード名だとみなしたらマクロ展開だ。

そういった訳で、940でのあなたの理解は大まかには正しいということに
なる。マクロ展開が先に行なわれるというよりは、マクロ呼び出しだったら
展開するしか処理方法がないということね。

ちなみに通常は、トップレベルで二重に定義された名前は後から定義した方
が以前の定義を(概念的に)上書きするので、 (some-operation ...) は
マクロ呼び出しとして処理することになる(この辺はschemeの仕様書で探して
みたが明確な記述はなかった)。
947デフォルトの名無しさん:2005/04/24(日) 00:45:51
いい加減テンプレに入れても良い様な気がするが…

>>943
ttp://home.comcast.net/~bc19191/blog/040627.html
948946:2005/04/24(日) 01:10:26
訂正。
> (some-operation ...) はマクロ呼び出しとして処理することになる
...は手続き呼び出しとして...

読み返してみると日本語ムチャクチャだな...
949デフォルトの名無しさん:2005/04/24(日) 01:18:04
>>947
gj
950デフォルトの名無しさん:2005/04/24(日) 01:41:29
jil.faslが存在しない〜〜〜なんだよ・・・
951デフォルトの名無しさん:2005/04/24(日) 14:06:48
JiL? 6のトライアル版でも使ってんの?
952デフォルトの名無しさん:2005/04/24(日) 18:05:00
>951
faslは見つけたんだが、require出来ん。
Trialでは無理なのかな?
これでjavaコード全部書いてやろうと思ってたんだが。
953デフォルトの名無しさん:2005/04/25(月) 23:29:38
トライアル版持ってないから力になれない。Franz Inc.に直接問い合わせてみれば?
954デフォルトの名無しさん:2005/04/26(火) 00:54:26
921です

>>946
>もし混同していたのなら、これを機に復習してくれ。
なるほど。ご指摘ありがとうございます。

>some-operationを変数名だとみなしたら手続き呼び出しだし、
> 構文キーワード名だとみなしたらマクロ展開だ。
結局、手続きとマクロ展開とはつくられたときから全く別の
ものであり、参照のためにそれぞれ変数名や構文キーワードに
関係づける際に、それぞれdefineとdefine-syntaxを使う、と
理解しました。
ただし、
>「これらは同じ名前空間で管理される(別の言い方では同じ
>スコープ規則に従う)
わけですね。

そうすると、マクロと手続きとは並列的な関係にあるオブジェクトであって、
>>946さんは婉曲に
>そういった訳で、940でのあなたの理解は大まかには正しいということに
>なる。
なんて書いてくださいましたが、私が>>939-940で納得していた
「Cプリプロセッサ的解釈」はちょっと違いますね。

compiler(およびそれと整合的なシステム)は、実行時に
マクロ展開を選択的に優先して実行するようなシステムだと
思えばいい、ということで、今度こそ納得できた気がします。
955デフォルトの名無しさん:2005/04/26(火) 01:03:46
921です。補足
ちなみにcompilerそのものの場合には
コンパイル時にマクロ展開するので、
最後のくだりの中で
>実行時に
が不要であることはわかってます。
956デフォルトの名無しさん:2005/04/26(火) 01:08:10
>>954-955
キミの理解はあってると思うけど、
キミの文章は色々不要な事を言い出しちゃってて、
コミュニケーションに難がある、と思う。

このような文章を書くあなたは学生さんだと思うが。
テストの回答で、余計な事書くと減点されるって知ってるよね?
今の君のコミュニケーションは、正にそれ。くどい。
957デフォルトの名無しさん:2005/04/26(火) 01:10:05
くどい=回りくどい

あるいは、

正解わからずに、解答欄に三つも四つも解を書いて、
数撃ちゃ当たるだろう、という傲慢な態度が見え隠れしている。
958デフォルトの名無しさん:2005/04/26(火) 01:15:54
921です
>>956-957
勉強します。
959946:2005/04/26(火) 11:40:51
>>954
それでOKかと。

923とその背景を説明してる924はよく出来てると思うので、迷ったら読み
返すといいかもしれない。
960デフォルトの名無しさん:2005/04/26(火) 23:12:08
>>959
Vielen Dank!
961デフォルトの名無しさん:2005/04/27(水) 23:44:00
CPSにコンパイルする処理系ないですか
もつろんSchemeでさ
962デフォルトの名無しさん
rhizome/pi "完全なCPSによる実装である"らしい。