LISP Scheme Part3

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
2デフォルトの名無しさん:01/12/13 14:11
□参考リンク□

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

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

Lisper への道(日本語)
http://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

慶応の授業のページ・記号処理プログラミング 2001
http://buri.sfc.keio.ac.jp/lisp/menu.html

Practical Scheme(日本語)
http://www.shiro.dreamhost.com/scheme/index-j.html
「普通のやつらの上を行け」など、興味深い文書があります。

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

Scheme Hash(英語)
http://okmij.org/ftp/Scheme/index.html

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

お隣りのプログラマ板のLISPスレのログです。
http://mentai.2ch.net/prog/kako/963/963134110.html
3デフォルトの名無しさん:01/12/13 14:12
□仕様書関係□

Common Lisp the Language, 2nd Edition(英語)
http://www.cs.cmu.edu/afs/cs.cmu.edu/project/ai-repository/ai/html/cltl/cltl2.html
CommonLispの仕様書です。

アルゴリズム言語Schemeに関する第五改訂報告書 R5RS(日本語)
http://www.sci.toyama-u.ac.jp/~iwao/Scheme/r5rsj/html/r5rsj_toc.html
http://www.biwa.ne.jp/~mmura/scheme/tspl.html#r5rs
日本語訳はここ以外にもあるそうです。

Scheme Requests for Implementation SRFI (英語)
http://srfi.schemers.org/

Scheme Frequently Asked Questions (英語)
http://www.schemers.org/Documents/FAQ/
4デフォルトの名無しさん:01/12/13 14:12
5デフォルトの名無しさん:01/12/13 14:25
「神神神神 教えてください。 神神神神」という放置スレにあったコードなん
ですが、これで縦型探索になるのが不思議です。lにリストをいれてxに要素を
いれると、見つかるとscontが呼び出されてだめだとfcontが呼び出されるという
ことでいいんでしょうか。Scheme屋さんはこういうコードが好きなんですか?

(define (dfsearch x l scont fcont)
 (if (pair? l)
   (dfsearch x (car l)
        scont
        (lambda ()
         (dfsearch x (cdr l) scont fcont)))
   (if (equal? x l) (scont x) (fcont))))
6デフォルトの名無しさん:01/12/13 16:27
直前の評価値を取得する方法ってないですか?
(+ 1 2) ; -> 3
(* @ 2) ; -> (* 3 2) -> 6
(- @ @@) ; -> (- 6 3) -> 3
みたいに。
>>6
CommonLispにはある筈。
たしか+
詳しくは仕様書参照して。
8デフォルトの名無しさん:01/12/13 17:37
*, **, *** だよ >>7
9無名λ式:01/12/13 17:38
前スレの>>949
http://pc.2ch.net/test/read.cgi/tech/1002584344/?&st=949&to=949&nofirst=true
> つーか、シンボルは分解するようなものじゃないだろ?

Lisp 1.5懐かしあげ

(explode 'explode) → (e x p l o d e)
(inplode '(i n p l o d e)) → inplode
>>9
すげえな。でも、何の意味が?
シンボルってアトムじゃないの?
11デフォルトの名無しさん:01/12/13 21:41
>>10
質問の意味がワカラン
12関数プログラマ:01/12/13 22:12
昔はLispではシンボル(アトム)を文字列代りに使っていたので,
シンボルを簡単に分解できるexplode/implodeが重宝がられたそう
です.
1310:01/12/13 22:59
>>11
atomって用語は「それ以上分解できない原子」って意味じゃない?
なのに分解できちゃうのか、みたいな疑問。

>>12
納得。それならわかります。
14関数プログラマ:01/12/13 23:19
HyperLispではatomもリストも同じような構造をしていて,atomの
car/cdrを取ることもできます.

これとは関係ないのですが,昔のマイコン上のLisp処理系では,
atomのcarだかcdrだかを取るとproperty listがぞろぞろと取れ
てしまうものがありました.atomのメモリ上の表現がconsセルと
同じだったからなんですね.実際それを使ったプログラムもあり
ました.うーむ.
15デフォルトの名無しさん:01/12/13 23:43
>>13
symbol の字面の文字を解析して別の symbol の list を返す
というのは, atom の分解できないという定義とは矛盾しないと
思うけど.
schemeだとこんな感じかな
(define (explode sym)
  (map (lambda(c) (string->symbol(string c)))
       (string->list(symbol->string sym)))
)
(define (inplode sym-list)
  (string->symbol (apply string
    (flatten (map (lambda(s)(string->list(symbol->string s)))
                  sym-list))
  ))
)
>(inplode(explode 'abcde))
=>abcde
>>16
s/flatten/apply append/
19 :01/12/14 00:38
問題

Lisp の組み込み述語 member を自力で定義しなさい。
(キーワードパラメーターももちろんサポートすること)

例:
> (member '(c) '( ( (a) (b) ) ( (c) (d) ) ) :key #'car :test #'equal)
( ( (C) (D) ) )
20デフォルトの名無しさん:01/12/14 02:05
副作用について質問、
こういうmap関数を作ったとき、
(define (string-map proc s)
  (let loop ((pos 0))
    (if (< pos (string-length s))
        (cons
          (proc (string-ref s pos))
          (loop (+ pos 1)))
        tail)))

(string-map (lambda(c)(display c)#t) "abcdef")
fedcba
=>(#t #t #t #t #t #t)
という結果になってしまいました。
これは規格通りなのでしょうか?
ほんとは
abcdef
と出したいんですけど。
>>19
(defun member (item list &rest rest &key test test-not key)
(nthcdr (or (apply #'position item list rest) (return-from member)) list))
22 :01/12/14 02:25
正解 >> 21
比較的、lisp primitive に精通していると見た。
>>20
consじゃなくてbeginつかえよ。
24デフォルトの名無しさん:01/12/14 18:27
procの結果をletで受けて評価順序をコントロールすれば良いかと。>20
(let ((r (proc (string-ref s pos)))) (cons r (loop (+ pos 1))))
25デフォルトの名無しさん:01/12/14 18:41
なんでこんなことになるかというと、関数の引数の評価順序は
特に規定が無いからなんだけど。
副作用のある処理でこの辺気をつけて書かないと
大量のバグを抱え込むことになる。
26デフォルトの名無しさん:01/12/15 01:30
副作用のあるやつはシーケンスの中に置くべきだけど、
これ間違えたら警告出す様にできない?
28デフォルトの名無しさん:01/12/15 10:02
>>26
Schemeの場合,任意の式が副作用を持つか持たないかは静的には
(実行する前には)わからないので難しいと思います.
29デフォルトの名無しさん:01/12/15 10:15
>>27
またなつかしい論文を…

まあ,それにしても G. Steele って天才だと思います.
彼のこの分野への影響力は半端ではない.
30デフォルトの名無しさん:01/12/15 10:40
>>27
これWeb翻訳しようとしたら、全部画像じゃん。アホか。
PDF使えねー
31デフォルトの名無しさん:01/12/15 10:45
>>20
コンパイルすると大抵の処理系では右から左への評価順序に
なるんじゃないかと。(理由はCと同じだと思う。)
インンタプリタなら左から右ってのも珍しくないけど。
過去スレに無理矢理評価順序を変えるマクロがあった。
32 :01/12/15 13:52
Common Lisp でバイナリストリーム扱いたいのですが、
詳しい情報があるページとか教えてください。
33デフォルトの名無しさん:01/12/15 14:44
検索した?>32
34 :01/12/15 15:24
考えられる限り検索したんですけど、駄目ですね。
やっぱり、Lisp は バイナリ処理には向いてないのですかね? >> 33
35デフォルトの名無しさん:01/12/15 16:37
>>30
いったいいつの論文だと思ってるんだか…
スキャンしてオンラインで読めるようにしてくれているだけでも十分ありがたいのに.
36デフォルトの名無しさん:01/12/15 21:04
>>35
なんだと?この論文オナニー野郎
OCRにぶち込めば済む話だろうが?
>>36
じゃオマエがやれやヴォケ
38デフォルトの名無しさん:01/12/15 22:47
λなカッチョいいアイコンない?
39デフォルトの名無しさん:01/12/16 08:54
LISPっていう言語、このスレではじめて知ったんだけど
何する言語?
みなさんどんなことに使ってるんですか?

単に興味持っただけなんですが、教えてくらさいませ・・・・
40>39:01/12/16 09:32
AIなどでよく使われる,データをリストに変換する高級言語.
41デフォルトの名無しさん:01/12/16 10:33
汎用言語だよ。
俺はパースなんかに使ってる。
42デフォルトの名無しさん:01/12/16 12:22
39ではないですが、
僕も最近lispを知って、面白そうだったのでxyzzyでいろいろ
いじってます。

lispだけしかやらない人は少ないと思うのですが
lispをやって得た知識が、他の言語でのプログラム
に役立ったってことはありますか?
リスト操作ライブラリかなんかはLISPの名前参考にしてる。
A Little Schemer 学生のころ読んで感動したなぁ。
あの本たのしいね。

25才を越えてしまったいま、「普通の奴ラの上を行け」を読んで
今年はSchemeきわめようかな、と思うこのごろ。でもRubyもSqueakも
極めたい。
45 :01/12/16 17:45
Closure とか Macro とか C にはない機能が盛りだくさん >> 42
CにもMacroはあるかモナー
>>46
でもCのマクロとschemeのマクロは全然違う機能だと思うけど。
48デフォルトの名無しさん:01/12/16 22:02
schemeのコードをパースしたいんだけど、
エレガントな方法ある?
SICPの4章みたいなのが一般的?
4942:01/12/16 23:11
>>45
僕は培風館のLISP(原書3版)というのを使ってやってますが、
そこでクロージャーでジェネレーターを作っているのがありました。
確かにこんな機能はCにはないですねえ。

ただ、ジェネレータを作るたびにそれぞれのレキシカルな環境が生まれるっていうのは
なんだか、クラス作ってインスタンスを作ったみたいな感じがしました。
(って、激しく勘違いしてるのかも知れませんが。)
50デフォルトの名無しさん:01/12/16 23:17
同じだよ>49
データ付き関数
5142:01/12/16 23:31
よかった。あってて。

しかし、xyzzyでやってるからオブジェクト指向で書けない。
CLOS、おもしろそうなんですが・・・。
>>47
マクロはマクロだけど
lisp の構造上異常に強力になるという
ことだよね。
まあ、Cのは単に文字列置き換えてるのと大差ないし。
54デフォルトの名無しさん:01/12/17 02:50
Cのマクロは再帰的な展開ができない。
(#defineの中に#ifdefなんかが書けない)
LISPはなんでもあり。
この違いはデカイ
55デフォルトの名無しさん:01/12/17 03:18
AISTのJava用プリプロセッサーEPPだと、その辺出来るかも。

明日確認しよーっと。
マクロの展開ルールをLISPで書けるのがよいとこかと。
57デフォルトの名無しさん:01/12/17 12:54
>>15-19 壊滅的な壊れ方ですね。
  データ救助&復旧の予定は?
58デフォルトの名無しさん:01/12/17 15:16
>>55
できる。あれはLisperの作者がLisp風マクロをJavaでも使いたくて作ったものなので。
59デフォルトの名無しさん :01/12/17 15:57
>>41

根本的な考え方が身についた。

>>44

どれかを徹底的にやってから次に手を出すのがよいと思われ。

LispとSmalltalkは甲乙つけがたいよさがあるが、Smalltalkは見事な
実アプリはあっても丁寧に内容を説明したないのが欠点。
Lispはいい本がたくさんあるが、"Paradigms of Artificial Intelligence
Programming"を一冊終わらせたらスーパープログラマーになること
間違いなし。
MASMのマクロはなにげに関数型チック
61デフォルトの名無しさん:01/12/18 02:35
>>20 亀レスだが
mapじゃなくてfor-eachを使えば評価順序は規定されてる。
(ただし値はunspecified。副作用専用。)
62デフォルトの名無しさん:01/12/20 13:36
OLE使うとかいうハナシはどうなった
63デフォルトの名無しさん:01/12/21 14:49
>>20
SRFI の map-in-order
64デフォルトの名無しさん:01/12/21 19:00
ザウルスで動くschemeはないですか?
>>64
ザウルスってCEだっけ?
だったらPocketSchemeで検索
66デフォルトの名無しさん:01/12/21 22:36
ザウルスってまだあったの?
OSはWindowsですか?
67デフォルトの名無しさん:01/12/21 22:40
ザウルスはちかぢかLinuxになります。でもWinCEではありません。
独自OSです。
いまどき独自OSが残ってるなんて驚異的だね。
69デフォルトの名無しさん:01/12/22 19:28
emacsとかxyzzyの様な大作エディタはLISPみたいだけど、
そんなにLISPってすごいの?
>>69
すごいですぅ
LISPは凄いけど、LISPじゃないと大作エディタが出来ない
ってわけでもない。
72デフォルトの名無しさん:01/12/22 20:28
例えば、vim with perl/python/ruby
73デフォルトの名無しさん:01/12/22 22:12
パーサーが小さいからだろ?
AutoCADやGIMPもLISPですが。
75デフォルトの名無しさん:01/12/22 23:09
>>73
そういえば、Omoikane Debian GNU/Linuxのinstallerもschemeでした。
76デフォルトの名無しさん:01/12/22 23:25
>>74
それってマクロだけじゃ無いの?
本体をLISPで書いている分けではないでしょ?
77デフォルトの名無しさん:01/12/22 23:46
>>69
LISP も凄いけど、その方言である Scheme はもっと凄い。
これは LISP に環境モデルを加え、言語としてもかなり綺麗。
「環境」をうまく使えば、メッセージ送信、(多重)継承、カプセル化
なども簡単に実現できる。他にも継続なんてものもあるので、
これを使えばバックトラックも可能。Scheme に弱点はあるのかな?
78デフォルトの名無しさん:01/12/23 00:12
アルゴリズムの実装という点では強いけど,
無敵と考えるのは不遜だよ.
79デフォルトの名無しさん:01/12/23 00:27
>>77
>Scheme に弱点はあるのかな?

名前空間が1つしかない、とか。
define-publicとかは処理系依存だし。
あとオペレータ操作とかが面倒。
普通の言語ではa:=bと4文字程度で済むのに対し、
(:= a b)とタイプ量が増える。(括弧、セパレータの空白)
独自にリーダー作っちゃえば良いんだけど。
タイプ量ねぇ・・・
Schemeのプログラムはもっと根本的なところで
タイプ量が減ると思うけどね。
8177:01/12/23 01:11
>>79
> 名前空間が1つしかない、とか。
そうですね。これについては拡張 Scheme を使えば良いと思います。
処理系依存になってしまいますが、これは現実的なプログラミング
との妥協点だと思います。Schemeの計算モデルの問題では
ないですね。根本的な問題点で思い付く事ってありますか?
個人的には普通の言語でも空白を入れて欲しいなぁ。
あと、ローカル関数があれば名前空間はなくてたいして困らないと思う。
現実的に一番困るのは動的な型が大きなプログラムではデバグしにくいこと。
そうだね。Schemeの大きな弱点と言ったら、括弧だらけの書式と
静的な型が無いことぐらいだね。
8477:01/12/23 01:29
「動的な型である」というのは、単純に弱点とは言えないと
思います。現実なプログラミングとして「デバグがしにくい」という
のはあると思いますが、それと同時に記号処理の恩恵も受けている
はずですからね。

書式 (括弧だらけ) についても、長所と短所があると思います。
括弧で囲い前置記法にすることで曖昧性がなくなり、つまらない
ミスを減らしているのも事実です。慣れない人とっては奇妙な書式
ですけど。色々なプログラムの設定ファイルを見ると、その長所は
理解してもらえると思います。LISP/Scheme の S 式を使う事で、
書式の統一が出来ますし、混乱することもなくなりますからね。
初心者用には、フロントエンドを用意すれば良いと思います。
長所と短所が同時にでてくるってのは同意だけど、
やっぱりそれでも短所だよ。同時に長所だけどね。(w
今更ですが、、、

>>77 型付ラムダ計算の実習に使えない点
  が弱点かと思います。
>>82
Cは、「Fileローカルな関数/変数があるから、名前空間がない」という流儀で、
バリバリやってきたわけだけど、欲しい…名前空間。
(define hoge::foo (lambda (x) ..
みたいな名前にすると名前空間気分が味わえるよ。
usingのかわりに(define foo hoge::foo)とかする。
>>88
それいただき(w
age
91 :01/12/23 20:37
問題:
次のようなマクロを Common Lisp で定義しなさい。
> (for x (0 8) (princ x) (princ (+ x 1))
0112233445566778
NIL
>>88
(let ((foo hoge::foo))
...)
で囲んだ方がそれっぽいかも(w
93デフォルトの名無しさん:01/12/24 16:55
>>91
意味わからん。宿題?
>>19 と同じ人じゃない? 多分宿題じゃないよ.
では聞くがShemeがLispより優れている点は???
9695:01/12/24 23:30
Scheme!! タイプミス スマソ
>>96
シンプルなところ
継続があるところ。
Scheme勉強したくなってきたなぁ。Lispより凄いみたいだね。
でも Win じゃまともな処理系が見つからない。DrScheme ってなんか見た目が
好きじゃないし。
>>99
まともな処理系はchezとか、mitとかscmとかbiglooとかたくさん
あるみたいだけど。
なんにせよ見た目で選ぶのはやめたほうが良いよ。
>99
僕もWinのコマンドラインの処理系探し回ったけど
処理系の「アプリ」として一番まともなのはPetite Chez Scheme。
mit,scmはどーもいまいち。
DrSchemeとかSCMは好きだけどなあ。何で駄目なんだろ。
103デフォルトの名無しさん:01/12/27 16:28
処理系が氾濫してるわりには、使える実装があまり無い気がする。>Scheme
特に実行ファイルで配布できそうなもの。
GUI対応で単体EXEで配布できるようにすれば普及するかもよ?
誰か作らない?
104デフォルトの名無しさん:01/12/27 17:00
>>103
> 誰か作らない?
そう言われて「じゃあおまえが作れ」という言葉がよく返ってくるのは、
「欲しいけど自分は作れない」人が多いからなんじゃないかと思ったりして。
……という訳で、自分で作ってください……。

Winで実行ファイルが作れる処理系は、わたしはこれしか知りません。
(Cのソースを吐き出す奴だけど)
http://www.kt.rim.or.jp/~qfwfq/rhiz-pi/index.html

UNIXなら、guileなんかが割と使えそうな感じなんですけどね……。
105103:01/12/27 17:15
>>104
EXEで配布だけ、ってのは自作で持ってる。
やたら遅いのでお蔵入りしたけど。
スキルのある人登場しないかな。
やっぱネイティブにコンパイルしないと駄目だよ。
>>105
それ下さい
107103:01/12/27 19:06
>>106
仕事で使ってるので公開できない。
おれはコレ作るのに(片手間だが)2年費やしてる。
2年前はLISPなんてまったく知らんかったやつがだ。
キミもそれぐらい苦労すれば作れるだろう。
某スレでは1週間で作ってたやついたし。
108デフォルトの名無しさん:01/12/27 19:44
一瞬、2chでLISP板ができたのかと思った。
http://pc.2ch.net/cdr/
109デフォルトの名無しさん:01/12/27 19:45
まさか、と思ったら、やっぱりあった(笑
http://natto.2ch.net/car/
nullとconsはないようですな。残念(w
nilきぼーん
>>108-109の板にネタスレ立てたくなったけど、我慢我慢・・
113デフォルトの名無しさん:01/12/28 00:16
ソース付きのlispのものすごく小さい処理系無いですか?
リスト、シンボル、整数、apply、eval、gcぐらいでいいんで。
114CD-R??:01/12/28 00:35
>108 その板とても需要があるとも思えないんだけど...
115デフォルトの名無しさん:01/12/28 00:50
>>113
パロディー版アスキーにBASICで書いたlispのソースがあります。
BSデジタル放送板よりはうごいてそうだね<cdr
117名無しさん@Emacs:01/12/28 12:43
118デフォルトの名無しさん:01/12/30 18:55
>>117
>小学4年生の時に作った、はじめての Lisp 処理系の名前が CAMPUS LIsP でした。
天才か?

と思ったら、読み間違えでした。
s/小学/大学生/
119デフォルトの名無しさん:01/12/30 19:06
>>113
昔、アスキーから出てた「Cプログラムブック」の第3巻に
Will'O Lispってのが掲載されてた。
丸々一冊の本でLispインタプリタの最小実装をまず作って
それから少しづつ機能を増やしていくって構成だった。
MS-Cで書かれたたんだけど、それをX68K上で動かすように
いじくった憶えがある。

著者は小西弘一・清水剛

LinuxかFreeBSD用にリファインして再販キボンヌ。
で、配布するに足るexe/dllを生成するWindows向けSchemeコンパイラは?
>>120
ください。
Chez有償版って単に実行時にコンパイルするだけで
exeを作ってくれるわけじゃないんだっけ?
123あげ:01/12/31 01:39
>>122
> Chez有償版
有償版では、作ってくれたような気がします。
124デフォルトの名無しさん:01/12/31 04:50
つーか、自作したいんだけど、
スタンドアロンでEXEやDLL作るための情報、誰かお願いします。
>>124
winならMSDN
126デフォルトの名無しさん:02/01/01 01:43
native化って、gcが絡むとむずかしくない?
単にインタプリタとスクリプトexeに押し込むだけじゃないの?
128デフォルトの名無しさん:02/01/01 01:49
あ、そうなんだ・・。
bytecodeのレベルまでならgc気にしなくても書けるかな。
探索とかの生成が無いコードだとnativeにしても問題ないね。
129デフォルトの名無しさん:02/01/01 01:52
インストラクションコードに直すまではまあ努力次第として、
一番厄介なのはEXEやDLLのヘッダ部分なんだけど。
MSDNに載ってる?
130親切な人:02/01/01 01:58

ヤフーオークションで、幻の人気商品、発見!!!

今は無き「コピーガードキャンセラー」↓
http://page3.auctions.yahoo.co.jp/jp/auction/c15158602

ヤフーオークション内では、現在、このオークション
の話題で、持ちきりです。
>>129
MSDNに少しだけ載ってたような載っていないような・・
「Windows System Internal」か、そんな感じの名前の
本にPEファイルフォーマットについて詳しく載ってた。
今、手元にその本がないから詳細不明。
132デフォルトの名無しさん:02/01/01 04:15
LISPのメリットを教えてくれー
Cとか、JavaとかC++みたいな言語と比較してね。
過去ログでも見れ>132
ここや、「型無し言語逝って良し」スレとか。
>>132
emacsのマクロがかける。
>>134
C/C++やJavaだと書けないね。
リンカ&ローダーっていう本が出てる。ま、いちおう
137Lisp って雲を描いてるみたい(括弧の事ね)。:02/01/01 10:17
Lisp のマクロって何が凄いのでしょうか?
使ってみりゃ分かるみたいな記述が多いですが、初心者には何に使えば良いのか分かりません。
色々読んで、C のマクロと同列に語ると失礼になると言う事は分かりましたが。
138デフォルトの名無しさん:02/01/01 20:05
>>137
使ってみりゃわかる
>>137
とくべつ使う用途がないなら、ムリに使う必要ないよ。
140デフォルトの名無しさん:02/01/01 21:27
>>137
知らずに使ってる場合が多い。
141デフォルトの名無しさん:02/01/01 21:52
拡張構文や、CLOSみたいなオブジェクト指向あたりは、
すべてマクロで作られてる可能性が高い。
実際、Cでいうところのenum列挙子やstruct/union,sizeofなんかは
マクロで書いた。
142デフォルトの名無しさん:02/01/02 17:38
DrScheme で、ユーザーからの入力を受け付けるような処理はどうやって書くんですか?
scanf() みたいな。
>>142
DrSchemeは知らんけど、SLIBにscanfそのものがあったと思う。
144デフォルトの名無しさん:02/01/03 00:03
そう、入出力に関してはSLIBを使えばCライクな物が一通り揃うんだよね。
getchとかは無いけど。
145デフォルトの名無しさん:02/01/03 01:54
http://kyoto.cool.ne.jp/suzakumon/gallery/tactical/gallery-tactical.htm
ここの
X−COM:ALLIANCE
というコーナーに、面白い記事が載ってる。

「中でも一番の特徴は驚異的なAIである。タイプ的にはSWAT3の様なリアルタイム方式なのだ
が、簡単な命令で非常に複雑な行動を地形やシチュエーションに応じて自動的にやってのける能力を持
っているのも同じ。ただしもっとずっと頭が良いという事であり、これがE3のベストに選ばれた最大
の理由だった。AIの作成には世界でTOPクラスのマサチューセッツ工科大学のロボット班が協力してい
るそうで、感情パラメータ導入により人間的な振る舞いを見せてくれるとの事。発売されればPCゲーム
界に革命を起こすとまで言われている期待作である。」
146デフォルトの名無しさん:02/01/03 03:25
>>145
なんの話?
protable common loopsというのをインストールすると
CLOSになるという話を聞きましたが、PCLというのは
フリーなんでしょうか。
xyzzyにのせられる?そんな話題を聞いたこともないの
で無理なんでしょうが。
148デフォルトの名無しさん:02/01/03 08:57
私の知る範囲では、Clispには10年位前に Portable Common Loops が移植されてたと思います。
149148:02/01/03 09:04
ってゆーか、PCLは、Xeroxが出したCLOSの原案だったよーな気がする.

Freeで入手できるCLOSってあるんですか?
150デフォルトの名無しさん:02/01/03 23:18
SLIB のインストール方法がわからん。
WIZARDRYの謎解きよりも難しいじゃん。
>>150
上手い
152デフォルトの名無しさん:02/01/04 02:35
>150
たしかrequireをちゃんと設定するんだと思われ
訳そうかと思って諦めた。身代わりキボンヌ。

Lisp FAQ
http://www.faqs.org/faqs/lisp-faq/

1. Introductory Matter and Bibliography of Introductions and References
2. General Questions
3. Common Programming Pitfalls
4. Lisp Implementations and Mailing Lists
5. Object-oriented Programming in Lisp
6. FTP Archives and Resources
7. Lisp Window Systems and GUIs

Scheme FAQ
http://www.faqs.org/faqs/scheme-faq/
Topics Covered (Part 1):
[1-0] What is the purpose of this newsgroup?
[1-2] What is the difference between Scheme and Common Lisp?
[1-3] Scheme books, introductions, documentation, periodicals,
journals, and conference proceedings.
[1-4] Where can I learn about implementing Scheme interpreters and
compilers?
[1-7] Standards for Scheme -- What are R4RS and IEEE P1178?
[1-8] How do I do object-oriented programming in Scheme?
[1-9] Repositories of Scheme Software
[1-10] Publicly Redistributable Scheme Software
[1-11] Formatting code in LaTeX (WEB and other literate programming tools)
[1-12] Where can I get an implementation of Prolog in Scheme?
[1-13] What does SICP, SCOOPS, R4RS, CAR, CDR, ... mean?
[1-14] Why is there no EVAL in Scheme?
[1-15] World-Wide Web (WWW) Resources
[1-16] Why is Scheme called 'Scheme'?

Topics Covered (Part 2):
[2-1] Free Scheme implementations.
[2-2] Commercial Scheme implementations.
[2-3] What Scheme-related discussion groups and mailing lists exist?
滅茶苦茶です……。
exite翻訳以下のところさえあるでしょう。

scheme faq 1-1
http://www.faqs.org/faqs/scheme-faq/part1/section-1.html
[1-0] このニュースグループ(comp.lang.scheme)は何ですか?

 ニュースグループ「comp.lang.scheme」は、プログラミング言語Scheme に関係のある様々な話題について話すところです。たとえば、次のようなものがあるでしょう(これらに限定している訳ではありません)――
 * Scheme に関する本や、その他のものの告知
 * Scheme で書かれたプログラムやユーティリティに関する議論
 * 移植性に関する問題点についての議論
 * Scheme 処理系のバグについての質問
 * 他アーキテクチャへ処理系を移植するときの問題点
投稿は Scheme コミュニティが興味を持つものにしてください。question [2-3] も参照のこと。

 comp.lang.scheme は
ftp.cs.cmu.edu:/user/ai/pubs/news/comp.lang.scheme/
にアーカイブされています。更新は週単位です。

 CommonLisp に関する質問は comp.lang.lisp で。
Lisp でのオブジェクト指向プログラミングについての議論は comp.lang.clos。
関数型プログラミング言語全般にわたるものは comp.lang.functional。
また、Scheme で AI のプログラミングをしている時は、comp.ai. にクロスポストすべきかもしれません。
155デフォルトの名無しさん:02/01/05 23:34
>>150
Winだったら、解凍した後、環境変数SCHEME_LIBRARY_PATHにSLIBフォルダを
設定をして、開発環境に合わせた"〜.init"というファイルがSLIBフォルダに
入ってるので、そのファイルの中身を編集する。
編集の仕方はフォルダの場所の所を適切に変えて、software-typeをMS-DOSにする。
それで、そのinitファイルを開発環境からloadするとrequireが使えるようになる。
もしも開発環境がSCMだったら、はじめからSLIBを前提としてチューニングが
なされてるので、環境変数を設定するだけでいい。
あと、Dr.Schemeは初期化ファイルをSLIBとは別に既に用意してるので、
環境変数設定した後それを使ってもいい。ヘルプデスクで「SLIB」と検索すれば
使い方がわかる。
156デフォルトの名無しさん:02/01/05 23:37
SCMはインタプリタの中では速いらしいけど、Win2000でMS-DOS版を
使ってると速さを感じないなあ。
Dr.SchemeやScheme48 for Winなんかと大差ないような気がする。
chezが一番速いような気がするんだけどどうかな?
あとMITのインタプリタは激遅い気がする。
158デフォルトの名無しさん:02/01/06 11:15
mit の学生は mit のもの使ってんのかな.
159デフォルトの名無しさん:02/01/06 12:44
リンカ&ローダにはGuy Steeleという名前の人がコメント寄せてるけど、
これはあのビット別冊の人ですかね。
Guy Steeleってそんなに無名かな。
Lisp界隈では最大級の有名人だと思うけど。
Lisp→HPF→Java と渡り歩いてきた私は、
自称当社の Guy L. Steel Jr.担当 です.

他社にも Steel担当者って結構居るらしいです.
162デフォルトの名無しさん:02/01/06 19:21
Wirth程度には有名だよね。
Steeleのことを萩谷先生が天才と言ってたような気が。
164デフォルトの名無しさん:02/01/07 02:58
http://www.amazon.co.jp/exec/obidos/search-handle-url/index=books-jp&rank=+salesrank&field-keywords=Scheme&bq=1/ref=sr_aps_allb__/250-7214469-6555423
アマゾン japan で Scheme と入れて検索。
5件ヒット。
そのうち、4件は入手不可で、実質一つしか選択肢が無い。泣き笑
165デフォルトの名無しさん:02/01/07 03:05
>>164
1.プログラミング言語SCHEME
 R.ケント ディヴィグ (著), その他 単行本 (2000/05/01) ピアソン・エデュケーション
↑これね。今時めずらしい本、と思っていたら、他はほとんど入手不可なんだ...

(中略)
4.FD ソフトウェアライブラリ Scheme
 湯浅 太
    〜〜ふとしってだれだぁ? 太一せんせーか(笑)
166デフォルトの名無しさん:02/01/07 03:19
167デフォルトの名無しさん:02/01/07 03:51
どうして入手不可なんだろぅ...
>>167
『入門SCHEME』は絶版らしい。
いまは著者のページで公開されてるよ。
170デフォルトの名無しさん:02/01/07 20:01
おばかな >>435 はほっておくとして、、、

高階関数 と 高階論理 の (類似性) を
誰か説明してくませんか?
>>170
http://pc.2ch.net/test/read.cgi/tech/1007387924/
もしかして、ここに書きたかった?
172デフォルトの名無しさん:02/01/07 21:06
うはっ。。直リン禁止。
http://www.honya-town.co.jp/ で、↓サテライトトップページへ↓から
「Scheme」で検索。
174:02/01/07 23:30
どなたか、Gauche を cygwin 環境で使っているひといませんか?
↑前にソース落としてビルドを試みたけど結局失敗
その後chezの存在を知り今に至る(藁
176デフォルトの名無しさん:02/01/07 23:36
>>172-173
ありがとうございます。
177:02/01/07 23:57
>175
ふむー、chez ってマルチバイト文字対応はいかがですか?
178not 175:02/01/08 00:22
> (display "表表表表")
_
↑うまくいきません。
> (display "あいうえお")
あいうえお>
     ↑これはプロンプト
>>177
7ビットで切ってあるという事は無いようですけど、Shift-jisの問題が……。
179:02/01/08 00:40
>178
ありがとうございます。
そうですか、やはりマルチバイトは……
>>178
一応(display "表\表\表\表\")で回避。
>>180
そりゃちょっと厳しい。2バイト目が「\」の字なんて「表」以外知りませんから……。
工夫が必要か。
>>162
Wirthの方が有名だし権威だろ。
比較の対象がちがってないか?
183Steele <:02/01/08 22:36
>>182 スレ違いで恐縮だが


「さよならファインマン」ちう本に写真が載ってて、

中央には椅子に座った、冗談物理学者のファインマン先生、
その横に立って談笑しているのは、数式処理ソフトMathematicaのウルフラム氏が、
背景には、シンキング・マシン社の超並列コンピュータ CM-1 (by ダニエル・ヒルズ)
が写っていた。従って、

  ファインマン > ウルフラム > ダニエル・ヒルズ > Guy Steele

  量子電磁気学 > 数式処理ソフト > 超並列機 > プログラム言語

なのは確か。
   
184デフォルトの名無しさん:02/01/09 00:30
これ、メチャクチャワロタ
【オカルト】   λ..........トボトボ
http://curry.2ch.net/test/read.cgi/occult/1010105764/l50
185デフォルトの名無しさん:02/01/09 00:41
>>181
SJIS駄目ならEUC使えば?
186181:02/01/09 00:48
>>185
で、表示の時には変換?
……それが楽そうです。
187すたすた:02/01/09 11:30
lisp 系の言語をつかっていて(正確には最近 emacs をゴリゴリカスタマイズしたいと思って勉強し始めて)おもったんですが、
括弧が激しく入れ子になるのをみてるとなんか forth のようなスタックマシンを連想します。
コンピュータサイエンス的に見て、この感覚って、あってます?
あんまり学問の人じゃないんで、感覚で、としか言えないんですが…
188名無しさん@Emacs:02/01/09 12:15
http://www.amazon.co.jp/exec/obidos/ASIN/4756118054/qid=1010545785/sr=1-5/ref=sr_1_0_5/250-8508605-3661811
アスキーの青い本は Info で読める elisp-manual を訳しただけのものだって
読んだ気がするけど本当?買おうにも近くの本屋に置いてないし。
Info で読めるなら買うの迷うんだけど。
>>187
あってません。
>>188
あれはFSFへの募金と思って購入するものです。
>>182>>183

訳分かんね…
>>190
ということはやっぱり elisp-manual と中身はいっしょなんですね?
日本語版読んだけどあんまり分からないから買うのやめよかな(w
とりあえず立読みするために本屋探します。
193192:02/01/09 14:57
前ちょっと本読んだら対応する括弧に飛ぶ関数が書いてあったような気がする
んだけど Info 見てもそれらしいのがないな。どの辺にある?
194すたすた:02/01/09 16:16
>189
そうでしたか。
なんとなくスタックにリストが積まれていってるような気がしたものですから。
>>194
Lispでいうリストは連結リスト(linked list)ですから、
スタックには積みません。
car、cdr、consの仕組みを学べば、すぐにわかることです
(というかLispの基本中の基本です)。
>>193
何をしたいの? カーソルを一番内側のかっこの先頭に移動させたいとか?
あるいは、カーソルの直前にある閉じかっこに対応するかっこの先頭に移動したいとか?
いずれにせよ、search-backword-regexpを使えば一発だと思えますが。
197182:02/01/09 17:43
>>191
おいおい、183が分からないとしても、
182は分かるだろ
Wirthの方が有名だってことだよ。
それ以外のことは云ってないぞ。
>>197
> Wirthの方が有名だってことだよ。
> それ以外のことは云ってないぞ。

比較の対象(>>182)違わないでしょ。
プログラミング言語の実際的なことが中心の人でしょ、両方。
Oberonのタイプシステムの研究に相当するようなやや理論的なこと、Steeleはやってないけど。

それにWirthが圧倒的により有名なのは、昔の話でしょ。
199デフォルトの名無しさん:02/01/09 19:09
>>196
>カーソルの直前にある閉じかっこに対応するかっこの先頭に移動したい
って isearch-backward-regexp(?) でできます?
>195
リストを構成する要素の順番を逆転してみれば、
>194 の感覚もあながち完全な間違いとはいえないかもね。
でもそれはすでに lisp とはいわないかも。
201デフォルトの名無しさん:02/01/09 21:23
>>199
backward-sexp でどう?
>>200
linked listがメモリ上でどう表現されるか知っててそういう発言?
204アホにアホレス:02/01/09 23:59
>>183
feynman が死んだのは 1988年。
mathematica が世に出たのも同じ頃。

wolfram が feynman と談笑してたのは mathematica がすごいのでなく
wolfram がすごかったからです。

参考URI:
http://www.apple.co.jp/solution/education/hed/success/mathmobile/
>202
スタックって双方向リンクリストで実現できるかなーと。
>>205
スタックってFILOでしょ。トップ以外をポイントできないじゃんよ。
リストは任意の要素をポイントできるでしょ?
>>205
双方向でなくてもええんちゃう?
ちなみにスタック2つあれば、リストも表現できるよ。
208デフォルトの名無しさん:02/01/10 21:42
lispのputpropを
common lispに移植してください。
おながいします。
>>204
WolframってCaltechだったんだー。ひょっとして
Feynmanのアドバイジーなんじゃないの?
Hillsは、たしか「さようなら[...]」にFeynmanが
TMIに首突っ込んだ話をHills自身が書いてた気がする。

まぁ、183はアホだけど。
>>208
putpropって何?つーかどのlisp?
put/getみたいなもん?
スタックはトップから相対アクセスできてこそ使い物になると思うんだが、どうか。
212デフォルトの名無しさん:02/01/10 22:40
>>208です。

>>210
Lisp1.5です。


http://www.hucom.tp.titech.ac.jp/class/lisp/4th.html
にあった、

(defun putprop (var value attribute)
(setf (get var attribute) value))

をコピペして解決したふりしました。
213デフォルトの名無しさん:02/01/10 22:52
183ですが何か?

s/電磁気/麻雀/
214デフォルトの名無しさん:02/01/11 09:26
Gauche,やっとFreeBSDでまともにビルドできたーよ。
なかなかよいので age

http://www.shiro.dreamhost.com/scheme/gauche/index-j.html
>>211
え? pushとpopしかできないのがスタックなんじゃないの?
216 :02/01/11 15:23
質問:
CLISPでUnicode対応でcatを作ろうとしたんだけど、
日本語コードが入ってるとエラーがでるんだが、ここらへん詳しい人いないかな?
質問の意味がまったくわかりません。
catは標準入力を標準出力に書き出すコマンドでしょ?
Unicode対応もクソもないと思うのだが。
>216
catならCで作った方がいいだろ。
219216:02/01/11 21:36
説明不十分で申し訳ない。この場合はファイルを入力して、単に表示するだけ。
> (cat "hoge.txt") ;; hoge.txt は Unicode ファイル

やはり、open()で :external-format とか指定するのかな?
220216:02/01/11 21:38
いちお、ソース

(defun cat (fname)
(let
((istream (open (make-pathname :name fname)
:direction :input
:if-does-not-exist nil)))
(when istream
(do
((line (read-line istream nil 'eof) (read-line istream nil 'eof)))
((eql line 'eof) t)
(format t "~A~%" line)
)
(close istream)
)
)
)
221デフォルトの名無しさん:02/01/12 02:08
うーん、やっぱカッコたくさん書くの面倒くさいな。
特に一時変数作るのに(let((..)))や((lambda(..)))とか記述量が多い。
なんとかしてくらさい。
>>221
気のせいれす。
223デフォルトの名無しさん:02/01/12 09:02
こんな感じのマクロ誰か作って
(var 変数1 値1
var 変数2 値2
...
式1
var 変数3 値3
式2
...
)

展開するとこんな感じになるやつ
(let* ((変数1 値1)(変数2 値2))
式1 ;式1は変数1〜2が使える
(let ((変数3 値3))
式2)) ;式2は変数1〜3が使える

最初のvar以降はキーワード。
varが置かれた場所は以下の書式が適用される。
var <変数名> <初期化式>
C++の様に、varはブロックの途中からでも変数宣言できる。
>>215
アセンブラのSP+nとかBP+nの様なことだと思われ。
225デフォルトの名無しさん:02/01/12 09:43
>>223
(try
  <try-sequence>
 finally
  <finally-sequence>)

(unwind-protect
 (begin try-sequence...)
 (begin finally-sequence))
みたいなのもあるといいな
これぐらいはすぐ組めそうだけど。
>224
いつのまにかデータ構造の話になっているようだけど。
最初に >187 が受けた印象や >200 の逝っていることは、
リストの評価はは主記憶に保持されている各リストたちへのポインタを
スタック push, pop しながら進行する、ということなのだとオモワレ。

リストへのポインタを push, pop しながら動作するスタックマシン、これでいいんじゃないの?

あと、>211 が逝ってる(そして >215 が突っ込んで >224 がフォローしてる)スタックはアセンブラレベルで見ての話ね。
C 言語の関数呼び出しのときなんか、引数+戻り先PCをひとまとまりでかんがえたら >215 が正しくて(そしてスタックの定義から言えばこちらが正しい)、
積まれた複数の引数のそれぞれにアクセスする必要があることを考えれば >211 が正しい。
Lisp に関係ないので sage。
227デフォルトの名無しさん:02/01/12 15:47
>>223
頭の体操がてらに作ってみた。schemeだけど。
(連続let->let*変換はしてない。)

(define (var-expand l)
  (if (and (pair? (cdr l)) (symbol? (cadr l)) (pair? (cddr l)))
    `(let ((,(cadr l) ,(caddr l))) ,@(var-sequence-expand (cdddr l)))
    (error "syntax : var <name> <value>" l)))

(define (var-sequence-expand l)
  (let loop ((x l) (r '()))
    (if (pair? x)
      (if (eq? (car x) 'var)
          (append (reverse r) (list (var-expand x)))
          (loop (cdr x) (cons (car x) r)))
      (reverse r))))

(define-macro (var . l)
  (var-expand (cons 'var l)))
228デフォルトの名無しさん:02/01/12 15:48

;test
(var putl (lambda l (for-each display l) (newline) #t)
  var a 1 (putl a)
  var b 2 (putl b)
  var c 3 (putl c)
  (putl (+ a b c))
  var d (+ a b c)
  d
)
1
2
3
6
=>6
229デフォルトの名無しさん:02/01/12 15:51
>>228の式を展開するとこうなるはず。
(let ((putl (lambda l (for-each display l) (newline) #t)))
  (let ((a 1))
    (putl a)
    (let ((b 2))
      (putl b)
      (let ((c 3))
        (putl c)
        (putl (+ a b c))
        (let ((d (+ a b c))) d)))))
>>220
コンソールはUnicodeを表示できるコンソールなの?
僕の知る限り、Unicodeを表示できるコンソールって、
Mule-UCSをインストールしたEmacsのShellモードくらい
なのだけれど。
231デフォルトの名無しさん:02/01/12 18:58
>230
コンソールとは限らないだろ
232216:02/01/12 19:54
その前に read-line() 自体が UCS-2 に対応しているかどうかも不明です。
UNICODE から MBCS への変換関数とか知らないですか?
もしないなら、バイナリオープンして自前で実装するしかないのかな >> 230, 231
233216:02/01/12 20:00
補足:
Cで言うところの fgetws() と wctomb() みたいたもの LISP にないかな?
234デフォルトの名無しさん:02/01/12 20:39
>>225
(define (try-expand l)
  (let loop ((x l) (r '()))
    (if (pair? x)
        (if (eq? (car x) 'finally)
          `(unwind-protect (begin ,@(reverse r)) (begin ,@(cdr x)))
          (loop (cdr x) (cons (car x) r)))
      (error "syntax : try [<try-sequence>] finally [<finally-sequence>]" l)
      )))
(define-macro (try . l)
  (try-expand l))
>>233
だからさ、8bitストリームを読み込んで8bitストリームに書き出せば
いいだけじゃないの? catなんでしょ?

文字単位で何かの処理をするわけじゃないんだから、wcstomb()なんか
何に使うのよ。
UCS-2だったら、16bitの固定長だよね。
いよいよwcstomb()なんか要らないと思うけど。
237216:02/01/12 23:02
read-line 自体が 0x0D 0x00 0x0A 0x00 (改行)を認識できるわけ? >> 236
それから 8bitストリームにしても Unicode 文字を出力するわけだから
プリント関数自体が ワイドバージョンじゃないとまずいじゃないの? >> 235
238デフォルトの名無しさん:02/01/12 23:05
>>227の連続let->let*変換plus版
(define (var-expand l)
  (let loop ((x l)(a '()))
    (if (and (pair? x) (eq? (car x) 'var))
      (if (and (pair? (cdr x)) (symbol? (cadr x)) (pair? (cddr x)))
        (loop (cdddr x) (cons (list (cadr x) (caddr x)) a))
        (error "syntax : var <name> <value>" l))
      `(,(if (pair? (cdr a)) 'let* 'let) ,(reverse a) ,@(var-sequence-expand x))
      )))
239デフォルトの名無しさん:02/01/12 23:05
>>228のtest展開結果
(let* ((putl (lambda l (for-each display l) (newline) #t))
       (a 1))
  (putl a)
  (let ((b 2))
    (putl b)
    (let ((c 3))
      (putl c)
      (putl (+ a b c))
      (let ((d (+ a b c))) d))))
240223:02/01/13 00:03
>>227は神!
ホントに作ってくれる人が現れるとは...
感謝!
カッコを減らす試みつーのはなかなか面白いもんだね
242デフォルトの名無しさん:02/01/13 22:26
最近知ったんだけど、
=>
の使い方をおしえてください
243デフォルトの名無しさん:02/01/14 00:26
condで使うんじゃないの?>242
244デフォルトの名無しさん:02/01/14 00:54
今日はじめてSICPの日本語訳を読んだ。
あまりの訳の下手さに絶句した。
あのクソ訳に4000円も払う「まぬけX」「金持ちO」がいると考えると「笑えてX」「畏敬の念が湧き上がってきたO」
気の利いた大学生の方がもっとよっぽど良い訳をすると思われ。
少なくとも、あのレベルでは、翻訳事務所のトライアルも通らないのは確実。
245デフォルトの名無しさん:02/01/14 01:24
同意。なんとかしてくれ>244
(define (call/fopen filename mode proc)
 (var fp (fopen filename mode)
  (and fp
   (try (proc fp)
    finally (fclose fp)))))
悪くないかも
247デフォルトの名無しさん:02/01/14 08:23
>>244
でも技術系の翻訳って難しいよね.日本語として流暢な訳にしてしまうと,
「原文とは違う表現だ,これは誤訳だ」と言って騒ぐ人も多いし.
一字一句逐語的につき合わせができないと,訳が間違ってると思ってるみたい.
もともとそんなことできないのに,違う言語なんだから.
>247
原書で読めってことだね。
>>244
I am MANUKE! HA!(T_T)
250249:02/01/14 10:50
> MANUKE
a MANUKE
>>237
何が問題なのかわからないので、自分でもCLISPをインストールしてみるわ。

# プリント関数がワイドバージョンじゃないと困るとはまったく思えないん
# だけどね。
SICP は web で原文が公開されているから,
意味がよくわからない所は原文にあたると
すんなりわかったりする.

かといって全部原文で読むよりはやはり日本語の方が
わかりやすいんだよな.
253デフォルトの名無しさん:02/01/14 12:58
リストのなかの最大値を探すのはこれでいいの?

(define (max-value lst)
 (do ((max-v 0)
    (cur-v 0))
   ((null? lst) max-v)
  (set! cur-v (car lst))
  (if (and (number? cur-v) (> cur-v max-v))
    (set! max-v cur-v))
  (set! lst (cdr lst))))
>>253
lispは使ったことあんま無いけど、それって

(length lst)が2なら大きい方を返す
じゃなかったら (car lst) と (max-value (cdr lst)) の大きいほうを返す

の再帰で短くなんない?
255デフォルトの名無しさん:02/01/14 14:12
改訂しました。

(define (max-value lst)
 (case (length lst)
  ((0) 0)
  ((1) (first lst))
  ((2) (max (first lst) (second lst)))
  (else (max (first lst) (max-value (cdr lst))))))
256デフォルトの名無しさん:02/01/14 14:17
(apply max lst)
>>255
与えられたリストが空の場合、0が帰るのでいいの?
候補がないんだから、最大値は得られるべきではないのでは?
>>37
Cでcatを実装するとして、ワイド文字が必要とか思ってたりしませんよね?
>258
cat だからね。 wc じゃないからね。
単純にバイトごとに読んで書く、これでいいんじゃないの?
CLISPコンパイル中。時間かかるねえ。イヤになっちゃうよ。
>260
バイナリ拾ってくれば?
262デフォルトの名無しさん:02/01/14 16:17
ためしてみたけど、日本語は問題ない。
ただ、cygwin上では改行コードのところで動作がおかしい。
UCS-2の場合、CRは\0\r、LFは\0\nになるんで、そこがダメだ。
cygwinの場合、改行コードの扱いをUNIX互換にするために操作するので、
そこでうまくいかなくなる。UTF-8なら、期待通り問題はない。
でも、この問題はcygwin特有の問題だよな。
バイナリストリームを利用すれば問題ないよ。
ちなみにformatではなくwrite-lineを使った。
失礼。
CLISPの拡張機能で文字のエンコーディングや改行コード問題は全然解決できるわ。
UCS-2からSHIFT-JISの変換とか、最初から持ってるじゃん。
265デフォルトの名無しさん:02/01/14 20:53
>263
(cygwinじゃない)windowsバイナリあるみたいだけど。
たぶん、216氏は
(cat "hoge.txt")
としたら、hoge.txtの中身を画面に表示する機能がほしいんだと思うんだ。
でもって、通常、画面表示を担当しているコンソールはSHIFT-JISなり、
EUC-JPなりじゃないと表示できない。だからUCS-2なファイルだったら、
変換しないと文字化けしたり、エラーになったりする。
で、以下がそれなりの答え。めちゃめちゃ効率悪いですが、とりあえず
動きはします。Common Lispを触ったの今日が始めてので許してちょ。

(defun cat (fname)
  (let
      ((istream (open (make-pathname :name fname)
                      :direction :input
                      :element-type 'unsigned-byte
                      :if-does-not-exist nil))
       (byte-list '())
       (iencoding (ext:make-encoding :charset "UCS-2"))
       (oencoding (ext:make-encoding :charset "SHIFT-JIS")))
    (when istream
      (do
          ((byte (read-byte istream nil 'eof)
                 (read-byte istream nil 'eof)))
          ((eql byte 'eof) t)
        (setq byte-list (cons byte byte-list)))
      (close istream))
    (mapcar
     #'(lambda (x) (princ (coerce x 'character)))
     (coerce (ext:convert-string-to-bytes
              (ext:convert-string-from-bytes
               (coerce (reverse byte-list) 'vector)
               iencoding)
              oencoding) 'list))
    ))
267216:02/01/14 23:07
ご協力感謝します。早速動かして見ます。>> 266氏

疑問なんだが、C で Win32 API で WriteConsoleW()で UNICODE 文字を引数に
してきちんと出力できるのは API 内で UCS-2 -> S-JIS 変換してるのかな?
268デフォルトの名無しさん:02/01/14 23:42
Win の Scheme で日本語 OK なのって無いですよね?
Win の Scheme で日本語 OK なのって無いですよね?
Win の Scheme で日本語 OK なのって無いですよね?
Win の Scheme で日本語 OK なのって無いですよね?
Win の Scheme で日本語 OK なのって無いですよね?

あったら教えて下さい。
>>268
Chez&EUC
>>269
ありがとう、っておい!

# 御免なさい。つい興奮してしまいました。
# Win/Scheme のお手軽日本語環境なんぞ無いって事で良いですか?
>>270
Kawaはどうですか?
>>271
ありがとうございます。
Java VM で Unicode が使えるという事ですよね。
今 ftp からゲット中です。

;; Gauche が Cygwin で使えたら・・・
273デフォルトの名無しさん:02/01/15 00:23
>272
> ;; Gauche が Cygwin で使えたら・・・
同意………
今後に期待age
274デフォルトの名無しさん:02/01/15 00:26
>272
>;; Gauche が Cygwin で使えたら・・・
でもさ、無理やりコンパイルすればつかえるようにならないかな?
gcの辺りがネックっぽいね。
暇ができたら試してみるよ。
>271
kawaいいかもね
一応.
cat っていうのは文字コードとは関係ないものですよね.
ファイルのバイナリのシーケンスをただ標準出力にはき出すだけの.
>>276
同意。>>266はcatではなく、display-fileとでもすべきだね。
ついでにエンコーディングは引数として与えるべき。

(display-file "hoge" (ext:make-encoding :charset "UCS-2"))

こんな感じに使うわけよ。エンコーディングを省略したときは、
デフォルトとして変数display-file-default-encodingの値を参照する
としておけば、

(setq display-file-default (ext:make-encoding :charset "UCS-2"))

としてから、

(display-file "hoge.txt")

みたいに使えるから。
278デフォルトの名無しさん:02/01/15 01:08
Guile Emacsってどう? 日本語通る?
279デフォルトの名無しさん:02/01/15 01:10
kawa なんだけど、DOS consoleへ の表示がおかしくない?
リアルタイムで表示されない。
280デフォルトの名無しさん:02/01/15 01:22
>279
そうなんだよね。
対話的に使いたいときはGUI版を使いなさい。
コンソール版はファイルに書いたコードを実行するときに使うなり。
JEmacs...遅そうだけど、面白そう。
Cygwin で Gauche インストール完了。

configure, make, make install だけで何やらちゃんと動いている模様。
DOS 窓から直接日本語の入力は出来なかった。

make test しなかったけど、とりあえずと言う事で。
Lisp = 某開発者の気まぐれ言語
・・・まぁ使えるんなら出自などどーでも良いのかも知れソが
やや鬱
>>282
NT系OSなら日本語入力できるんじゃない?
285デフォルトの名無しさん:02/01/15 02:50
>>268
clispが日本語つかえるんだったら、
pseudo-scheme試してみるとか。
・・・まどろっこしすぎるか。
>>283
ほらそこ!negativeな発言すんな!(w
つくりが単純なのは十分なメリットだぞ
287268, 282, etc.:02/01/15 03:13
>>284
Me なんですよ。Linux 入れようかなと思っていた所でした。

>>285
とりあえずファイルに書いたコードを実行する分には日本語が使える
ようになったので、しばらくこれで逝きます。

(display "表表表表") も OK でした(当然か・・・)。
実はこれが初めての Scheme です。
288デフォルトの名無しさん:02/01/15 13:42
記号って、名前だけなの?
値なし?

強引に宣言するなら、
int foo = 1;
symbol bar;
ってことなのかな・・・。
記号に値を束縛することはできますが、それが何か?
290デフォルトの名無しさん:02/01/15 19:32
>>283
> Lisp = 某開発者の気まぐれ言語

当時はFORTRANのリスト処理ライブラリがたくさんあった。
Lispの源はその中の一つで、他のライブラリの影響も受けて発展した。
一人の気まぐれじゃないよ。
291デフォルトの名無しさん:02/01/15 19:39
>290
Lisp と C++ とアセンブラぜんぶてばなせない。
まぁアセンブラはいいとして Lisp と C++ ケコーンしたプログラム書きたい。
Gauche てのはいいですか?
292290:02/01/15 22:18
なんで御指名なんか分からんが、SWIG/guile/libguileもなかなかいいよ。

source取得してexampleでも見てね。
Debianなら、apt-get install swig-examples libguile6-devだな。
293デフォルトの名無しさん:02/01/15 22:27
>292
> なんで御指名なんか分からんが、
なんとなく(笑

Debian なんで、apt-get します。
294 :02/01/15 22:46
Common LispからPostgresSQL使いたいんだけど、
Implementation何使ったらいいの。情報求む。
むーん。>>266はバイナリ版だとうまく動かない。
どうもコンソールがCP932対応と決めうちされている。
日本語版のVisualC++かBCCでコンパイルしたバイナリ
があればいいんだが……。

# cygwinでソースからコンパイルしたので間に合ってはいるけれど。
# 他人に勧めるのはバイナリ版のが楽なんだがなあ。
296デフォルトの名無しさん:02/01/15 23:09
297290:02/01/15 23:22
>>293
> なんとなく(笑

あっそ。ま、俺もC++マンセーなんでいいや。

>>294
Debian使いですか(w
http://ww.telent.net/cliki/Debianにあるapt-lineを入れて
apt-get intall uncommonsql-postgresql
298デフォルトの名無しさん:02/01/16 05:43
ttp://village.infoweb.ne.jp/~fwhw5892/cygwin/index1.html

Cygwin で guile の make に成功している人がいました。
patch も公開して下さっているようです。
299デフォルトの名無しさん:02/01/16 06:33
guile の make 失敗。

>tarball の解凍でエラー; and-let*.scm というファイル
>(アスタリスクを持ったファイル) を含むため。

これって何とかならんのかね。
300デフォルトの名無しさん:02/01/16 08:43
win版のguileって無かった?
301デフォルトの名無しさん:02/01/16 08:45
つーか手元にguile-1.4.zipてファイルがあるんで間違いはないかと
302デフォルトの名無しさん:02/01/16 17:05
>>tarball の解凍でエラー; and-let*.scm というファイル
>>(アスタリスクを持ったファイル) を含むため。
>
>これって何とかならんのかね。
既に,CVSの方ではand-let-star.scmになってたと思う.
次のリリースくらいには直ってるんじゃない?
303デフォルトの名無しさん:02/01/16 21:06
状態の保存/復帰ができるlisp or scheme処理系ってない?
304デフォルトの名無しさん:02/01/16 21:13
あ、状態の保存/復帰というのは、インタプリタを終了したら、
そのときの状態をファイルに書き出しておいて、次回起動したら
そのファイルを読みこんで高速に復帰できるという意味です。
transcriptについて言っているのなら、みんな持っているんじゃないの?
306デフォルトの名無しさん:02/01/17 05:03
guile って Mingw 版もあるのね。バイナリ落ちてたよ。
ところでこれって単体で GUI は作れないのでしょうか?
307デフォルトの名無しさん:02/01/17 05:08
>>303
smalltalk の image ファイルみたいなのかな?
Python で言うと pickle 見たいな関数が欲しいんだよね??
308デフォルトの名無しさん:02/01/17 06:29
おい、最新の情報処理学会論文誌にTAOが乗ってるぞ!
bitで連載してたころからもう15年近くたってるんだけど…。
309デフォルトの名無しさん:02/01/17 07:12
guile を組み込んだ win のアプリってあるのか?
というか、そもそも作れんの?
310デフォルトの名無しさん:02/01/17 07:28
>>309
GPLに汚染されるのでは……。
>310
そういう話ではないのでは…。
312303:02/01/17 09:08
>>305
transcriptみたいのじゃなくて、
Object指向で言う、シリアライズや永続化インスタンスの様なものです。
多分>>307さんの言ってるイメージが正しいと思います。
あったら面白い運用ができそうな気がするんですが。
>>312
CLISPの場合、saveinitmem関数でメモリイメージを保存できる。
http://clisp.cons.org/impnotes.html#image

で、起動時に-Mオプションでメモリイメージを保存したファイルを
指定する。

たぶん、これで期待通りだと思うけど。
314303:02/01/17 14:46
>>313
まさにそれです。
ありがとうございます。
315デフォルトの名無しさん:02/01/17 21:26
汚染という用語を使う会社といえば、、、
schemeもう飽きた。C#やろっと
そろそろ春かなあ・・
318デフォルトの名無しさん:02/01/18 01:43
んがとっと
 (んが とっ と)

>>318
これ?
((lambda (x)
(list x (list (quote quote) x)))
(quote
(lambda (x)
(list x (list (quote quote) x)))))
320デフォルトの名無しさん:02/01/18 16:02
'lambdaも長いから記号化できないかなあ
'λだと2バイトだし。
>>320
マクロ定義一発でわ。
322デフォルトの名無しさん:02/01/18 16:14
>321
いや、それはそうなんだけど
quoteの'みたいな、しっくりくる略記号ないかなと。
323デフォルトの名無しさん:02/01/18 16:14
あ、半角キャラクタ文字で
324デフォルトの名無しさん:02/01/18 16:24
意味が通じる範囲で、今は'lam'使ってるんだけど
325デフォルトの名無しさん:02/01/18 18:41
大文字のLなんてどうですかね。
Schemeでは大文字のシンボルを使う慣習はないし。
>326
大文字小文字区別されないんじゃなかった?
guileはそうでもないみたいだけど
lはすでにlistの変数名で良く使うし
((lam x x) 1 2 3)
=>(1 2 3)

329デフォルトの名無しさん:02/01/18 19:18
質問
(list 1 2 3)
=>(1 2 3)

((lambda x x) 1 2 3)
=>(1 2 3)

'(1 2 3)
=>(1 2 3)
は何が違うのでしょうか
330デフォルトの名無しさん:02/01/18 20:15
>>329
値という意味なら同じだけど、評価のステップ数?という意味ならちがうかも。
331デフォルトの名無しさん:02/01/19 01:55
>>313
それだ、自作のschemeに組み込んだけど、確かに起動はめちゃめちゃ
速くなる。これはgc使う処理系にはお勧めかも。
イメージをEXEに結合すればそのまま配布もできそうだしね。
だけど、単純な状態退避/復帰だけでは色々な問題が発生するんだよ。
ファイルや、gcで管理されてないメモリなどの外部リソースのことをちゃんと
考えてやらんと・・・。
suspend前に外部リソース用の復帰用関数を登録して、
resume直後に呼び出す様にして解決したけど。結構しんどいかも。
332デフォルトの名無しさん:02/01/19 03:29
へ?、どうやって保存するの?
>>329
list関数は、各要素を評価した上でリストの要素とする場合に使うよね。
(list
  (car '(1 2 3))
  (car (car '(1 2 3)))
  (car (car (car '(1 2 3)))))

334デフォルトの名無しさん:02/01/20 09:01
誰か、コピーgcを再帰呼び出しやスタック使わないで実装する方法教えてくり
consのcdrはループに出来たんだけど、carがなあ・・
335デフォルトの名無しさん:02/01/20 11:53
Mingw 版の guile で Windows でも日本語入力・処理がばっちり。
GUI が気軽に作ればもっと良いんだけど。
336名無しさん@Emacs:02/01/20 15:13
正規表現などをそなえた、
テキスト処理向きのscheme処理系は何ですか?
337デフォルトの名無しさん:02/01/20 15:29
Gauche は開発者自身がテキスト処理等を手軽に出来るようにという目的で
作成されたそうです。
Guile でも正規表現は扱えたと思います。
日本語が扱える、大抵の Scheme なら可能なのではないでしょうか。
あとはプラットフォーム等の、別の要件によると思います。
338名無しさん@Emacs:02/01/20 16:06
>>336です。
Guileに正規表現あったんですね。regexpさえあれが満足なんです。
参考にした邦訳が古かったのかな。
http://www.kt.rim.or.jp/~kbk/guile/guile_toc.html
>>337 さん どうもありがとうございました。
339デフォルトの名無しさん:02/01/20 16:15
>>338
guile は使った事が無いのですが、ここには
>Guile は正規表現によるパターンマッチングをサポートしている
と書いてありました。

http://www.unixuser.org/~euske/doc/scm-sd7/
340名無しさん@Emacs:02/01/20 17:47
>>336です。今日からguileプログラマになりました。
しかし、作業がはかどりません。
Emacs Lisp の lisp-interaction-mode や describe-function の
ようなものはありませんか? あとシンボル名補間もほしい。


341デフォルトの名無しさん:02/01/20 20:14
>340
Emacsでやってた作業なら、そのままEmacsでやりゃいいじゃん
つーか
>lisp-interaction-mode や describe-function
って何?知らん奴は無視か?
scheme-mode とか使うんでは?
ただ、対話性や補完がどの程度あるのか疑問。
343デフォルトの名無しさん:02/01/20 20:26
素のscheme
対話性:標準入出力以外無し。コマンドをS式で用意してる処理系はあるだろうけど。
補完:無し。
guileはreadline組み込んでるんじゃなかった?
bash程度の補完機能は望めるかと。
GNU kernelはともかくとして、、、
LispMachineみたいなシステム作るんだって逝ってたんだから、
Emacs位は LispMachineやInterLisp並の便利環境 (VBぽいかも)
を揃えて下さい>>rms方面
345デフォルトの名無しさん:02/01/21 00:39
Emacs なら
(setq scheme-program-name "guile")
して M-x run-scheme するといいよ.
346デフォルトの名無しさん:02/01/21 01:42
guileは真のschemeじゃないみたいだけど、
実際それで困ることってあるかな
347デフォルトの名無しさん:02/01/21 03:33
>>340
~/.guile にこう書いています。
補完は tab でしてくれるようです。

(use-modules (ice-9 readline))
(activate-readline)

http://tanaka-www.cs.titech.ac.jp/%7Eeuske/scm/SD0007/index.html

guile の他に regex と readline が必要でした。
348デフォルトの名無しさん:02/01/21 03:42
guileって1.4から上がった?
349名無しさん@Emacs:02/01/21 11:00
>>347 (・∀・)イイ!!
補間も履歴も効いて快適です。

>>346
まじですか! 真ではないのはどこですか?
350デフォルトの名無しさん:02/01/21 12:03
>>348
guile> (begin (write (version))
... (newline))
"1.7.0"
guile>
去年の夏にCVSから取て来たまま。いまどこまで行ってるか確認したらまた来ます。
351デフォルトの名無しさん:02/01/21 16:56
>真のscheme
カコイイ
352名無しさん@Emacs:02/01/21 17:53
Guile Emacs のWeb に行ったら、びっくりするほど便利なもの見つけました。

http://prdownloads.sourceforge.net/gemacs/emacs-guile-0.2.tar.gz

西田さんが作った emacs-guile です。 Guile Emacs ではありません。
scheme-interaction-mode が (・∀・)イイ!!
guile-scheme-mode では M-Tab で補間も効く、これすごすぎ。
353デフォルトの名無しさん:02/01/22 00:11
emacsってWindows環境でつかえるの?
>>353
スレ違いの上に、googleあたりで検索すれば一発の質問だな。
>>353
君には無理だ YO!!
>>353
MeadowかXEmacsだな。http://www.xemacs.org
>>352
(・∀・)イイ!!
358名無しさん@Emacs:02/01/23 13:04
Guile って多言語化の計画ある?
多言語化された scheme ってありますか?
359デフォルトの名無しさん:02/01/24 08:41
>>358
多言語化って何?
unicode使えたら多言語化っていうの?
360デフォルトの名無しさん:02/01/24 09:29
>>359
unicodeと多言語化は、近似値としてはイーコールだろ?
unicode1.0に欠点は多くあるが、unicocdeは存在すること自体に意義がある

気に入らないなら、自分で作れ
>>360
多言語化ってのは色々な意味があるよな。
localeに対応してエラーメッセージが変化するとかな。

Unicodeが使えればいいなら、Kawaがあるし、
Gaucheなんかも英語と日本語に対応しているから多言語ではあるね。
マルチバイト文字を文字として認識するかどうかって話をしてるんなら、
この辺がそうだよ。
362名無しさん@Emacs:02/01/24 12:16
>>358です。
多言語化、言われてみれば曖昧な質問でした。
私が考えていたのは。

正規表現で
"あ.い+う*"

文字定数として
#\あ

が、理想です。
別に同等のことができれば、満足です。


363デフォルトの名無しさん:02/01/24 14:57
>>362
Gauche
364名無しさん@Emacs:02/01/24 15:29
>>348
> guileって1.4から上がった?

>>350
"1.7.0"

本当? 今日のスナップショット見たら、1.5.4だった。
NEWS によると、これからはLinux的Version番号らしく、
奇数の1.5.4は開発版。安定版は偶数の1.4らしい。
365350:02/01/24 21:02
$ pwd
/..(snip)../src/guile-core.unstable-20010824
maru@lahaina$ grep VERSION GUILE-VERSION
GUILE_MAJOR_VERSION=1
GUILE_MINOR_VERSION=7
GUILE_MICRO_VERSION=0
GUILE_VERSION=${GUILE_MAJOR_VERSION}
GUILE_VERSION=${GUILE_VERSION}.${GUILE_MINOR_VERSION}
GUILE_VERSION=${GUILE_VERSION}.${GUILE_MICRO_VERSION}
VERSION=${GUILE_VERSION}
$

こんな感じでした。unstable は自己責任で使うということで。
個人的には guile-hobbit の近況が知りたい也。
366sage:02/01/24 21:05
シマタ id host サラシテシマタヨ(^^;
367デフォルトの名無しさん:02/01/24 23:55
正規表現って、リストに対してもできるの?
368デフォルトの名無しさん:02/01/25 00:05
>>367
文字列を対象としたものでは無理でしょう。
SICP の 4 章の、非決定性計算を参照すると良いと思います。
370デフォルトの名無しさん:02/01/25 08:38
clならsequenceとして同じ様に使えるんじゃない?
371デフォルトの名無しさん:02/01/26 13:41
今仕事上Winなので、とりあえずDrSchemeを落としてみた。
Lispはかじったことがあったけど、微妙に構文が違うんだね。
さて、遊んでみよう。
372デフォルトの名無しさん:02/01/26 15:16

newlisp っていうのがあるが、どうよ。

http://www.newlisp.org/
>>371
一応。
ちゃんとFull Schemeに設定しましたか?
Language->Choose Language
374デフォルトの名無しさん:02/01/27 06:09
それにしてもLispな人たちって、どうして新しい処理系を作りたがるかね。
中途半端な処理系ばっかりではないか。

もっと団結して一つの処理系とその開発環境をつくって欲しいと願うものであるがいかがよ?
>>374
お前は何系ですか?
Lispは実装が簡単だから、自分のやりたいことに特化した実装が
作られるってのはあるよな。

でも、Common LISPの制定作業は「団結して一つの処理系」を作
る作業だったと思うけどね。

開発環境にしたって、金を出せば相当なものが手に入るし。

C言語において「団結して一つの処理系とその開発環境」が
つくられたことってあるのかね、フリーなもので。

# GNU Stepはいつまでたっても完成しないし、
# GNOMEやKDEあたりも、まだまだでしょう。
>>374
Emacsはしっかりした処理系・開発環境だと思われ。
Schemeじゃないけどね。
378デフォルトの名無しさん:02/01/27 15:38
誰かマルチスレッドで scheme 実装,
しかも過去の elisp を全て利用できる
emacs 使ってくれ.
使ってくれ → 作ってくれ
elisp 勉強中なんですが scheme ってそんなにいいの? elisp と具体的にどこ
が違うんですか?
381名無しさん@Emacs:02/01/27 16:41
>>378
> 誰かマルチスレッドで scheme 実装,
> しかも過去の elisp を全て利用できる emacs

Guile はマルチスレッド対応しているようだし、
Guile Emacs は elisp が動作することが前提なので。
Guile Emacs か?
>>380
elispと比較したときのschemeの最大のアドバンテージは、
俺にとってはレキシカルスコーピングだってところだなあ。

elispは名前空間の汚染を避けるためにパッケージ名を変
数名のprefixにしないと仕方ないので、ついつい変数名が
長くなる。その点、schemeはレキシカルスコーピングだか
ら、安心してローカル変数に短い名前を使える。
そこがイイ。

あと末尾再帰を繰り返しとして評価してくれるところか。

elispの場合、本質的には再帰で書ける処理を、実用上の
理由からループで書かないといけないことがあるのがダサ
い。これがschemeだと末尾再帰を繰り返しに最適化して
くれるので、そこもイイ。
383デフォルトの名無しさん:02/01/28 01:00
関数の中で一時的に関数を定義したい時とかに
scheme の方が自然にできるのがいいね.
cl 使えばいろいろ便利にはなるけど.

変数と関数を変に区別しない方が
いろいろすっきり書けるような気がする.
384378:02/01/28 02:26
>>381
Guile Emacs ってどのくらい使えるんかな.
使えるとしても, あんまりマイナー過ぎて
五年後に消えてたりするようなら使うの躊躇するね.
Schemeを知ってから、elispを書いてるときでも
「ここで継続があれば一撃なのに!」とか感じるようになった。

elispに○○がほしい、と思ったことはあまりなかった。
それもそうだ。どんな強力なアイデアでも、その存在を
知らなければ、「この機能が足りない」と考えるわけない。
386名無しさん@Emacs:02/01/28 12:35
>>382
> elispは名前空間の汚染を避けるためにパッケージ名を変
> 数名のprefixにしないと仕方ないので、ついつい変数名が
> 長くなる。その点、schemeはレキシカルスコーピングだか
> ら、安心してローカル変数に短い名前を使える。

間違っていますよ。
>>386
え? elispってダイナミックスコーピングじゃなかったっけ?
ダイナミックスコーピングだよ。でも、だからといってローカル変数に短い名
前を使えないってことになならないんじゃない?
>>388
ダイナミックスコーピングの場合、
ある関数の中から、その関数で定義したローカル変数を
破壊するような別の関数を呼ぶことが可能じゃない?
>>389
それはダイナミックスコーピングなんだから当然。
でも、elispでのプログラミングスタイルでは一時変数を使う場合は必ずletで
束縛してから使うということになってる(バイトコンパイラも警告を出す)から
他の関数を呼び出す際もローカル変数を破壊しないと期待していい。
あくまでもお約束でしかないけど、Emacsの標準ライブラリもそれを前提に短
い名前使いまくりで書かれてるわけだし。
391名無しさん@Emacs:02/01/28 15:36
>>386です。
>>389
なるほど、そういうことですか。
そんな弊害は気が付きませんでした。

しかし、この問題を避けるために局所変数にまでパッケージ名の
prefix を付けるとは完璧主義者ですね。
>>390
そっか。警告出してくれるんだ。
ダイナミックスコーピングだって話を知った瞬間から
警戒しまくってたよ。thanx。
でも、だったらレキシカルスコーピングにしてくれればいいのに。
ダイナミックスコーピングであることを利用しているパッケージが
存在するってことなのかなー。
>>392
警告を出すのはあくまでもバイトコンパイラであって、評価時ではないので気
をつけてね。あと、elintなんてパッケージもあるです。

>>393
(let ((global-variable 'hoge))
(hokano-kansuu))
みたいなのは多用されてる。
395デフォルトの名無しさん:02/01/28 20:25
>>394
elispのletって、schemeのfluid-letみたいなやつだっけ?
大学ノートの裏表紙にー♪
さなえちゃんを書いたのー♪

って、これ何?誤爆?
>>395
ダイナミックスコーピングなんでletはSchemeのfluid-letと同じだと思う。
一つのletでグローバル変数とローカル変数を同時に束縛したりすることも
多いから、そのままレキシカルスコーピングに移行するわけにもいかないのかも。
lexical-letとか新しいspecial formを用意すればいいのかな。
399デフォルトの名無しさん:02/01/29 23:58
>>396=397
ご苦労さま

400デフォルトの名無しさん:02/01/30 01:27
>>376
処理系と仕様を勘違いしている、と一応つっこんでおく。
401デフォルトの名無しさん:02/01/30 02:23
lexical-let って cl にそのままありますよ.
>>397
>fluid
>>401
知らんかった。thanx。
レキシカルスコーピングな defun は無いのかなあ。
404名無しさん@Emacs:02/01/30 10:53
scheme の set! は納得がいかん。

(define x '#(1))

てして、長さ1のベクタへ x をバインドしておきながら、

(set! x '#(1 2))

どうして、そこに長さ2のベクタを代入できるんだ?
その点 string-set! は納得がいく。
set! は cons cell 自体の書き換えだからね。
(define x "hoge")
して、長さ4の文字列に
(set! x "hogehoge")
できるでしょ。

中身を書き換えるのは
vector-set!
406名無しさん@Emacs:02/01/30 12:26
>>404 です。
挙げ足とりですが、scheme では コンスセル は ペア というらしいです。

(define x "hoge")
(set! x "hogehoge")

これができるということは、私としては set! は代入ではなくて、
バインドしているようにしか思えないです。

なんで、4文字しか確保してないのに、8文字も入ちゃうの?
そうか、バインドかー。って感じです。

でも、バインドじゃーないんですよねー。set! は代入なのです。

私の感覚と scheme の相性が悪いのでしょう。
みなさんは scheme を勉強した時、すぐに腑に落ちました?
407 :02/01/30 13:52
408デフォルトの名無しさん:02/01/30 14:00
Lisp1.5で、

(defun func1 nil
 (prog (age)
  (setq age 20)
 ))

(defun func2 nil
 (setq age 30))

ってできるの?

ageはfunc1内ローカル変数だと思うんですけど。
409名無しさん@Emacs:02/01/30 14:21
>>404です。質問の件、理解できました。今思えば何が分かっていなかったのかも
分からない。テキトーにインタプリタで遊んでたら、腑に落ちちゃいました。

>>407
多言語と比較して Lisp で書けば圧倒時に開発期間が短くなるというのは
おおげさだと思う。ライバル会社が機械語で書いていたのなら別ですが。
404=406
じゃないの?
411デフォルトの名無しさん:02/01/30 14:42
>405
>set! は cons cell 自体の書き換えだからね。
はぁ?
412名無しさん@Emacs:02/01/30 14:50
>>410
そうです、404,406,409は私です。

>>411
set-car! set-cdr! の間違いでしょう。
413405:02/01/30 16:05
>>410
>>411
アホなことを書いてました。
set!は代入ですね。
>>409
>多言語と比較して Lisp で書けば圧倒時に開発期間が短くなるというのは
>おおげさだと思う。ライバル会社が機械語で書いていたのなら別ですが。

LISPマトモに使ったことないんだろな。
まぁ日本語も正しく入力できない奴は以下略。
415デフォルトの名無しさん:02/01/30 18:09
>>414
でもやる仕事によると思うよ.
単純なテキスト処理なんかはやっぱり perl の方が楽だよ.
書いて楽しいのは lisp だけど.
>>415
でも機械語と比べるのはどうかなあ。
これだと「LispなんてC/Java/アセンブリ以下だ」と言っているのと同じような気がしますけど。
まあ、それはともかく。
>>409
「なる」ではなく「なった」です。
>>406
> でも、バインドじゃーないんですよねー。set! は代入なのです。
どっちでも良いんじゃないかなあ、と思います。
「既にdefineされた記号に値をバインドし直す」でも「代入」でも、自分がわかればそれで良いのでは?
(勿論、他の人と話が合うようにはすべきですけど)
そんなことに拘っていては、分かるものも分からなくなるかもしれませんよぅ。
もう一つ、揚げ足取り。
> scheme では コンスセル は ペア というらしいです。
この2つは別物では。
リストは「コンスセルの集まり」ですが、「ペアの集まり」とは言わなかったような。
「ペア」はコンスセル単体( '(hoge . fuga)など)のことを指します。多分。
417297:02/01/30 21:42
list?とpair?が別々に用意されていることがデザイナーの意図を示している
と思うね。
(list? '(a . b)) ⇒ #f
(pair? '(a . b)) ⇒ #t

要するにコンスセルの最後がヌルであればlistであり、さもなくばpairだよな。


418417:02/01/30 21:42
スマソ。297ってのは無視して。別のスレでの番号だわ。
419デフォルトの名無しさん:02/01/30 22:02
schemeでSQL使いたいんだけど
良いのないですか?
guileでmysqlとかかね。
なんか日本語も楽に使いたいとか言い出しそうだな。
だったらkawa+JDBCってところかな。
421416:02/01/30 22:21
ペアというのは 「コンスセル、あるいはその集まりであるリスト(なので、空リストは除く)」 リストというのは 「空リスト、単体のコンスセルを除くペア」 みたい。 >>417 list?は「行儀の良いリスト」にだけ#tを返す物なんだそうです(循環リストも#fです)
422421:02/01/30 22:25
改行が消えてる……。
423デフォルトの名無しさん:02/01/30 22:52

















Mozillaで書き込むとタマーに消えますよ
425419:02/01/30 23:04
せめてODBCが使えるやつ無いですか?
JDBCが使えればODBCなんか要らんと思うが...RDBMSは何を使っているの?

; 俺はPetite Chez SchemeからSQL操作専門のRubyスクリプトを呼び出す
; というバカなことを試してみたよ。割といける。標準入力からSQL文を読
; み込んで、標準出力に結果を書くの。
427419:02/01/30 23:33
主に使ってるのはAccessとOracleです。
今までVBでやってた作業をschemeでもやりたいなと思いまして。
428デフォルトの名無しさん:02/01/31 00:17
(define (hanoi n from to spare)
 (if (= n 1) (list (list 'move-disk from 'to to))
  (append
   (hanoi (- n 1) from spare to)
   (hanoi 1 from to spare)
   (hanoi (- n 1) spare to from))))
これって末尾再帰に直せる?
429デフォルトの名無しさん:02/01/31 02:51
>>427
AllegroCLにしなさい。
それで万事解決。
高いんだお。
431名無しさん@Emacs:02/01/31 11:14
>>428 に全角スペースが含まれているのに気付かず、3分悩んだ。
ソースに全角スペース 含めるなや (゚Д゚)ゴルァ
432デフォルトの名無しさん:02/01/31 11:16
>>431
半角スペース2個を全角スペース1個に置換するのは
ソースうpするときの定説でしょ。
半角スペースを&nbsp;に置換するのが定説。
&nbsp;に半角スペースを織り交ぜ
出きるだけ&nbsp;を使わないのが最強。
434test:02/01/31 12:20
&amp;
つ−か誰も428の質問に答えられるやつはいないのか。
おれもわからんけど。
自前でスタック実装すりゃ末尾再帰に直せるだろう。
が、べつに面白くもないのでやってあげない。
>>427
なぜJDBCではダメなの?
あとAccess使ってるならVBで良いんじゃないの。
Accessには論理的な美しさなんかないんだし。

438デフォルトの名無しさん:02/01/31 13:31
だから、AllegroCLにしなさい。
それで万事解決。
439デフォルトの名無しさん:02/01/31 13:53
DrSchemeの.plt形式のファイルってどうやってみるんですか?
440デフォルトの名無しさん:02/01/31 18:44
>>439
念写
441デフォルトの名無しさん:02/01/31 19:23
>>439
伝書鳩
>>439
のろし
443デフォルトの名無しさん:02/01/31 21:59
copy-gcを再帰呼び出し無しでやってる処理系教えて
>>443
copy gc を再帰呼び出しでやってる処理系を教えてくれ。
てか copy gc の利点の一つは gc 時に必要なメモリがコンスタントに押えられる
ところだと思うが。
>>428
Schemeだからする必要ないけど…
>>444
コピーGCて2倍のメモリ使うんじゃないの?
447デフォルトの名無しさん:02/02/01 09:38
最近 Scheme の勉強をしようと思ってどの実装を使おうかなぁと思ってたんですが、guile と gauche を使ってみようかと。
で、僕は Debian GNU/Linux を使ってるんでパッケージを探してみたら guile はあるけど gauche は古いバージョンのやつしかない、と。
で、gauche の最新バージョンを Debian 用にパッケージ化してみました。
で、気づいた。
Scheme を使ったことないやつでも Scheme 処理系のパッケージングができることに。
でもさすがに Scheme 使ったことないやつが作ったパッケージなんて、だれも使いたくないだろうなぁ…(笑
448デフォルトの名無しさん:02/02/01 19:48
>>447
>Scheme 使ったことないやつが

改行の仕方を解らない人が作ったパッケージも
どっちかというと嫌です。
449デフォルトの名無しさん:02/02/01 21:03
>>444
学生とかが作った奴はほとんど再帰呼び出し形式だよ
450デフォルトの名無しさん:02/02/01 21:26
>>448
やらしいつっ込みだなあ。
はっきりいえばいいのに。
452デフォルトの名無しさん:02/02/01 23:04
>>447
>でもさすがに Scheme 使ったことないやつが作ったパッケージなんて、
>だれも使いたくないだろうなぁ
わざわざ言わなきゃいいのに
453パッケージャ:02/02/01 23:08
…次から改行も頑張ります。
あと、今日 Scheme つかったので、
「Scheme 使ったことのあるやつ」になりました。
454デフォルトの名無しさん:02/02/01 23:10
それはそうと、いつか(var〜)マクロ作ってた人、サンクスコ。
かなり書きやすくナタヨ
455パッケージャ:02/02/01 23:33
ちなみに、どこを見て遊んでいるかというと…
ttp://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme.html
456デフォルトの名無しさん:02/02/01 23:47
>>455
sources.list
に何を加えればいいですか?
下さい。
457パッケージャ:02/02/02 00:09
とりあえずパッケージファイルを ftp でもっていって
dpkg -i でインストールしてください。

あと、パッケージの説明文とか空白のままなんですが、
しばらくは気にしないで使っててください。

ftp://infosys.sys.i.kyoto-u.ac.jp/pub/debian/dists/experimental/

の下の

main/binary-all/interpreters/gauche-doc_0.4.12-0.1_all.deb
main/binary-i386/interpreters/gauche_0.4.12-0.1_i386.deb

です。なお、gauhe-doc は texi 形式のドキュメントしか入ってません。
いずれ HTML, PDF 形式に変換したものも入れます。
それまでは Web ページの最新版ドキュメントを見たほうがいいと思います。

ttp://www.shiro.dreamhost.com/scheme/gauche/

他にもいろいろ有用(そうな)パッケージがあるんですが、
それはまた Linux 板の Debian スレでってことで。
458パッケージャ:02/02/02 00:23
あと、C プログラムとリンクさせたりするための
開発環境(ライブラリとヘッダファイル)の場所が
Debian 標準に沿っていません。

たとえばヘッダファイルは

現在 /usr/share/gauche/0.4.12/include/*.h
正しくは /usr/include/gauche/*.h

これはいずれ gauche-dev というパッケージに分離して
Debian 標準にあわせます。

#すみません、age ます
459デフォルトの名無しさん:02/02/02 00:35
LispMe!
460パッケージャ:02/02/02 00:41
>459
って、コレのことですか?
ttp://www.lispme.de/lispme/
461459:02/02/02 01:03
>>460
ですよ。

思いの他サクサク動いて気持ち良いです。
思いついた時にサラサラ書けるのが良いですね。
なにこれ、palmで動くの?
入力はどうしてるんだろう
463デフォルトの名無しさん:02/02/02 01:38
>>425
>せめてODBCが使えるやつ無いですか?
DLL使える処理系ならODBC32.DLLを直接コールするとか。
464459:02/02/02 01:51
>>462
グラフィティで入力して Eval ボタンで実行。
ライブラリはメモ帳アプリからロードします。
Palm の GUI も作れます。
465デフォルトの名無しさん:02/02/02 04:11
Palm で lisp いじれるとは カコイイ!!
467パッケージャ:02/02/02 08:46
>457
Gauche は 0.5.0 が 1/30 付けでリリースされているようです。
昨日見たときにはまだ出てなかったような気がするんですが…
というわけで、近いうちに 0.5.0 も deb パッケージにします。
468パッケージャ:02/02/02 12:51
Gauche 新バージョン 0.5 リリース
ttp://www.shiro.dreamhost.com/scheme/gauche/
につき、Debian 用パッケージを作りました。

ftp://infosys.sys.i.kyoto-u.ac.jp/pub/debian/dists/experimental/

の下の

1)main/binary-all/interpreters/gauche-doc_0.5-0.1_all.deb
2)main/binary-i386/interpreters/gauche_0.5-0.1_i386.deb
3)main/binary-i386/interpreters/gauche-dev_0.5-0.1_i386.deb

です。実行に必要なバイナリ、ドキュメント、開発キット に分けました。
でもドキュメントは Web 上のものが最新です。
さらに開発キットはまだ使ったこと無いです。
というわけで、2) の実行に必要なバイナリだけ dpkg -i でインストールしてください。

なお、Scheme 勉強中につき以下のプログラムしか動作確認してません(笑

#!/usr/bin/gosh
(begin
(display "Hello, World!")
(newline))

でも、 make test で全部のテストをクリアしたので多分大丈夫かと。
いいなpalmでlisp
LXだと速度的につらい
470デフォルトの名無しさん:02/02/02 14:26
俺はLispMeを使ってみたいがためにPalmVx買ったよ(wara
471デフォルトの名無しさん:02/02/02 14:57
Scheme の load に関して、みなさんのやり方を教えてください。

;; fruits は (and apple banana) に、
;; main は (and fruits database weapon) に依存している
(main (fruits apple banana) database (weapon sword))

このような呼出し関係の場合、どう (load FILE) を記述して
いますか? require/provide がある処理系ならそれを使うの
ですが、今回は無い場合と仮定しています。
要は、多重 load を避けたいわけです。

実際に使用している処理系は guile です。
純粋なR5RSだけだと無理ではないか?
Palm で lisp でなくても
超軽量電池長持ちマシンに Emacs でもいいかな.
474デフォルトの名無しさん:02/02/02 18:45
実は LispMe はその名前とは裏腹に Scheme 処理系であるという罠。
ちゃんと末尾再帰もサポートしている。
475デフォルトの名無しさん:02/02/02 19:00
>471
loadを上書きするのが簡単。
(define *load-list* '()) ; ロードしたファイル名を記録
(define load (let ((org load)) ;オリジナル
 (lambda (filename)
  (if (not (memv filename *load-list*))
   (begin
    (push filename *load-list*)
    (org filename))))))
476デフォルトの名無しさん:02/02/02 19:03
(push filename *load-list*)

(set! *load-list* (cons filename *load-list*))
のマクロ。
477471:02/02/02 20:30
>>475
なるほど、その手がありましたか。ありがとうございます。
後はその再定義を util.scm なりに書いて、全スクリプトの頭で
(load "util.scm") しておけば良いですね。
>477
上のloadは2回以上読むとおかしなことになると思うよ。
479デフォルトの名無しさん:02/02/03 10:25
↓これどうですか?
Arc
http://www.paulgraham.com/paulgraham/arc.html

文字列をlistと同一視する機能は便利かも
(CommonLispのsequenceアプローチとは違うみたい)
> (car "abc")
\a
> (cons \a "bc")
"abc"
480デフォルトの名無しさん:02/02/03 11:17
>>479
http://www.paulgraham.com/paulgraham/arcll1.html
・構文に影響しない不要な括弧は省略できる
・記述的な長い名前を使わない(lambda->fnまで行うのはどうかと思うが)
・シンボルの出力が小文字(大文字シンボルは伝統的なLISPの標準)
・文字列操作の強化
・一時変数it(=>の代替え?)
・macroがFirstClassObject(コンパイルどうするの?)

は良い考えだと思う。
でもインデントに依存する様な構文(cond)があるみたいなのが
少し引っかかるのだが。勘違いかも。
暗黙の変数宣言も好き嫌いが分かれる所。
>("abc" 1)
\b
は型同士のみの位置関係(オペレータが存在しない)で定義する総称関数?
(define-generic (<string> s <number> n)
  (string-ref s n))
ttp://www.paulgraham.com/paulgraham/onlisp.html
やた。On Lispついに公開された。
本屋探してもなくってさー。Arcネタと外れてすまん。
483名無しさん@Emacs:02/02/03 15:27
guile 1.5 はえーよ。ってゆうか、1.4 遅いよ。
484 :02/02/03 20:11
Paul Graham の Common Lisp と On Lisp って
具体的にどう違うわけ?
485デフォルトの名無しさん:02/02/03 20:45
>>482
pdf印刷したら400枚・・厚さ5cmになった(w
両面印刷なんてとても手動じゃできん
(トレイに逆向きに並べ替えるだけで大変な手間。)
せめて縮小2段組で印刷できるようにできないのか
486482:02/02/03 21:30
psnup -> distiller じゃダメ?
会社でコソーリ 2pages/sheet の両面印刷してくる予定ですが何か(w
487デフォルトの名無しさん:02/02/03 22:43
質問です
(define (func (a b) c)
 (+ a b c))
(func (1 2) 3)
=>6
ってできませんか?(funcの引数の構造に注目して)
488デフォルトの名無しさん:02/02/03 22:44
なんか日本人の書いたSCHEMEの本で
無料で公開されてるのってどこでしたっけ?
そんなのあるんだ。
せめて名前がわかれば・・・
490デフォルトの名無しさん:02/02/03 22:56
>>484
On Lispまだちゃんと読んでないけど、なんかマクロに力入れてるっぽい。
onlisp.lispのサンプルコードの定義の数
defun 157こ
defmacro 107こ
defvar 6こ
つーわけです。
他にもschemeの末尾再帰や継続について触れていたり、なかなか面白そうです。
491484:02/02/03 23:00
サンクス >> 490
ANSI Common Lisp は本当にできがいい。英語も読みやすいし。
マクロか、呼んでみるか。
492デフォルトの名無しさん:02/02/03 23:02
(OnLisp266ページから)
20.2 Continuation-Passing Macros
Common Lisp doesn’t provide call/cc, but with a little extra effort we can do
the same things as we can in Scheme. This section shows how to use macros to
build continuations in Common Lisp programs. Scheme continuations gave us
two things:
1. The bindings of all variables at the time the continuation was made.
2. The state of the computation—what was going to happen from then on.

CommonLISPのマクロで無理矢理レキシカルクロージャと継続を
エミュレートする試みらしい
494デフォルトの名無しさん:02/02/03 23:39
>493
絶版かあ・・
世知辛い世の中だね。
496マクロ:02/02/04 02:21
>>491
呼んだ?
497デフォルトの名無しさん:02/02/04 03:03
IS LISP ってどうよ?
あれってどんな具合か知ってる人いない?
498デフォルトの名無しさん:02/02/04 21:10
>497
どうよ?って、使ってみてよ。
ソースも公開されてるし。
まあ、一言で言えばCommonLISPのサブセット。
499デフォルトの名無しさん:02/02/04 21:38
>>498
敵はSchemeって感じか?
こいつは流行るのかな?

CLを掃除しただけって言うか、CLとそんなに変わらん気がするが。
ならいままで通りCLが使われてそうな気もする。
ISLISP用の資産、無いし。
500デフォルトの名無しさん:02/02/04 22:13
LISPには変り種の方言がいっぱいあるから、
あまりにも普通っぽいのは埋もれていく運命なのでは・・・
個人的にはarcの思想みたいな密構文マンセー主義な方言が流行って欲しい。
501デフォルトの名無しさん:02/02/04 23:01
よいこのHyperLispあげ
502デフォルトの名無しさん:02/02/05 06:21
Arc が気になるあげ
503デフォルトの名無しさん:02/02/05 07:08
>>499
>>500
湯浅せんせ〜!
こんなことゆってはるひとがいます〜!
こいつらしばきましょう!

ぶぶってばかりないでIS Lispも活動してください!

(ぶぶってむしろ.NET版が欲しい。ぶぶ.NET)
てめーら括弧つけてんじゃねぇ!
Common Lispの練習がてらに
HTML文書をXHTML文書に加工するプログラムを書き始めた。
処理系はGNU Clisp。
とりあえず、大文字のタグを小文字に変換するところまでは
すぐにできた。
エンコーディングを自動判定にしたりとかも「できそうだ」
という感触はあるな。
機能はとにかく沢山あって、
これだけのものを作ったからには
応用事例が大量にあるんだろうな、と思ったよ。

でも、高機能なのはいいけど、やっぱりいろいろウザいねえ。
構文がいろいろあって。
美しさでは圧倒的にSchemeだねえ。
506デフォルトの名無しさん:02/02/06 21:45
schemeで例外機構ってどうやって作るの?
call/cc使うって理屈はわかるんだけど
507デフォルトの名無しさん:02/02/06 22:48
508デフォルトの名無しさん:02/02/07 06:14
Lisp や Scheme での、
オブジェクト指向的なこと(CLOS など)について、
分かりやすく教えてくれる日本語の本や文章ってありますか?
509デフォルトの名無しさん:02/02/07 06:16
Paul Graham『On Lisp』(Prentice Hall)
の日本語訳って出てます?
510デフォルトの名無しさん:02/02/07 06:23
>>509
出てなかったと思うけど・・出るには早すぎないかな、
翻訳が終わってなかろうと言う意味で。

読んでてちょっと思ったのは、
日本語版が出たとしても、SICP第一版の悪夢を再現しそうかなと・・
LISPのしかも入門者向けの本じゃないとなれば、
翻訳者も「安」いだろうからねえ
511デフォルトの名無しさん:02/02/07 06:43
amazon.com によれば、『On Lisp』が出版されたのは、
(September 9, 1993)

ま、原著も絶版らしいんで、
日本語の訳本は存在しない、
ということでいいですか?
512デフォルトの名無しさん:02/02/07 06:53
>>511
え、そんなに古いの?
もしかして私は「最近絶版になった」を誤解してた?
絶版になった本じゃ、売ろうとはしてくれないだろうね。

日本でも次々と絶版だし。
Lisp系の本って一体何冊残ってるんだろう?

オンライン出版とかでもしてもらわないと。
ANSI Common Lisp の翻訳出るみたい
ttp://www.pearsoned.co.jp/washo/nbindex_mar.html
514デフォルトの名無しさん:02/02/07 16:29
>>510
SICP 第一版ということは、
第二版が出てるんですか?
515デフォルトの名無しさん:02/02/07 16:39
SICPの第一版ってそんな訳悪かった?
第二版の方が (訳者は高いだろうに :-)) 悪い訳だった気がするが...

ちなみに第一版って、McGrowhillからでて、絶版になったやつだよね。
516デフォルトの名無しさん:02/02/07 17:55
>>515
幸いにして読んだことないからしらない。
英語の方がましかも、というできだったと聞いてるが。

第二版は大先生が翻訳したので、用語の間違いなどが全改善されてよくなった
・・と聞いてる。

私個人は英語版を読んでる途中のまま(おい
517デフォルトの名無しさん:02/02/07 22:05
>>481
("abc" 1)
=>\b
("abc" 1 #\c)
=>"acc"
(("abc" "def") "ghi")
=>"abcdefghi"
クソ長いオペレータ名書かなくて済むから便利かな?
バグの原因になりそうだが。
518デフォルトの名無しさん:02/02/07 22:28
("abcdef" 0 2) ;substring
=>"bc"
("abcdef" 1 "xyz") ;insert
=>"axyzbcdef"
eval-hookを公開してる処理系なら切り分けできそうだけど、
本来は評価エラーになるはずの部分に埋め込む形だから
処理系自身に手を加えないと難しいかも。
519デフォルトの名無しさん:02/02/08 12:16
SICP読破したよage
520名無しさん@Emacs:02/02/08 14:48
>>519
あれ、楽しい?
めちゃくちゃ つまらんかったんだけど。
521デフォルトの名無しさん:02/02/08 14:53
バカにはつまらないんだよ…

という煽りはやめて,もしSICPがつまらなかったらEoPLをお勧めします.
522デフォルトの名無しさん:02/02/08 18:58
>>521
禿同。2nd editionも出たし。
あとおすすめできるマニアック本はQueinnecのLISPかな?
523デフォルトの名無しさん:02/02/08 20:10
>>521
SICPが面白くないのは、よっぽどできるか、
解ってないかのどちらかだと思われる。
原著のアマゾンでの評価の二極化を思い出されたし。

SICPがつまんなかったひとは、もっと簡単な本をするか、
もしくは薀蓄のある世界に全然興味の無い人ならLisp
なんぞ止めてしまうことを薦める。
524デフォルトの名無しさん:02/02/08 20:56
>>523
よっぽどできる、ってアメリカの大学だとあの本でみんな計算機科学の勉強始めるんだよ。
計算機科学入門、みたいな授業で良く使われてるよ。確かにいい本だと思うけど、あくまで
入門者用って感じじゃないかな。アルゴリズムの授業とかの方が、もっとずっと難しいん
じゃないかな(ずっとためになるけど)。
アメリカの大学がどうかは知らないが、
日本の大学では教科書を理解してる奴はほんの一握りだな。
526デフォルトの名無しさん:02/02/08 21:15
>>524
誤解されて読まれてしまった。

よっぽどできる、というのはですね、
例えばあの本にツッコミを余裕で入れられるくらいの人なら
「つまらない」かもしれないという前置きです。

解ってない、というのはあれでLISPを1から勉強するには
適していないらしい、という過去の書きこみを汲んだものです。
527デフォルトの名無しさん:02/02/08 23:46
また大学の話か。
だって大学でしか使われてないし
529デフォルトの名無しさん:02/02/09 00:09
>521
EoPLって何ですか?
例によってオンラインで読めたりします?
530デフォルトの名無しさん:02/02/09 00:22
531デフォルトの名無しさん:02/02/09 00:45
>>530
つーか目次だけじゃん
532デフォルトの名無しさん:02/02/09 02:54
サーバ名がcurryというのがまたいい
534デフォルトの名無しさん:02/02/09 14:27
ひそかに仕事で使い始めたage
535519:02/02/09 18:28
うおぅ、しばらく来てなかったら、なんか反応がある(^^;

>>520

俺はそこそこ楽しかったかな。

序盤は「ふーん」って程度だった。
MLとかSchemeは普通に知ってたから、
高階関数とかカリー化とか関数オブジェクト
とか見せられても今更、って感じだったし。
むしろS式とかlambda式とかの数学的定義を
あまり表に出さない所とか、
少し好きではなかった気がする。

でもLogicalProgrammingとか、ambとかは
あんまりしらなかったのでとても面白かった。
SQLとかもあまり詳しくなくて、普通に本で
勉強した事がある、程度だったので、
むしろPrologに近い言語である、というのが
わかった時は驚いた(SQL使いには常識なんだろうが)。
コンパイラもストップアンドコピーは組んだ事無かった
ので、そこはなかなか楽しめた。
どうせならストップアンドコピーとマークアンドスイープ
の定量的な比較をシミュレータ使ってやってみる、
ついでにキャッシュ相当の機能も実装してみて、
ヒット率にどう違いがでるか、とかまでやったら
もっと楽しかったと思うが、そこまで要求するのも酷だろう。
Scheme系のインタプリタ組む時はいつもC使っちゃうから、
末尾再帰とか結構面倒な事になるんだけど、
アセンブリだと楽なんだねぇ、とか学んだ事もあった。
題材としてもゲートとかとの関連が見えたり、
HDLとかが裏に見えたり、副作用の無い関数型言語に
ついてのさわりが見られたり、良く選んでるなぁ、と思った。
全部読んだ感想としては、いろいろな事の基礎が学べて
良い本だと思ったよ。
OS関係が全く触れられてない、っていうのは良いのか
悪いのか良くわからん。あれも一つの選択なのかもしれない。
OOPに触れないのは俺は好感が持てたかな。
余談だが、ニュートン法とか大学受験を思いだして、ちょっと笑えた。
台形公式とかも。

ヘネシー&パターソンとどっち読もうか悩んだんだけど、
一応読んどいて良かった、と今は思ってる。

入門書としてはどうかなぁ?とは思う。
何か具体的に作って動かす、という喜びが
あまり感じられない所が入門書としては
良く無いと思ったよ。
勉強にはなるけど、プログラムの楽しさは
わからない気がする。

>>523

いや、つまらん、面白い、ってのは人それぞれなのでは?
別に理解出来て勉強になるレベルでもつまらん、
と思う人もいそうな本だと思うが。
SchemeとかLisp好きな人は好きそうな本だとも思うけど。
536デフォルトの名無しさん:02/02/09 19:15
>>535
> コンパイラもストップアンドコピーは組んだ事無かった
GCとコンパイラ、普通混同するかね…
>>535は、ただの知ってる単語自慢だから、しょーがなよ。
538535:02/02/09 22:33
いや、コンパイラの所でGCが解説されてたからそう
書いただけなんだが、、、
539デフォルトの名無しさん:02/02/10 03:37
Scheme ってなぜ nil に相当するものが #f と () と #<unspecified>
に分かれているのでしょうか?
Lisper としては下のようになるのは気持ち悪い。

CommonLisp: (if (if (< 2 1) 'a) 'b)
NIL
Scheme: (if (if (< 2 1) 'a) 'b)
b
CommonLisp: (if (< 2 1) 'a)
NIL
Scheme: (if (< 2 1) 'a)
#<unspecified>

and を使えばいっしょなんだけど
CommonLisp: (and (and (< 2 1) 'a) 'b)
NIL
Scheme: (and (and (< 2 1) 'a) 'b)
#f
540デフォルトの名無しさん:02/02/10 04:49
>539
schemeでは(if #f 'a)が#<unspecified>なんだから
一致しないのはしょうがないのでは?
本来警告ぐらい出すべき部分だと思うけど。
541539:02/02/10 05:33
>>540
うん、だからなぜ nil に相当するものを #f と #<unspecified>
にわざわざ分けるような仕様にしたのかなと思って。

例えば CommonLisp で

(defun foo (x)
 (and x
    (stringp x)
    (setf x (parse-integer x :junk-allowed t))
    (* x 2)))
(foo "1") ==> 1
(foo "a") ==> NIL

みたいなことがしたいときに、 Scheme だと set! が #<unspecified>
を返すので

(define (foo x)
 (and x
    (string? x)
    (set! x (string->number x))
    (* x 2)))
(foo "1") ==> 1
(foo "a") ==> Error

になってしまうのがちょっと不便だなと思ったわけです。

(define (foo x)
 (and x
    (string? x)
    (set! x (string->number x))
    x
    (* x 2)))

のようにすればいいんですけど。
542デフォルトの名無しさん:02/02/10 05:43
>>541
    (set! x (string->number x)) ;←これはまずいんでは?
    (* x 2)
#<unspecified>が#tと同じかどうかは処理系依存だし。
素直に
(begin (set! x (string->number x)) (* x 2))
とすべき。

あるいはマクロでsetq相当を作っておくのも良いかと。
(macro setq (lambda(l) `(begin (set! ,(cadr l) ,(caddr l)) ,(cadr l))))
543539:02/02/10 06:26
>>542
ごめん、ちょっと例が悪かったみたいなんだけど、
おれが聞きたかったことは
なんでわざわざ #<unspecified> という値(?) を仕様に
導入したの、ということで、

(if (< 2 1) 'a) ==> #f
(define x 1) ==> 1
(set! x 2) ==> 2

みたいな仕様になっていれば >>539>>541 のような
気持ち悪いことが起こらないのに、ということが言い
たかったのです。


> #<unspecified>が#tと同じかどうかは処理系依存だし。

ttp://www.sci.toyama-u.ac.jp/~iwao/Scheme/r5rsj/html/r5rsj.html#SEC59
| Schemeのすべての標準の値の内で、#fだけが条件
| 式の中で偽と判断される。#fを除くSchemeのすべて
| の標準の値は真と判断される。

と書いてあるので #<unspecified> も真なのではないの?
とりあえず手元にある scm-5d4 と kawa-1.6.97 では

(if (define x 1) #t #f) ==> #t

だったよ。
544デフォルトの名無しさん:02/02/10 06:38
>>543
>(if (define x 1) #t #f) ==> #t
なんでこんなヘンなことしようとするの?
#<unspecified>みたいな特別な値を持ってない処理系だと、
例えば#fを返したりする事もありそうだけど?

#<unspecified>を返すって事は、
C言語とかでも見る関数引数の評価順序の様な「未定義の振るまい」
みたいなもんだと思うけど。(そんなのわかってそうだけど、一応)

警告にすりゃいいのを、なんでわざわざ未定義にしたのかは不明。
トレースで簡単に追えるからか、あるいは仕様書を短くしたいだけか。
545539:02/02/10 07:37
>>544
> >(if (define x 1) #t #f) ==> #t
> なんでこんなヘンなことしようとするの?

ただ #<unspecified> が真と評価されるか試してみただけ。
別に #<unspecified> を返す式ならなんでもよかったんだけど。

(define unspecified (if #f #t))
(if unspecified "unspecified は真" "unspecified は偽")
==> "unspecified は真"
俺もよくわからないけど、nilを返すのはまずいんじゃないかって
気がする。なぜって、正当な値としてnilを返すifはありそうじゃない?
nilを返す関数はあるわけだから。
R5RSによればunspecifiedを返すのではなく、何を返すか規定されてい
ないと書いてある。おそらく、本来、代替部alternateを省略できるこ
と自体が不適切なんですよ。SML/NJなんかは実際に省略できないわけだ
し。省略できるように「あえて」してあるのは、特定のケースにだけ副
作用を伴う式を評価し、if式全体の評価結果は使用しないようなケース
のためじゃないかな?

# if式全体の評価結果が必要なのであれば、明示的にalternateを記述
# すればいいだけだし。
547デフォルトの名無しさん:02/02/10 15:10
(if test true)
って副作用のためにあるんじゃないの?
こういうのはシーケンスの途中に置くべきだと思う。
(begin ... (if test true) ...ちゃんとした戻り値)
548デフォルトの名無しさん:02/02/10 15:21
だれか作って!
(try
 ...
 (if test (throw <tag> <result>))
 ...
catch <tag> <throw-result>
 ...
catch-all <tag-result> <throw-result>
 ...
finally
 ...
)
Chez Schemeには例外機構がありますが、それが何か?
どんな例外機構ですか?
551539:02/02/11 02:47
>>546>>547
なるほど。ありがとう。
まだ Scheme いじくりはじめて日が浅いのでいまい
ち実感がわかないけど、

Scheme の仕様に #<unspecified> が入っているのは
副作用を伴う式を明示的に示したいような場合に使う
ため、という感じでよいのかな?

つまり、この手続きは副作用のための手続きなので返
す値はどうでもいいよという場合に、あえて #<unspecified>
を返すことによってその手続きの目的を強調するという
ことかな?

例えば

(display 'hello) ==> #<unspecified> (副作用だから)
いまさらですが、lispインタプリタ作るのでだれかanatomy of lisp売ってください。
5千円くらい出します。
あと、cプログラムブック3も。

おながいします。
553デフォルトの名無しさん:02/02/11 08:45
>>552
ええと、
図書館はご利用なされないのですか?
後者は昔地元の図書館で見かけましたが。
いまさらですが >>552 を消すので、だれか奴のIPを売ってください。
5千円くらい出します。
あと、メールアドレスも。

おながいします。
>>551
僕が調べた限りでは、#<unspecified>というオブジェクトは
R5RSにはありません。仕様では戻り値が決められていない
(未定である)というだけです。
Chez Schemeでは

(if #f 'a)

は#<void>を返します(つまり戻り値がない、ということです)。
また#<void>が返ったときは画面上では何も結果が表示されません。
有意な戻り値がないわけですから、妥当な表現だと思います。

もっとも#<void>もまた、#fではないので

(if (if #f 'a) 'b)

はbを返します。つまり#<unspecified>と同じですね。

> つまり、この手続きは副作用のための手続きなので返
> す値はどうでもいいよという場合に、あえて #<unspecified>
> を返すことによってその手続きの目的を強調するという
> ことかな?

というより、nilは有意な値であるのに対して、#<unspecified>
や#<void>はそうではない、ということでしょう。そういう意味で
は、#<unspecified>や#<void>が#tとして評価されるのは、仕様
上仕方ないけれど、本来は「評価不能」としてエラーになるべきだ
と思う。
556デフォルトの名無しさん:02/02/11 09:29
dynamic-windって、
call-with-current-continuation
しかない環境で(修正や上書きで)実装できますか?
(define (dynamic-wind before thunk after)
 (before)
 〜
 (thunk)
 〜
 (after)
)
afterはCommonLISPのunwind-protectと同じ解釈で良いですよね?
beforeがよくわからない・・・
557デフォルトの名無しさん:02/02/11 09:46
うげぇ、酒のみながら考えてたら気持ち悪くなってきた。
>>556
例えばthunkの中で継承をどこかにset!して、あとでいきなりthunkの中に
戻ってくるとかしたときにやりたい処理を書いておく。

例えばthunkがファイルにアクセスする時、ファイルのオープンをbeforeです
るととつぜん継承を使ってファイルのアクセスコードにジャンプしてもファイ
ルがオープンできる。
そんなの無理に使わなくて良い。
559デフォルトの名無しさん:02/02/11 09:53
#<unspecified>って言葉遊びみたいなものでしょ。
深く考え過ぎ。
値は定められてないって意味で値がunspcifiedだって書いてあるから、
値として#<unspecified>というのを返してるだけ。
別に#fを返そうが'()を返そうがR5RS的には問題ない。
call/ccを再定義しないとできないよ
>>550
手続き: (error シンボル 文字列 オブジェクト ...)
戻り値: 戻らない

errorへの引数はカレントerrorハンドラに渡される(error-handlerを見よ)。
ハンドラが制御を戻してきたら、エラーはリセットされてカレントcafeに戻る。

デフォルトerrorハンドラは引数を説明メッセージをprintするために使う。シ
ンボルはエラーの発生した場所を特定する。状況を説明する文字列はformat文
字列である(formatを見よ)。その他のオブジェクトはformatへの追加引数で
ある。第1引数がシンボルのかわりに#fならば無視される。メッセージを
formatしてprintした後、デフォルトerrorハンドラはerrorの継続を保存し
(debugを見よ)、リセットする。

(define slow-vector-map
 ; an allocation-intensive implementation of vector-map
  (lambda (p v)
  (unless (procedure? p)
  (error 'vector-map "~s is not a procedure" p))
  (unless (vector? v)
  (error 'vector-map "~s is not a vector" v))
  (list->vector (map p (vector->list v)))))


(続き)
パラメータ: error-handler

このパラメータの値は手続きでなければならない。カレントerrorハンドラは
errorによって呼び出され、errorの引数がerrorハンドラに渡される。デフォ
ルトerrorハンドラの解説はerrorを見よ。以下の例はデフォルトerrorハンド
ラの変形(breakを使って直接デバッガを起動させる)をインストールする方
法を示す。

The following example shows how to install a variant of the default
error handler that invokes the debugger directly (using break).


(error-handler
  (lambda (who msg . args)
  (fprintf (console-output-port)
  "~%Error~a: ~a.~%"
  (if who (format " in ~s" who) "")
  (parameterize ([print-level 3] [print-length 6])
  (apply format msg args)))
  (break)))

同じふるまいをする「やっつけ」の対案としては、単にbreakするerrorハンド
ラをセットすることである。

以下のバージョンは非ゼロのエラーステータスでシェルに即脱出する。makeファ
イルからChez Schemeを走らせているときには特に便利である。

(error-handler
  (lambda (who msg . args)
  (fprintf (console-output-port)
  "~%Error~a: ~a.~%"
  (if who (format " in ~s" who) "")
  (parameterize ([print-level 3] [print-length 6])
  (apply format msg args)))
  (abort)))


まあ、つまり、例外処理をしたいときには、まずerror-handlerに
例外を捕捉する手続きをセットしておき、それから処理を開始する。
例外を発生する個所で、errorを使う。errorの引数が
error-handlerに設定された手続きに渡されるからしかるべき処理
をする。これで例外処理は全部できるでしょ。
564556:02/02/11 10:47
>>560
いや、再定義で良いんでヒントだけでも教えて下さい。
やろうとしてることはR4RSな処理系をR5RSに引き上げる様な感じです。
565556:02/02/11 10:59
とりあえず再定義の出だしはこんな感じですよね?
(set! call-with-current-continuation
 (let ((old/cc call-with-current-continuation))
  (lambda (proc)
   〜
   (proc cont) ;継続の引き渡し(contをこれから定義する)
   〜
  )))
566556:02/02/11 11:14
(define (test) (call/cc (lambda (cont)
 (dynamic-wind
  (lambda()(display "before1\n"))
  (lambda()
   (display "thunk1\n")
   (dynamic-wind
    (lambda()(display "before2\n"))
    (lambda() (display "thunk2\n") (cont #t))
    (lambda()(display "after2\n")))
  )
  (lambda()(display "after1\n"))
 ))))

(test)
としたとき、
before1
thunk1
before2
thunk2
after2
after1
=>#t
とならなくてはならない。
567556:02/02/11 11:25
継続の呼び出し
(cont #t)について考える。
呼び出し時、contは
・before1->2についての呼び出しは完了している事を知っている。
・継続切り替え前後にafter2->1を呼び出さなければいけない事を知っている。
よって、cont毎にスタックの様な形式でbefore/after呼び出し履歴が必要。
568556:02/02/11 11:39
現在いる継続中に複数の継続の参照がある場合、
cont毎にbefore/afterを持ち回るとそれらが複数回呼び出される
可能性があるので、どうにかして情報を共有化しなくてはならない。
親継続aの中で取り出された子継続x,yは親継続aを共有する。
(call/cc (lambda(親継続a)
 (call/cc (lambda(子継続x)〜))
 (call/cc (lambda(子継続y)〜))
))
親継続a <- 子継続x
親継続a <- 子継続y
569556:02/02/11 11:46
そこで、現在の(親)継続の参照を保持するグローバル変数を作る。

(define *current-continuation* '())

これはcall/ccで現在の継続が取り出されると、その継続がpushされ、
call/ccから抜けるとpopされる。
*current-continuation*には、old/ccで得た継続、その継続に属する
before/afterがセットで格納される。
570556:02/02/11 11:55
さて、では実際にどうやって実装するか、
を考えてたら頭がパンクしました。
call/ccとdynamic-windの連携が、、、、
(unwind-protectエミュレートの時は、巻き戻しだけなので
結構すんなりうまく行った)
chez scheme附属の文書にそのものずばりが載ってるよ。
572556:02/02/11 23:57
検索したら、なんかあっさり見つかってしまった鬱。
みんな頭いいなあ。
でも考え方としてはだいたい有ってたので良かった。
次はcall-with-valuesかな。
573デフォルトの名無しさん:02/02/13 23:45
call-with-valueは、無理(たしか)。
574デフォルトの名無しさん:02/02/14 08:39
検索したらいくつか(scheme上での)実装がみつかりました。
http://www.accesscom.com/~darius/writings/scheme-for-lispers.html
http://sources.redhat.com/ml/guile/2000-02/msg00303.html
http://www.red-bean.com/guile/guile/new/msg00230.html
どれも完全では無い様で・・
575デフォルトの名無しさん:02/02/15 04:30
ここを参考にオブジェクト指向してみた
http://www.angelfire.com/tx4/cus/shapes/scheme.html
この行数でこれだけのことができるなら
別に OO パッケージなんていらない気がするね

(define (make-str . strs)
 (let ((str (if (null? strs) "" (apply string-append strs)))) ;; member
  ;; methods
  (define (get) str)
  (define (set strs)
   (if (null? strs) #f
     (set! str (apply string-append strs))))
  (define (ref k)
   (and (not (null? k)) (<= 0 (car k)) (< (car k) (string-length str))
      (string-ref str (car k))))
  ;; dispacher
  (lambda params
   (cond ((null? params) (get))
      ((eq? (car params) 'get) (get))
      ((eq? (car params) 'set) (set (cdr params)))
      ((string? (car params)) (set params))
      ((eq? (car params) 'ref) (ref (cdr params)))
      ((number? (car params)) (ref params))))))

(define s (make-str))
 => #<void>
(s 'set "abc")
 => #<void>
(s 'get)
 => "abc"
(s 'ref 1)
 => #\b
(s "ABC")
 => #<void>
(s)
 => "ABC"
(s 1)
 => #\B
576575:02/02/15 04:34
>>575
dispacher → dispatcher
577575:02/02/15 06:39
>>575 を継承

(define (make-upcase-string . strs)
 (let ((super #f)) ;; member
  ;; private method
  (define (string-upcase str)
   (list->string (map char-upcase (string->list str))))
  ;; public methods
  (define (set strs)
   (if (null? strs) #f
     (super 'set (string-upcase (apply string-append strs)))))
  (define (append strs)
   (if (null? strs) #f
     (set (list (apply string-append (super 'get) strs)))))
  ;; constructor
  (set! super (apply make-str strs))
  (super 'set (string-upcase (super 'get)))
  ;; dispatcher
  (lambda params
   (cond ((null? params)       (super 'get))
      ((eq? (car params) 'set)  (set (cdr params)))
      ((string? (car params))   (set params))
      ((eq? (car params) 'append) (append (cdr params)))
      (else            (apply super params))))))

(define s (make-upcase-string))
 => #<void>
(s 'set "abc")
 => #<void>
(s 'get)
 => "ABC"
(s 'append "def")
 => #<void>
(s 'get)
 => "ABCDEF"
(s 'ref 5)
 => #\F
578デフォルトの名無しさん:02/02/16 14:09
「Scheme」を読めないという人、結構いるみたいだね。
おれなんかは古代祐三の曲で一躍有名になったスキームというゲーム
知ってたおかげか、初めから読めたけど。
おれも毎日スキームミルク飲んでたから初めから読めたけど。
580デフォルトの名無しさん:02/02/16 15:41
Schedule読めるならScheme楽勝でしょう
スケジュール
スケム
>>581
スケジュールと柔軟に読めるならそれは詐欺だ
おれなんか最初スチェズレと読んだど?
スケジューるん
"sch"の発音は英語の"sk"より先にドイツ語の"sh"を先に知ってしまったので、ついそう読んでしまう……。
schemeしぇーめ、scheduleしぇじゅーる(中途半端に混じってる)
585デフォルトの名無しさん:02/02/17 00:09
schというシェルがあった気がする
586デフォルトの名無しさん:02/02/17 00:17
東工大の実験はshcemeとprologですが、なにか?
587デフォルトの名無しさん:02/02/17 00:19
shcemeあげ
588デフォルトの名無しさん:02/02/17 00:19
shceme晒しあげ
589デフォルトの名無しさん:02/02/17 01:07
>>585
シェルとして実装した場合、括弧付けないとevalれない点は
どうなんだろうね。
590デフォルトの名無しさん:02/02/17 01:25
Clispをログインシェルとして使うという剛毅な方法が
Clispのページに書かれていたな。たしかに必要なこと
はすべてできるんだけど、正直すげえな、と。
きゃつ等にとって括弧は空気みたいなもんです。
592デフォルトの名無しさん:02/02/17 03:04
lispはイイ!ネ
人類が作った変態言語の極みダヨ
593デフォルトの名無しさん:02/02/17 09:39
Schemeの場合、関数も変数もdefineで定義するし、名前空間も一緒。
Common Lispの場合、関数はdefun、変数はsetqで定義して名前空間も別。

俺はSchemeの流儀の方が好きなんだけど?
名前空間なんて飾りですヨ
エライ人にはそれが判らんのです
595デフォルトの名無しさん:02/02/17 13:18
>>575
#<void>返すところはself返したらいいかもしんない
((obj1 'set (obj2 'get)) 'draw)
んで括弧が見にくいと思ったらコマンド列にしてみるとか。
((make-telnet)
 'open '(host "####" port 23)
 'wait "login: "
 'send "####"
 'wait "Password: "
 'send "####"
 'wait "}%"
 'with-append-open "telnet.log"
)
>>592
はぁ?
お前はアホか?
Lisp なんざ変態言語としてはカスみたいなもんなんだよ。
お前みたいな奴は Brainfuck で HelloWorld でも書いてから出直してこい。
http://www.muppetlabs.com/~breadbox/bf/
597デフォルトの名無しさん:02/02/17 15:39
>576
なにこれ?バイトコード?
それは違う意味の変態言語だと思うが・・・
599デフォルトの名無しさん:02/02/18 04:17
>>596
これ、すごい小さい処理系(?)だけど、もうちょっと読みやすくならないかな。
あのままじゃさっぱり意味わからないよ。
初心者で申し分けないのですが、scheme を勉強するにあたって
いいドキュメントは何でしょうか?
いままで、「リスト遊び」と「初めての人のための LISP」を読みました。
犬飼さんの本はとっつきやすそうだけど、末尾再帰すら載ってないみたい。
ttp://kakugawa.aial.hiroshima-u.ac.jp/~kakugawa/Hacks/
これなんか、わりと良さげな気がしてるのですが…。
>>600
評価が分かれるけど>>2にあるSICPがいいと思うよ。
Little Schemerだろ。
603デフォルトの名無しさん:02/02/18 10:07
>>601
SICPはSchemeを勉強する本じゃない、ってSICPに書いてあるの
知らないのかな?
604デフォルトの名無しさん:02/02/18 11:06
>>593
それSteeleもCommon Lispの反省点として上げてたよ。
605デフォルトの名無しさん:02/02/18 12:17
>>604
SteelはSchemeの設計者だからね…
先生! >>605 は Steel が Common Lisp の設計者であることを知らなげです!
607デフォルトの名無しさん:02/02/18 14:22
>>600
R4RS-R5RSの規格書50ページと>>2以降にあるリンクのサンプルで勉強したよ。
あとは@niftyのプログラミングランゲージフォーラム(FPL)に上がってる、
昔のログや処理系の解析。結局、処理系の解析が一番役に立った気がする。
結局通信費除けばほとんどタダだった。
cltl2やSICPの訳本とか買ったのはかなり後。
ケントディヴィッグのプログラミング言語schemeだね。
schemeとlispの違いがわかればlispのコードも大変参考になるかと。
>>604
そうなんだ。良かった。
611デフォルトの名無しさん:02/02/19 00:00
>>593
Scheme って R5RS で用意されている標準手続き
が厳選されているところがいいと思う。

Common-Lisp だと例えば、
find, find-if, find-if-not, remove, remove-if, remove-if-not
なんて似たような関数がやたらとたくさんあるけど、
Scheme だと for-each だけしかない。でもこれで十分。
>>611
同意。
ただねえ、Schemeでコードを書いていると
「動けばいいや」という気持ちにならないんだよね。
「もっと美しく(抽象的に)書けるよな……」
とか思っちゃう。
んで、いつまでもコードと戯れて時間を潰しちゃうんだ。
その方が結果的に品質の高いコードができるんだけど、
ついつい楽しくて時間を浪費しちゃうところがあって、
急いでいるときはSchemeには近付けない気分だったり。

; 俺だけ?
613デフォルトの名無しさん:02/02/19 00:35
>>606
SchemeはSteelがゼロから設計したんだよ。でもCLは違う。
どっちかっていうとSteelは各方面からの意見をとりまとめた、って
感じじゃないかな。
>>612
僕もです。でも、他の言語に同じような処理を行わせようと
したとき、Scheme ならサラッと出来るものに時間が取られたり
するので、結局は Scheme の方が良かったりします。
>>596-599
Unix 板に uudecode 使って
直接バイナリ吐く開発法が提示されてたよ。
言語じゃないけどわらった。
>>615
navi2chの機能のことか?
>>615
それはバイナリというか、単に読めないだけでは?
>>615
それってcatでuuencode形式のファイルを書くアレのことかな?
……ここで言うのも何だけど、gzipはタイプ量が減っても開発効率は悪くなると思う……。
619デフォルトの名無しさん:02/02/20 21:01
lispやschemeはperlのヒアドキュメントみたいな機能はありませんか?
620615:02/02/20 21:04
>>618
そうそれ。
脳内で uudecode の結果を予測できる人なら
gzip であれ bzip2 であれ何でもこいでしょう。
621名無しさん@Emacs:02/02/20 22:10
guile って perl みたいにファイルの先頭に #!/usr/local/bin/guile
って書いて実行させることできますか?
今やってみたけどできなかった。何か違うやり方があるんでしょうか。

man 見ようとしたらなかったし(鬱
>>621
試した方が速くないっすか?
623デフォルトの名無しさん:02/02/20 23:36
>>621
GNUものは大体infoをさきにみるといいよ

#!/usr/local/bin/guile -s
!#
(display "Hello, world!")
(newline)
>>623
なるほど。ありがとう。
これからいろいろ勉強します。elisp とは結構違いますね。

;; なぜか info もなかったので探しに逝ってきます。
625デフォルトの名無しさん:02/02/21 00:05
>>619
scshというschemeのshellは
#<<END

END
という構文が用意されているらしい。
他の処理系でも'#'みたいな特殊文字を読みこんだ時に、
登録したフック関数が呼べる様な機能があれば似たような事が
可能でしょう。readそのものを書きかえるって手もあるけど。
626デフォルトの名無しさん:02/02/21 00:28
(define here-document #<<*END*
>>619
scshというschemeのshellは
#<<END

END
という構文が用意されているらしい。*END*)

>here-document
=>">>619 \nscshというschemeのshellは \n#<<END \n〜 \nEND \nという構文が用意されているらしい。"
>>625
それは変数展開してくれるの?

おれはいつもこんな感じで書いてるけど。

(string-append
"...
... " foo " ...
...
")
628デフォルトの名無しさん:02/02/21 01:02
scshは#!<文字>だった。
>#!$ここからここまで$
"ここからここまで"
(この場合'$'が区切り文字。)
guileにもある様です。#q<文字>〜<文字>
>>627
変数展開なんてしないでしょう。
629デフォルトの名無しさん:02/02/21 01:10
定本Cプログラマのためのアルゴリズムとデータ構造 近藤
に載ってるクイックソートのscheme版
誰かリファクタリングしてください。

;;lst(l-r)を値vで分割 分割地点を返す
(define (divide! lst v l r)
 (define (divide-internal l r)
  (define (search-from-left l) ;;リストの前から
   (cond
    ((>= (nth lst l) v) l)
    (else (search-from-left (+ l 1)))))
  (define (search-from-right r) ;;リストの後ろから
   (cond
    ((>= l r) r)
    ((< (nth lst r) v) r)
    (else (search-from-right (- r 1)))))
  
  (set! l (search-from-left l))
  (set! r (search-from-right r))
  (cond
   ((>= l r) l)
   (else
    (swap lst l r)
    (divide-internal (+ l 1) (+ r 1)))))
     
 (divide-internal l r))

(define (divide-and-swap lst l r)
 (cond
  ((null? lst) #f)
  ((< l 0) #f)
  ((< (atoms lst) r) #f)
  (else (let ((p-index (divide! lst (nth lst r) l r)))
      (swap lst p-index r)
      p-index
      ))))

(define (qsort lst)
 (define (qsort-internal l r)
  (cond
   ((>= l r) lst)
   (else (let ((v (divide-and-swap lst l r)))
       (qsort-internal l (- v 1))
       (qsort-internal (+ v 1) r)))))
 
 (cond
  ((null? lst) #f)
  (else (qsort-internal 0 (- (length lst) 1)))))
630デフォルトの名無しさん:02/02/21 02:17
>>629
そちらのコードはよく読んでないけど
何でそんなに長くなるの?

(define (sort p lst)
 (define (filter p a lst)
  (let loop ((lst lst) (r '()))
   (if (null? lst) (reverse r)
     (loop (cdr lst) (if (p a (car lst)) (cons (car lst) r) r)))))
 (define (not-p x y)
  (not (p x y)))
 (if (null? lst) lst
   (append (sort p (filter not-p (car lst) (cdr lst)))
       (list (car lst))
       (sort p (filter p (car lst) (cdr lst))))))

> (sort < '(3 5 2 4 6 3))
(2 3 3 4 5 6)

> (sort char<? (string->list "Scheme"))
(#\S #\c #\e #\e #\h #\m)
>>630
それじゃクイックソートじゃないジャン。
632630:02/02/21 02:49
>>631
というかもろアルゴリズムそのままジャン

ttp://lecture.ecc.u-tokyo.ac.jp/~yamaguch/pub/cp1-3/quick-sort.html
> ・データの集まりから1つデータを選び、それより小さいデータの
> 集まりと、それより大きなデータの集まりに分ける.
> ・それぞれの集まりに対してクイックソートを適用する.(再帰的)
> ・以上を繰り返すと、ソートするデータの個数が減っていき、最後
> にデータの個数が1以下となって終る.
633受験生:02/02/21 03:59
>>184
http://school.2ch.net/test/read.cgi/kouri/1014220418/l50
こんなスレがあった…。
lambda 使って遊んでばっかいるとホントにこういうハメになりそ…。
>>632
計算量って言葉知ってる?
635(not 632):02/02/21 10:09
>>634
効率を求めるなら、Scheme インタプリタ組み込みの手続きにすれば
良いんでないの? そうでなくても、まずは理解しやすいのを書いてから
議論を進めても悪くないでしょ。
636(not 634):02/02/21 10:29
>>635
クイックソートって平均的には他のソート(オーダは同じ)より早いのが
特徴だから微妙だよね。
みなさん chez ってどう読んでますか? シェ? シェズ?
638(be 634):02/02/21 11:55
>>635
実行効率の話じゃない。
関数 p を呼ぶ回数がクイックソートのオーダーと違うでしょ。
639635:02/02/21 12:15
>>638
失礼しました。出直してきます。
chezはシェでしょ。
>>640
フランス語読みだったですね。

スペイン語だったら、チェズかな?
>>641
> スペイン語だったら、チェズかな?
チェスだろ。
643630:02/02/22 02:37
>>638
あえて Scheme っぽく書いたんだけど...
ついでに他の関数型言語のクイックソート。
Haskell が一番かっこいいかな?
SML
ttp://a414s1.it.nanzan-u.ac.jp/smlbook/smlwww/node81.html
Haskell
ttp://www.teu.ac.jp/kougi/koshida/Prog6/text06.html
644デフォルトの名無しさん:02/02/22 03:08
Lisp SchemeってのはEmacs Lispとは違うもんですよね。
どういった関係でしょうか?
645ひまだから書く:02/02/22 05:28
Emacs Lisp も Scheme も Lisp という言語の
範疇に入る方言の一種で、それぞれくせがある。

正当な lisp の後継者としては Common lisp というのがある。
ただ scheme の方が言語的にすっきりした仕様になっているので、
こちらを好む人も多い。
;; 破壊的 quick sort
(define (sort! p seq)
 (define (seq-sort! p seq seq-ref seq-set! seq-length)
  (define (swap! seq i j)
   (let ((tmp (seq-ref seq i)))
    (seq-set! seq i (seq-ref seq j))
    (seq-set! seq j tmp)))
  (define (divide! p seq start end)
   (let ((a (seq-ref seq start)))
    (let loop ((i (+ start 1)) (mid start))
     (cond ((> i end) (swap! seq start mid) mid)
        (else (cond ((p (seq-ref seq i) a)
               (set! mid (+ mid 1))
               (swap! seq i mid)))
           (loop (+ i 1) mid))))))
  (let loop ((start 0) (end (- (seq-length seq) 1)))
   (cond ((>= start end) seq)
      (else (let ((mid (divide! p seq start end)))
          (loop start (- mid 1))
          (loop (+ mid 1) end))))))
 (define (list-set! lst k obj)
  (set-car! (list-tail lst k) obj))
 (cond ((list?  seq) (seq-sort! p seq list-ref  list-set!  length))
    ((string? seq) (seq-sort! p seq string-ref string-set! string-length))
    ((vector? seq) (seq-sort! p seq vector-ref vector-set! vector-length))
    (else seq)))

> (sort! < '(3 4 1 9 2))
(1 2 3 4 9)

> (sort! < '#(3 4 1 9 2))
#(1 2 3 4 9)

> (sort! char<? "34192")
"12349"
647デフォルトの名無しさん:02/02/22 17:38
なんでこの板では ruby の評判が悪いのですか?
最近覚えたんだけど、結構 lisp っぽい所が多くて
結構面白いと思うんだけど。
648デフォルトの名無しさん:02/02/22 17:42
>>647
ruby狂信者が嫌われているだけです。
しかし、そういう人達ってrubyのこと本当に好きなのかな?
本当にrubyを使っているのかな?
ここでrubyの話はしないでほしい・・・
650デフォルトの名無しさん:02/02/24 00:33
LispMe Version 3.1 Release Age!
651デフォルトの名無しさん:02/02/24 11:04
お前ら、関数xxxを再帰でかけますか?

関数xxxの例

>(xxx nil)
NIL
>(xxx '(a))
(A)
>(xxx '(a b))
(A B)
>(xxx '(a (b) c))
(A B C)
>(xxx '((a (b (c (d)) (((e)))))))
(A B C D E)
652こうか?:02/02/24 11:26
(define (xxx x)
 (cond ((null? x) x)
    ((symbol? x) (list x))
    (else (apply append (map xxx x)))))
; テストしてないけど
(define (atom? x) (not (list? x)))

(define (xxx lst)
 (cond ((null? lst) lst)
    ((atom? lst) (list lst))
    (else (append (xxx (car lst)) (xxx (cdr lst))))))
>>651
(defun xxx (xxx)
(cond ((null xxx) xxx)
((atom xxx) (list xxx))
(t (mapcan #'(lambda (xxx) (if (null xxx) (list xxx) (xxx xxx))) xxx))))
しまった、これはもしかすると宿題おしえて君かもしれないぞ。まずいことしちまった。
>>655
反省しる!
そういえば昔教科書でやった気がするよ。
(defun xxx (xxx)
 (cond ((null xxx) xxx)
    ((atom xxx) (list xxx))
    (t (append (xxx (car xxx)) (xxx (cdr xxx))))))
これSchemeで書けないね。
(defun x (x) x)
(setq x 'x)
(x x)
>>658
ほとんどそのままよ
661デフォルトの名無しさん:02/02/24 15:13
って、関数と引数の名前が同じなのってどうなのよ。
Lisp だと関数と値が別々の場所に束縛されるから >>658 はOK
(defun x (x) x)
(setq x 'x)
(describe x)
X is a SYMBOL.
Its value is X
It is INTERNAL in the COMMON-LISP-USER package.
Its function binding is #<Interpreted Function X>
The function takes arguments (X)

そういえば属性リストというのもあったね。最近あまり使わないけど。
(get 'x 'foo) ==> NIL
(setf (get 'x 'foo) 1)
(get 'x 'foo) ==> 1
663デフォルトの名無しさん:02/02/24 15:49
>650
LispMe!ってSECDマシンなのね。
Sスタック
E環境
Cコード
Dダンプ
だっけ。
664デフォルトの名無しさん:02/02/24 16:57
>>662
(put 'x 'foo 1)
じゃないの?
いや、良く知らないんだけど。
665デフォルトの名無しさん:02/02/24 17:01
ていうか、LISPとかって必ず値返すんだよね?
じゃあ
(setf (get 'x 'foo) 1)
の値って何?
C言語だと式の結果は右辺値だよね?
関数の場合は特定できないけど。
666デフォルトの名無しさん:02/02/24 17:11
(get 'x 'foo)
が=>1返すなら、
(setf (get 'x 'foo) 1)
で'xに値が設定できるのって変じゃない?
C++のリファレンス値に代入してるのと同じ気持ち悪さがある。
get(x,foo).set(1)
667デフォルトの名無しさん:02/02/24 17:19
>666
setfはマクロだからなあ
668651:02/02/24 17:23
お前ら!
ありがとうございました!!
>>666
なぜ?
x, x[n] に対する x = val, x[n] = val と
x, (aref x n) に対する (setf x val), (setf (aref x n) val) は
どこが違う?
670デフォルトの名無しさん:02/02/24 19:30
なにいってるのかわからん>669
(aref x n)

=>1が返るなら
(setf (aref x n) val)

(setf 1 val)
に見えてキモイ、ってことでしょ?>666
671元リスーパ:02/02/24 19:51
Cltl1,Cltl2 とか 丸善のCommonLisp本あたりに、
setf で必要な三要素、とかいうの載ってましたよね。(懐
(1) 値設定する場所を表すS式表現  (aref x n)
(2) (1)のS式を解釈して、値設定をする関数 (defun setf-aref ...)とか
(3) よく覚えていないが、 setf へ (1) と (2)を設定する仕組みとかなんとか

現役リスーパな方、正解プリーズ
672not 669:02/02/24 21:45
>>670
でも x[n] が 1 を返すけど x[n] = val は気持ち悪いって言わないのかってことでしょ?
673not 672:02/02/25 09:20
>>670
// これが気持ち悪くないなら
int a[10];
a[5] = 1;

// これも気持ち悪くないはず
map<string, string> m;
m[key] = value; // m.operator[](key).operator=(value);

>>669 は主張しているのではないの?
674673:02/02/25 09:59
まちがった。

// これが気持ち悪くないなら
int i = 0;
printf("%d\n", i); // (print i)
i = 1; // (setf i 1) ;; (setf 0 1) ではない

// これも気持ち悪くないはず
int a[10] = {0};
printf("%d\n", a[5]); // (print (aref a 5))
a[5] = 1; // (setf (aref a 5) 1) ;; (setf 0 1) ではない

>>669 は主張しているのではないの?
675673:02/02/25 10:20
Lisp における setf は C における

#define SETF(field, value) \
 do { \
  (field) = (value); \
 } while(0)

とほぼ一緒。だから

 int i = 0;
 int a[10] = {0};
 map<char*, int> m;

 SETF(i, 1);
 SETF(a[5], 1);
 SETF(m["key"], 1);
今、「竹内郁雄著: 初めての人のための LISP」を楽しく
読んでるんですが、この本で使われてる loop() の仕様が
よく分らず、後半で苦しんでます。どんなのかというと、
例えば

(defun get (symbol property)
(let ((plist (symbol-plist symbol)))
(loop (while plist nil)
(until (eq (car plist) property) (cadr plist))
(setq plist (cddr plist)))))

こんな使われかたしてます。until が複数回出てくる事もあります。
誰か教えてくださいませ。

# ところで3月には ANSI Common Lisp の翻訳本出ますね。楽しみ。
ML スレでも書きましたが、『Scheme による記号処理入門』を注文しました。
Scheme の活用例が載っている書籍で、お勧めの物ありませんか?
実装自体よりも活用分野が紹介されているような文献をお願いします。
>>678
「湯けむり温泉Scheme殺人事件
   Lambda式と末尾再帰に隠された謎
     カッコの付け忘れに刻まれた32年前の悲劇」
>>679
ありがとん。面白そうやねそれ。
32 年前の括弧にどんな秘密が?!
それより、32 年間も scheme のコードを書き続けたのか??
(age (plz ref-book))
682681:02/02/26 00:12
sage てしまった・・・。
(pp '[((((((((schemeができたのは1984年だったはず])
684デフォルトの名無しさん:02/02/26 00:25
WZ使ってるんですが、カッコの対応を表示してくれるマクロありませんか
閉じ忘れたまま保存しようとすると「カッコ閉じてません」とか
警告ダイアログだしてくれたり。
685デフォルトの名無しさん:02/02/26 00:45
http://www.pearsoned.co.jp/washo/nbindex_mar.html

ANSI Common Lisp入門 
Paul Graham著 久野 雅樹+須賀 哲夫訳 B5変 約500頁
ISBN 4-89471-433-7
ANSI Common Lispに準拠した入門書。 Common Lisp Object Sys
tem (CLOS)を使ってオブジェクト指向プログラ ミングを解説している。
Lispと言えば、人工知能か記号処理の例が多かったが、本書は、さ
まざな分野への応用 例を取り上げている:コンピュータグラフィクス、
テキスト生成、HTML生成、並び替え・探索、ファイル入出力、デ ータ
圧縮、数値計算。もちろん人工知能向けの話題もある:パターンマッ
チ、論理推論。

3,900円
686678:02/02/26 05:10
>>685
有難う御座います。
出版されたら読んでみます。
>>663
SECD は Stack, Environment, Control and Dump ですね。

http://www.lispme.de/lispme/doc/lm_hood.htm
>>679
やっぱ、Schemeコードの中にダイイングメッセージが?
しがないPGが温泉旅行に行ってなんか知らんが殺人事件に巻き込まれる。
コンパイルできないSchemeコード。
被害者が最後に打ったと思われるSchemeコードのインデントが
いつものTabではなくSpaceだったことに気づいたPG。
この最後のSchemeコードは果たして被害者が打ったものなのだろうか?
そして、32年前の同様な殺人事件に気付き…。
おもろくないっす
>>688
刑事は藤田まことか古谷一行か?
とりあえず定番の怪しいおばちゃん弁護士は登場させとくか。
691デフォルトの名無しさん:02/02/26 17:36
LispMe!ってgcを再帰で実装してるね。(store.c)
こういう処理系って結構多いのかも。
692デフォルトの名無しさん:02/02/26 22:03
lisp わかるけど C がわからないっス。
アフォですか?
693 :02/02/26 22:17
エライ >> 692
>>692
あぁあ、残念。
LispだのMLだのHaskellだのなんてやってると、Cがとても鬱陶しくなります。
Cは先にやっておくべきだったんでは無いんかと、とか言ってみるテスト。
>>692
文系に多い
696692:02/02/27 01:54
>>693
イェイ!!

>>694
自分もそう思いました。というか、
C で書くような事態がないから覚えないのかも知れないけど。
perl とかはテキスト処理によく使いますが。

>>695
ズバリ的中です。アルゴリズムはわかっても
結局コンピュータの動作の基礎がわかってないってことかな。
アセンブリ言語になると、もうちんぷんかんぷん。
697閑話休題:02/02/27 20:49
chez とか MIT とかは日本語扱えないんですよね? Stk も。
普段使ってる処理系でそういう制限があるのは辛くないですか?

このスレの人達だと自作の処理系使ってたりするのかな?
698:02/02/27 21:55
>697 Gauche
>>697
コードをEUCで書いて、SJISで入出力する関数を書けばOK。
700デフォルトの名無しさん:02/02/28 09:02
Gauche 、Solaris/SPARC でコンパイル出来んかった。
ndbm のあたりで何故か引っかかる。
gdbm 入れて再度挑戦してみようかな。
701デフォルトの名無しさん:02/02/28 18:24
Guile-user ML にこんなことを言っている人がいた。

http://mail.gnu.org/pipermail/guile-user/2002-February/002554.html
> XML is very close to S-expressions, and if the Lisp community it been in
> the right place at the right time, perhaps the world would be using
> S-expressions insteda of XML. But it wasn't and it isn't.

もし S 式だったら XSLT なんかいらなかったのにね。
>>701
何故 S 式を使わないのか、不思議で仕方がない。
パース楽だし、eval もできるし。
>>701
でも「XML World」とかの雑誌が「S式World」とかだったら
きっと売れないだろうな。(おれは買うけど)
>>703
"S-expressions World"とかは?
XMLは名が売れ過ぎてるので、いっそのこと乗っ取ってしまえ。

S-XMLとか
XML-LISPとか
適当に名前をでっち上げて、我々で流行らせよう。
きちんと規格っぽいことも定めてみたりして、
XMLだけではなく、XMLSchemaとかXSLTとかも
LISPで乗っ取ってしまおう。

乗っ取って「こんなに便利なんですよ」
そして流行らせれば、一気に我々は時代の最先端。
>>704
ちょっと長すぎ。「SEXP World」がいいかな、
勘違いして買う奴がいそうだし。
708デフォルトの名無しさん:02/02/28 21:24
>>701
それって「結局lispの連中は好機を逃してしまうだろう」ってゆってんだよな
皮肉なのかハッパかけてんのか馬鹿にしてんのか絶望してんのか藁ってんのか
709:02/02/28 22:57
国際化についてはいまの LISP 処理系の弱点だと思うので、
その点は XML のいいところを取り入れるとイイ
710デフォルトの名無しさん:02/02/28 23:17
XMLとLISPのトークンを比べると

XMLは
<tag>にょろ</tag>
でLISPでは直ぐにはわからない、
「どのカッコが閉じられたか」がすぐわかる。
HTMLの様に終了タグ自体を省略できる可能性がある。
かたやLISPでは
(tag にょり) ;car=>tag cadr=>にょり
表現をS式として取り出せる。けどカッコ読みにくい。

そこでLISPに、カッコの他に
<tag>にょろ</tag> => (tag にょろ)
と変換するロジックをデフォで組み込んでみたらどうか。

<car><cdr>S 式 に 革命 を</car>
=>式
711デフォルトの名無しさん:02/02/28 23:28
<tag>は常にoperatorとなりえるので、
<tag></tag>で囲まれたフィールド(operand)はquoteまたはquasiquoteが
暗黙に掛けられた状態とする。
<car><cdr>S ,式 に 革命 を</car>
は(cadr `(S ,式 に 革命 を))
で「式」を評価したリストがcadrに渡される
712デフォルトの名無しさん:02/02/28 23:34
なんかXML関係の書き込みってピントがズレてるって思うの、俺だけ?
たしかにLispでは構文木を直接的に記述することがデータの表現と
プログラムの表現を区別しないという武器につながっているけど、
そんなLispにも具象表現と内部表現の区別はあるわけじゃないですか。
XMLは所詮、具象表現の一種に過ぎないわけで、XML的なコーディング
を要求するなり、受け付けるなりするLispの処理系があっても別にお
かしなことではない。つーか、Lispの本質はそんなところにはないと
思う。

S式ってのはかっこだらけの式のことじゃないと思うんだがね。
713デフォルトの名無しさん:02/02/28 23:42
>>712
言ってることが難しくて理解できなかった
714デフォルトの名無しさん:02/02/28 23:55
S式も、見た目変更すれば見やすくなるって話?
715デフォルトの名無しさん:02/03/01 00:15
S式のSってなんれすか
716無名λ式:02/03/01 00:20
じゃあ、とりあえずDSSSLから始めよう。
http://www.jclark.com/
Sが沢山あると何がうれしいですか
718無名λ式:02/03/01 00:37
>>715
Symbolic Expressionだったかな。
719無名λ式:02/03/01 00:50
>>717
> Sが沢山あると何がうれしいですか

って、>>716の「D"SSS"L」について言っているのかな?
DSSSLは、『Schemeで』SGML documentの変換や整形を行うための規格です。
XML版もあります。ってマジレスでよかったですか?

DSSSL Onlineってのがweb用のsubsetだったはずです。
720デフォルトの名無しさん:02/03/01 01:10
そういやシンボルの存在は、あなどれない。
721やほー:02/03/01 03:01
>712
具象表現と内部表現ってなに?
勉強します、スマソ。
722デフォルトの名無しさん:02/03/01 03:19
>>721, >>713
字面のコードと実際の処理の事じゃないでしょうか?

コード自体は<xml>タグ括り</xml>でも(lisp 括弧括り)でも良いけど、
それを処理系がどう解釈するかに Lisp の本質があると言う事では?

しかしながら、その本質がどういう事なのかは私には分かりません。
誰か詳しい人お願いします。
1-a. データの記述と関数の記述を、同じ記法で記述できるといのが Lisp の強み。
1-b. XML もデータの記述と関数の記述を、同じ記法で記述できる(?)。

2-a. Lisp は木構造を簡単に表現できる。
2-b. XML も木構造を簡単に表現できる。
XML と lisp の内部表現は論理的に等価になりうるということですか?
XML よく知らないんではずしてるかも知れないけど。
725712:02/03/01 08:43
お前ら、マジでそんなレベルなの?

CでもPascalでもBASICでもLispでも、その処理系は
ソースコードを構文解析して構文木を作るんだよ。
ただ、Lispの場合、構文木とソースコードの対応が
非常に密というか、ソースコードは構文木を一定の
記法で書き下ろしたものとなっているわけ。リスト
は木構造を表現するだけの力をもっているので、す
べてをリストで表現できている。これがLispの強み。

CやPascalのような言語は、構文解析した後に内部
的に生成された構文木に触れることはできない。
Lispはできる。それこそがLispの強み。

構文解析して構文木を作ること、構文木を直接一定
の記法で書き下ろすこと、という観点からすると、
その一定の記法がXMLの文法でもいっこうにかまわ
ない。つーか、XMLの文法で書かれたLispのコード
を評価するLispプログラムを書くことは簡単でしょ?
そういうことが簡単にできること自体がLispの力。
CやPascalではこうはいかない。
> お前ら

一般化すんじゃねーよ。馬鹿。
727無名λ式:02/03/01 11:48
>>721
> 具象表現

Lispの言うところの印字表現でしょ。

>>723
> 1-b. XML もデータの記述と関数の記述を、同じ記法で記述できる(?)。

関数ってXSLTとか? あれ不自由すぎない?
728無名λ式:02/03/01 11:55
>>725
> ただ、Lispの場合、構文木とソースコードの対応が
> 非常に密というか、ソースコードは構文木を一定の
> 記法で書き下ろしたものとなっているわけ。

なってない言語があったら教えて欲しい、と小一時間問いつめたい
;「Lispの場合」は、この次の文に修飾した方がいい。

;; まあ、perlはaliasがありすぎて駄目だし、
;; Lispも'とquoteの区別は苦手だが。(TAO以外は)
729701:02/03/01 12:29
>>725
そういう意味での Lisp の優位性はわかるよ。

XML 関連の技術って、 XML の構文を使って
その機能を表現するというのがよくあるけど
(XSLT, XML Schema 等)、多少プログラムちっく
なこと表現しようとすると、やっぱり XML は冗長
すぎてだるいよね。

そういうところで Lisp が XML に食い込んでいく
余地ってないかな?

Lisp <--> XML(HTML)
http://opensource.franz.com/aserve/aserve-dist/doc/htmlgen.html
http://www.graco.c.u-tokyo.ac.jp/~kamina/xmltools/
http://opensource.franz.com/xmlutils/xmlutils-dist/pxml.htm
730デフォルトの名無しさん:02/03/01 13:04
>>728
725の言ってることわかってないじゃないの?BNFとかで定義された
構文と、ソースコードが対応してるってな話じゃないよ。

要はlispにはパーサがいらない、ってことなんだよ。CでもPascal
でもソースをパースして構文木つくるでしょ?S式はそれ自体が木構造
になってるってことでしょ。
731702:02/03/01 13:56
>>725
そんな事は十分承知の上での議論だと思っていましたが...
732無名λ式:02/03/01 14:20
>>730
それが分かった上で、(分からないlisperがいるのか?)
指摘している文章「が」おかしいと言っているのです。
>>725全体を否定した覚えはまるでありません。

「お前ら、マジでそんなレベルなの?」と高飛車(wだったので、
おかしいところを指摘したい衝動に駆られただけです。
S式はラムダ式のlisp的具体化だろう
よくは知らんが

そのLispの強みといわれているものは、
Lispの強みというより、それの準拠する計算モデルの強みだ

そしてやはりXMLとそれとの親和性は否定できない
それは、XMLが階層的構造を持っているためだ

しかし、データ構造は一般的に、そういう構造を持っているものが多い。
別にXMLに限られるわけではない
それにもかかわらず、結局の所は命令型が主流であるという事実は、
ある種の推測をもたらすだろう
誰が誰に喧嘩売ってるんですか?
735デフォルトの名無しさん:02/03/01 17:09
LISPの構文解析はマクロ展開だってんでしょ?
712の説明がまわりくどくてややこしいだけ、に一票。
736デフォルトの名無しさん:02/03/01 17:11
そういやXMLってよくしらないんだけど、
LISPのquote相当のものはあるの?
つーか、XMLはデータ表現の形式であってプログラミング言語
じゃないじゃん。自己記述的ではあるから、規則を決めれば
Lisp的に評価可能だけど。
>>736
それは逆で、(DTDも含めて)データ表現の方法しかない。
お友達のXSLTの計算能力は貧弱。万能計算器どころの話じゃない。
>>738
XSLT について。
http://www.w3.org/TR/xslt#section-Examples
http://www.graco.c.u-tokyo.ac.jp/~kamina/xmltools/transformations.html
をみくらべるとよくわかるね。ま XSLT は変換が目的だから
単純に比べるのはどうかとおもうけど。
740デフォルトの名無しさん:02/03/01 21:46
うわーん、すごいよLISP
741デフォルトの名無しさん:02/03/01 22:03
*←これなんですか?→*
S式というのはジャーゴンだ。
そういうのを頻繁に使うのはあまり感心できない。
単なる式で足りる。
743デフォルトの名無しさん:02/03/01 23:43
*ファンネル*
∀・)
745デフォルトの名無しさん:02/03/02 00:11
(パパ!)
746デフォルトの名無しさん:02/03/02 00:18
(ボクをぶたないで!)
(コラコラ)
748教えて:02/03/02 00:23
すみません。
MFCWIZARD(DLL)で、クラスを持ったDLLを作りました。
次にMFCWIZARD(EXE)でDLLのクラスを使用し、ビルドをしたのですが、
クラスのコンストラクタとデストラクタが(LNK2001外部シンボルが未解決)
と、なってしまいます。
微妙に荒れてきたか?
http://www3.tok2.com/home/xyzzy/ml/thrd11.html#01001
http://www-6.ibm.com/jp/developerworks/xml/010914/j_x-xslt.html

XML と Lisp/Scheme な話題って何処でも出てるのね。
検索したらかなりの量がヒットした。

あ、750 ?!
Gauche は早く Gtk に対応しないかな。
GUI が作れたら、もう他の処理系はいらない。

後は、簡単な rdbms 相当の機能が欲しいかな。
752デフォルトの名無しさん:02/03/02 12:29
>>751
DLLアクセス機能があれば直APIでGUIとODBC程度は使える様になりますが、
recordset相当は自分で書く必要はあるかも
>>751
SLIB に Relational Database パッケージみたいのがありましたよ。
使ったことないので、詳しくは分かりませんが。
>>751
ACL
755デフォルトの名無しさん:02/03/02 13:26
acl無料版、まだgetでける?
>>754
gauche> (substring "あいうえお" 0 3)
"あいう"
ACL> (subseq "あいうえお" 0 3)
"あ\202"
757デフォルトの名無しさん:02/03/02 14:59
gaucheって漢字を1文字と数えるの?
>>757
gaucheのページ読みなよ、質問君。
http://www.shiro.dreamhost.com/scheme/gauche/features-j.html
759デフォルトの名無しさん:02/03/03 03:48
ChezSchemeはなんであんなに速いんだ?インタプリタのくせに
>>753
ありがとう。
rdms.scm と dbxxx.scm という一連のファイルを見つけました。
これからゆっくりいじってみます。
これはアトムかな?

atom
762デフォルトの名無しさん:02/03/03 10:18
XMLやる場合、case-sensitiveは必須なのか
763デフォルトの名無しさん:02/03/03 12:31
>>759
有料版のChez Schemeはインタプリタじゃないよ。中でコンパイルしてる。SML/NJとかと一緒。
http://www.scheme.com/csug/system.html#g2240
>>761
はい。
atomは文字aで始まる文字列ですから。
765デフォルトの名無しさん:02/03/04 01:10
単体の cons cell は atom ですか?

単体でも car と cdr があるので結局 list になるように
思うんだけど。
(´-`).。oO(consでないものがatomなのだが…)
767765:02/03/04 01:34
そうか。list でないものが atom と感違いしてました。
どおりで変な訳だ。
768678:02/03/04 03:24
>>678 です。
上記の本で、状態空間の探索まで読み進めました。
Lisp 系は初めてなのですが、面白くてサクサク進めます。

ところで、>>725 の以下の部分にはどういう時にメリットがあるのでしょうか?

>CやPascalのような言語は、構文解析した後に内部
>的に生成された構文木に触れることはできない。
>Lispはできる。それこそがLispの強み。

>>728 のこの部分に繋がると思うのですが、

>要はlispにはパーサがいらない、ってことなんだよ。CでもPascal
>でもソースをパースして構文木つくるでしょ?S式はそれ自体が木構造
>になってるってことでしょ。

パーサがいらないというので実装が楽と言う事でしょうか?
あるいは、いちいち解析する必要がないので、他のインタープリタ言語と
比べて処理速度が稼げるということでしょうか。

Lisp がデータの構文木を扱い易いと言うのは理解できますが、>>725
おっしゃっているのはその事では無いですよね?

話を蒸し返して済みません。
>>768
first class object という概念がある

http://www.yuasa.kuis.kyoto-u.ac.jp/~takayama/EoPL/2.3.2.html
770やほー:02/03/04 15:41
パーサが要らないってことでは、forth もそうですよね?
771753:02/03/04 18:34
ストリームから S 式を文字単位で読んで構文木を作るんだから、
個人的に read はあくまで「パーサ」であるように思えるんですが。
字句解析器と一緒になってる実装もあるようです。

むしろ文字単位で読むだけで構文木ができるんだから、
字句解析器のみってことじゃないのか?スキャナっていうんだっけ?
パーサは構文解析をするんだよね?
>>764
これはアトムかな?

turkey
774デフォルトの名無しさん:02/03/04 20:25
直接native-code出力するschemeつくりたいんだけど、
x86系でオープンソースで参考になる処理系ないですか?
>>773
はい。
文字で始まる文字列ですから。
776771:02/03/04 20:42
>>772
字句解析器の仕事は一般的に、ストリームからトークン切り出しを
行い、それを構文解析器にパスする事だと思うんですが、如何?
ドットペアを解析したり、引用符 (') を受けて quote を cons する
ような作業は、字句解析とは言えないと思います。

一応 The Free On-line Dictionary of Computing (ttp://www.dict.org)
で調べてみたんですけど。
>>774
こんなのみつけましたが
http://www.cs.cornell.edu/kozen/ECC/
778デフォルトの名無しさん:02/03/04 20:45
1+1
これはatom?
>>775
これはアトムかな?

1492
780774:02/03/04 21:08
>>778 >>779
全部atomだよ。
ちなみに>>778は'1+1'というsymbol
>>779はnumber

>>777
ありがとう!
781774:02/03/04 21:09
|(まーくんごはんできたよ)|
これもatom。
http://www.lisp.org/table/style.htm
これどう思う?多少同意できない部分もあるけど。
こんな風にコード書く奴いない?

(if x
 (progn
  ...
 )
 (progn
  ...
 )
)
>>779
はい。
1492は十進数の文字列ですから。

>>783
これはアトムかな?

*abc$
785デフォルトの名無しさん:02/03/04 23:19
>>782
インデントの話?
昔悩んだ。
(progn
 長い処理シーケンス
 ...
)
は普通だと思う。
ただでさえネスト深くなる傾向があるんで、適当なところで落としたりする
(defun
 (
  (
   (
    (withなんちゃらとか
 (lambda()
  (let
   (...

結局のところ、transcriptすることが多いし、
見せるのが目的なコードはpretty-printに任せる様になった。
786678:02/03/04 23:47
>>769
有難う御座います。

CやPascalのような言語で、構文解析した後に内部的に生成される
構文木を、Lisp は直に操作する事が出来る。

それは S 式自体が木構造だからである。

その恩恵として、Scheme では手続き等を first class object として
扱える、という事ですよね。

少し違うかも・・・。
C や Pascal がどう構文解析されるか勉強した方が良さそうですね。
>>785
んー、 if と progn を使うなら cond を使ってほしいということと、
閉じカッコはまとめてほしいということを言いたかったのよ。

(cond (x ...)
   (else ...))

こう書いてほしい。

>>782 みたいなコードを C 言語ユーザが書いてきてキレそう
になることってない?

ところで >>784 等でアトムがどうのこうの言っている奴って、なんか
おもしろいの?最後にすごいオチが待っているならいいけど。
> (´-`).。oO(consでないものがatomなのだが…)
おれもすごいオチきぼん>atomer
(define atom?(lambda(o)(not(pair? o))))
791デフォルトの名無しさん:02/03/05 01:12
(define x 1)
(define y 2)
(define z 3)
みたいなとき、xやyなどの値を使ってC言語のswitch文みたいに
一括で分岐したいんだけど、case文じゃできないよね?
(case n
 ((x) 'x) ;(= x n)となってくれ
 ((y) 'y) ;(= y n)となってくれ
 ((z) 'z) ;(= z n)となってくれ
 (else 'unknown))
これじゃ意味違うし(w

ほんとはこういう意味なんだけど、
(cond
 ((= x n) 'x)
 ((= y n) 'y)
 ((= z n) 'z)
 (else 'unknown))
condじゃスマートじゃない様なきがするし、
うまい方法ないですか?
>>785
そういえば Java では「字上げ」をする人がいるらしい。
class Foo {
  void bar() {
...
...
  }
}
793デフォルトの名無しさん:02/03/05 01:21
>>791
こんなのとか
(cdr(or (assv n
 `((,x . x)
  (,y . y)
  (,z . z)))
 '(それ以外はこれ→ . unknown)))
(defmacro set-cdr! (pair obj)
 `(setf (cdr ,pair) ,obj))
(setq x '(1))
(set-cdr! x x)
(listp x) ==> ?

(define x '(1))
(set-cdr! x x)
(list? x) ==> ?
795デフォルトの名無しさん:02/03/05 05:10
Scheme に慣れていると、他の言語でも素性の良いコーディングが出来る
というのは、不必要な一時変数の大盤振る舞いをしなくなると言う事で良い?

逆に括弧や goto が沢山ある解読不能なコードを量産する罠も在りですか?
> 逆に括弧や goto が沢山ある解読不能なコードを量産する罠も在りですか?

こんなコードを書いてスタックオーバーさせます:

list* search(list* p, int x) {
 return (p == NULL)? p : ((p->x == x)? p : search(p->next, x));
}
>>784
はい。
*abc$は左かっこ「(」や右かっこ「)」以外の文字で始まる文字列ですから。
>>797
これはリストかな?

(atom)
( ● ´ ー ` ● )あたしってatom?
なんか、これは atom? ってのがノイジーなんだけど...
ところでみんな、common lisp の処理系には何使ってる??
>>800
>なんか、これは atom? ってのがノイジーなんだけど...

Little Schemer読んでないんだね。

802デフォルトの名無しさん:02/03/05 23:20
お前ら、LISPの真髄を具現化したコードを載せてください。
なっちは遠い親戚?(● ´ ー ` ●)
804デフォルトの名無しさん:02/03/05 23:38
アトムっつーとだな、まず原子力が思い浮かぶよ。
放射能漏れが気になるな。
'(((atom))) ←3重の隔壁
>>801
Little Schemer の日本語版「Scheme手習い」は絶版らしいけど
Little Schemer 英語で読んだの?
>>796
すれ違いで悪いんだけど、最近のコンパイラって
そういうコードを loop にしてくれるのかなっと思って

% gcc -O6 -S >>796

とやってみたけどなんかやってくれないっぽい。
やってくれるんなら気軽に Lisp っぽいコードが
書けるんだけどな。
>>801
本業で使うときは ACL。
atomer については、ちょっとウザイけど、
もうちょっと様子をみてみよう、という気分。
809デフォルトの名無しさん:02/03/06 00:55
最近Lispをもういちどやりたくなって、
よんでみたい本がいろいろでてきたんですが、翻訳情報しりませんか?

"ANSI Common Lisp"
"On Lisp"
"Artificial Inteligence A Modern Approach"
"Paradigms of Artificial Inteligence Programming: Case Study in Common Lisp"

どれもまともにやると社会人には時間がかかりそうなので、
ちかいうちに和訳でそうなやつがあれば、それは後回しにして、
翻訳でそうにないやつから読もうかな、なんて
考えてマス
810808:02/03/06 00:55
>>801 --> >>800
ああ
812デフォルトの名無しさん:02/03/06 04:01
CMUCL であるクラスのメソッドのリストを取得する方法知らない?
(defclass a ())
(defmethod foo ((x a)))
(defmethod bar ((x a)))
(pcl:specializer-direct-methods (find-class 'a))
でエラーになるんだよな。
813デフォルトの名無しさん:02/03/06 05:15
Russell & Norvigなら翻訳あったはず。
原書より高かったと思うけど。でも原書もそんなに難しくないよ。
814デフォルトの名無しさん:02/03/06 05:34
guile 使ってるんですけど、
random seed の与え方がよくわかりません。

(random 10
(seed->random-state (current-time)))

こんな風に random() に seed->random-state() を与えるんですけど、
seed に current-time() とか与えても何かランダムじゃないような
結果が出てしまって。

例えば
guile -c "(display (random 10 (seed->random-state (current-time))))(newline)"
こうやってもなぜか出力がランダムじゃありません。

seed->random-state の使い方に問題があると思うんですが、
わかる方教えて下さい。
>>814
> guile -c "(display (random 10 (seed->random-state (current-time))))(newline)"
> こうやってもなぜか出力がランダムじゃありません。

乱数は乱数系列として初めて意味があることはご存じでしょうか。
上のprogramを複数回実行して比べても意味はありません。
816814:02/03/06 13:30
それはわかるんですが、
するとプログラムの初めの実行でまばらな乱数を得る
にはどうしたらいいんでしょうか。

seed->random-state が hash みたいになっていると
思ったんですが、違うようです。
>>816
(current-time) って一秒単位だからそれをもうちっと細かくするとか、
libguile/random.c の
void scm_i_init_rstate (scm_t_i_rstate *state, char *seed, int n)
関数を読んで、 seed の値を工夫してみてはどうでしょうか?
>>812
ACL だけど
(clos:specializer-direct-methods (find-class 'a))
==> (#<STANDARD-METHOD BAR (A)> #<STANDARD-METHOD FOO (A)>)
となったよ。ちなみに (defclass a ()) は ACL でエラーになるよ。
819814:02/03/06 15:02
>>817
アドバイスありがとうございます。
seed の値に何らかの hash されたものを与えるように
すればよさそうですね。

# しかし均一に hash するものを作るとなると
# 結局自分で乱数発生関数を作るのとかわらないな。
>>819
hash は MD5 でいいんじゃない? RFC にリファレンスコードがあるし。
(system "echo hello | md5sum") とズルしてもいいし。
821814:02/03/06 15:14
>>820
> (system "echo hello | md5sum") とズルしてもいいし。
その線でいきます (w
どうせ大したことするプログラム作ってる訳でもないので。
822デフォルトの名無しさん:02/03/06 19:15
Corman Lisp 1.5
http://www.corman.net/index.html
これどうですか?
823デフォルトの名無しさん:02/03/06 22:44
次の様な変換をするプログラム知りませんか?

CreateFileA -> create-file
CreateFileMappingA -> create-file-mapping
CloseHandle -> close-handle
MapViewOfFile -> map-view-of-file
UnmapViewOfFile -> unmap-view-of-file
GetCommandLineA -> get-command-line
CreateFontIndirectA -> create-font-indirect
SQLConfigDataSource -> sql-config-data-source
SQLAllocHandle -> sql-alloc-handle
SQLFreeHandle -> sql-free-handle
824 :02/03/06 22:46
ハァ?
825デフォルトの名無しさん:02/03/06 22:56
追加

DSSSL -> dsssl
GetDC -> get-dc
ReleaseDC -> release-dc

自分で作るしかないでしょうか?
826デフォルトの名無しさん:02/03/06 23:00
>>824
要するにWindowsやJavaで使われる名前から
lisp,scheme用の名前に自動生成するプログラムなんですが。
(VBなんかだとAliasに相当するはず)
827デフォルトの名無しさん:02/03/06 23:01
s/生成/変換/
emacs-lisp を少し勉強してから scheme にも興味があるんですが、web で調
べてもあまり情報が見つからないです。guile がインストールされているよう
なので guile を覚えたいのですが、参考になる page とか本とかあったら教
えてください。
emacs-lisp とは結構違うところが多いので難しいです。
829通行人:02/03/06 23:13
もう少し具体的にお願いします。 >> 823
たぶん、Win32 API だと思うけど、名前変換する必要性は?

自分は allegro を使っているのでこんなのを参考にしている。
http://www.franz.com/support/documentation/5.0.1/doc/cl/foreign_functions.htm#A.3%20The%20Lisp%20side%20of%20foreign%20functions
830デフォルトの名無しさん:02/03/06 23:15
>>823
知らん。それに結局、納得のいくものは自分で作るしかない。

>>828
まずschemeの規格書(邦訳有り)を読んで、その薄っぺらさに驚いてから、
SICP(邦訳本:計算機プログラムの構造と解釈)で基本を覚えた後、
Scheme入門(絶版)でSLIBを学習する。
全部webで手に入る。
>>828
僕も emacs-lisp から入った口だけど、
lisp のアイデアの主要な所はあんまりかわらないよ。
>>823
そんなの lisp 使う必要あるんですか?
sed でも perl でも数行でできることを。
833すれちがいだけど:02/03/07 05:16
sedだと大変じゃないか?
perl -ane 's/A$//; s/SQL/SQL-/g; s/([a-z_0-9])([A-Z])/$1-$2/g; tr/A-Z/a-z/; print $_'
大文字省略単語は一つ一つ記述。
trの部分を列挙して記述すればsedでも可能。
Lisp, Schemeで書かない限り、この話題終了。
>>834
http://www.geocities.co.jp/SiliconValley-PaloAlto/7043/#perl.scm
こんなん書いた。これで Scheme で書く。
Emacs 内で Scheme を起動するときに cmuscheme
モードを使っているんですけど、変数名の補完、ヒストリ
等がないためイマイチなんですけど、皆さんどんなの
使ってますか?
837デフォルトの名無しさん:02/03/07 20:36
>>835
あんた、神!
>>798
はい。
(atom)はかっこに囲まれてますから。
これは日本語かな?
うんこ
これはリストかな?

(atom turkey or)
>>840
はい。
かっこに囲まれたアトムの集まりですから。
>>841
これはリストかな?

(atom turkey) or
>>842
いいえ。
これは実のところかっこに囲まれていない2つのS式です。
1つ目のS式は2個のアトムを格納しているリストであり、
2つ目のS式はアトムです。
>>843
これはリストかな?

((atom turkey) or)
>>844
はい。
今度は2つのS式がかっこに囲まれていますから。
>>845
これはS式かな?

xyz
>>846
はい。
すべてのアトムはS式ですから。
>>847
これはS式かな?

(x y z)
>>848
はい。
リストですから。
>>849
これはS式かな?


((x y) z)
>>850
はい。
すべてのリストはS式ですから。
>>851
これはS式かな?

(how are you doing so far)
>>852
はい。
かっこに囲まれたS式の集まりですから。
>>853
リストの中にあるS式は何個かな?
(how are you doing so far)
それから、それは何?
>>854
6個です。
how、are、you、doing、so、そしてfarですね。
>>855
これはリストかな?

(((how) are) ((you) (doing so)) far)
>>856
はい。
かっこに囲まれたS式の集まりですから。
>>857
リストの中にあるS式は何個かな?
(((how) are) ((you) (doing so)) far)
それから、それは何?

>>859
3個です。
((how) are)、((you) (doing so))、
それからfarですね。
>>859
これはリストかな?

()
>>860
はい。
かっこに囲まれたゼロ個のS式ですから。
この特殊なS式はヌルリスト、空リストと呼ばれます。
>>861
これはアトムかな?

()

>>862
いいえ。
()はリストであるだけです。
>>863
これはリストかな?

(() () () ())
>>864
はい。
かっこに囲まれたS式の集まりですから。
>>865
lが引数
(a b c)
であるとき、lのcarは何かな?
>>866
aです。
このリストの最初のアトムがaですから。
>>867
lが
((a b c) x y z)
であるとき、lのcarは何かな?

かなりうざいんすけど。。
>>869
同意。3日に1個くらいなら我慢できる。

>>862
(atom ()) ==> T
そのうち面白くなるよ!

>>870
なるほど、
(atom? ())
は#tを返すね。
名著なのに、バグが残っているとは...
当り前のことばかり問題に出して面白いか?
君たちがやっているのは >>839 と同じレベルだぞ。
>>871
じゃあ、面白くなってから書き込んでくれ。
>>871
バグじゃねーよ
あほか。
いくらネタが無いからといっても、お前の様な書きこみは必要としていない。
自分でスレ立てしてそっちでやってろ。
何で荒れてるんだ
() が atom とみなされるって、IEEE Scheme だっけ?
禅問答みたいなもんだな
つーかピザだろ。
そういうの面白いと思うけど、
ここでやることじゃないと思う。
どっかにページ作ってくれたら見にいくよ。
880デフォルトの名無しさん:02/03/08 23:59
>>876
あのさあ、
(define (atom? x)(not(pair? x)))
なわけよ。
じゃあlist?はどうやって定義する?
881(not 876):02/03/09 00:07
>>880
(pair? '()) → #f
なんだけど。
882881:02/03/09 00:13
どうやら日本語を読み間違えたようです。
(adios)
883デフォルトの名無しさん:02/03/09 01:43
(set! name value) はセルの値を上書きする、
(set! nameA nameB) はセルへの参照(束縛)をコピーする、で合ってますか?

(set! nameA valueA)
(set! nameA nameB) した後で
(set-cdr! nameA valueB) や
(set! nameA valueC) した場合、nameB が参照しているセルの中身はどうなる
のでしょうか?

nameA と nameB が参照している物は常に同じになると思っていたのですが、
実験してみると異なる値が帰ってくるようです。

Scheme を勉強していていきなりつまづいてしまいました。
どなたかご教示下さい。お願いします。
cell というのは単なる object の一種で、
変数の格納場所とは違うんじゃないですか?
885デフォルトの名無しさん:02/03/09 02:10
実行したのはこんなコードです。
;
(define nameA '())
(define nameB '())
;
(set! nameA '(valueA))
(set! nameB nameA)
(set-cdr! nameB '(valueB))
(set! nameB (cdr nameB))
(set-cdr! nameB '(valueC))
(set! nameB (cdr nameB))
(set-cdr! nameB '(valueD))
(set! nameB (cdr nameB))

各行で nameA, nameB を出力してみた結果。
;省略
;省略
;省略
;省略
(valuea) ; nameA のみです。
(valuea)(valuea)
(valuea valueb)(valuea valueb)
(valuea valueb)(valueb)
(valuea valueb valuec)(valueb valuec)
(valuea valueb valuec)(valuec)
(valuea valueb valuec valued)(valuec valued)
(valuea valueb valuec valued)(valued)

何故 nameA のリストの要素数が増加していくのでしょうか?
set! は破壊的な代入ですよね。
>>885
struct Pair {
 Object* car;
 Object* cdr;
};

void set_cdr(Pair* p, Object* o) {
 p->cdr = o;
}

こんな感じででわかる?
それと、

void set(Symbol* s, Object* o) {
 s->value = o;
}

普通の実装はこんな風ではないけど。
888デフォルトの名無しさん:02/03/09 03:23
>>886
済みません。よく判らないです。
C 言語でポインタの操作をしているのですよね?

最初は参照優先で、以下のように考えていました。
(set-cdr! は nameA, nameB 両方に適用されるのに、set! は nameB のみに
適用されているように思えました。)

;; 7 行目から
set-cdr! で nameA, nameB の両方の cdr に valueB を追加する。
set! で nameB の参照先を変更する(この時点で nameA と nameB の参照
は異なる対象に向けられている)。
set-cdr! で nameB の cdr に valueC を追加する。何故か、nameA の cdr
にも valueC が追加されている(何故?)。

リスト優先で以下のように考えると納得がいくような気がします。

;; 5 行目から
set! で nameA の参照先が (valueA) のリスト全体 (car cdr) にセットされる。
set! で nameB の参照先が (valueA) のリスト全体 (car cdr) にセットされる。
set! で '() に valueB が代入される。
set-cdr! で nameB の参照先が (valueA valueB) の cdr になる。 ;; nameA の参照先はリスト全体 (car cdr) で変わらず。
set! で (valueA valueB) の cdr に valueC が代入される。
set-cdr! で nameB の参照先が (valueA valueB valueC) の cdr になる。;; nameA の参照先はリスト全体 (car cdr) で変わらず。
set! で (valueA valueB valueC) の cdr に valueD が代入される。

この解釈で合っているでしょうか?
改行がおかしかったので訂正させていただきます。

最初は参照優先で、以下のように考えていました。
(set-cdr! は nameA, nameB 両方に適用されるのに、set! は nameB のみに
適用されているように思えました。)

;; 7 行目から (説明の各行はコードの行に対応)
set-cdr! で nameA, nameB の両方の cdr に valueB を追加する。
set! で nameB の参照先を変更する(この時点で nameA と nameB の参照は異なる対象に向けられている)。
set-cdr! で nameB の cdr に valueC を追加する。何故か、nameA の cdr にも valueC が追加されている(何故?)。

リスト優先で以下のように考えると納得がいくような気がします。

;; 5 行目から (説明の各行はコードの行に対応)
set! で nameA の参照先が (valueA) のリスト全体 (car cdr) にセットされる。
set! で nameB の参照先が (valueA) のリスト全体 (car cdr) にセットされる。
set! で '() に valueB が代入される。
set-cdr! で nameB の参照先が (valueA valueB) の cdr になる。 ;; nameA の参照先はリスト全体 (car cdr) で変わらず。
set! で (valueA valueB) の cdr に valueC が代入される。
set-cdr! で nameB の参照先が (valueA valueB valueC) の cdr になる。;; nameA の参照先はリスト全体 (car cdr) で変わらず。
set! で (valueA valueB valueC) の cdr に valueD が代入される。

この解釈で合っているでしょうか?
;; 全然違った。7 行目から。
set-cdr! で (valueA . ()) の () 部に (valueB . ()) を挿入
set! で nameB の参照先を (valueA . (valueB . ())) の (valueB . ()) に
set-cdr! で (valueB . ()) の () 部に (valueC . ()) を挿入。リストとしては (valueA . (valueB . (valueC . ()))) となる。
set! で nameB の参照先を (valueA . (valueB . (valueC . ()))) の (valueC . ()) に
以下、繰り返し。

要は、変数名(束縛)に注目しすぎて、リスト本来の動きが見れていなかったという事でした。
基本中の基本でしょうか?

885 は某所のサンプルコードを元に、実験コードを作成した物です(実際は再帰を使って書かれています)。
リスト全体と、リストの最後の要素を保持する方法を説明したサンプルでした。

スレッドを無駄に消費してしまって済みません。しかも非常につたない文章でご迷惑おかけしました。
>>890
一見してシンプルな問題だけど、結構ハマる所だと思いますよ。
なんか迷ったら、実際の処理系のソースコードを読んでみると良いかも。
892デフォルトの名無しさん:02/03/09 06:07
(ΦωΦ)フフフ・・・
;; x は評価されない(Lisp の setq)
(set! x y)

;; x は評価される(Lisp の rplacd)
(set-cdr! x y)
>>890
>>2 に書いてある、
http://www.stdio.h.kyoto-u.ac.jp/~hioki/gairon-enshuu/SchemeNotes/listproc.html
のセルの絵をみたら多少わかるかも。
895デフォルトの名無しさん:02/03/09 10:36
symbol単体は変数じゃない。
ただし、symbolと値は環境というテーブルによって関連付ける事ができる。
それが見かけ上、変数としての役割を果たす。
(define symbol 値)
は環境への追加、すでにsymbolが関連付けされていれば更新。また
(set! symbol 値)
はすでに関連付けされた環境の更新。
「symbolを評価する」ということは、
環境テーブルを読みに行ってその値を取り出すこと。

対してset-car!/set-cdr!はcons構造を書きかえる関数。
関数なので全ての引数が評価される。
(set-car! (cons 1 2) 3)
=>(3 . 2)
(define num 10)
(set-car! (cons num 2) 3)
=>(3 . 2)
896デフォルトの名無しさん:02/03/09 10:51
num
=>10
環境テーブルの構造は言語によって定義されていないが、
ほとんどの教科書には(擬似的に)alistとして表現される。
((num . 10)
 (cons . #<primitive>)
 (set-car! . #<primitive>)
 (set-cdr! . #<primitive>)
 (名前 . 値)...)
set!やdefineはこのテーブルの書き換えを行っている。
897デフォルトの名無しさん:02/03/09 10:57
scheme自身をschemeで記述すると、この問題は明確になるので、
それを実践してる本を参照するのが早い。(有名なのでSICPとか)
898OLEさん ◆l/oKiJ62 :02/03/09 14:12
OLEをSCMに移植してます。
だいたい名前付きで無い引数でのinvokeが動く、程度です。
実装してるインターフェースは

(win32ole:create Name)
(win32ole:invoke obj wFlags method_name arg...)
(win32ole:uninitialize)

のみです。
899OLEさん ◆l/oKiJ62 :02/03/09 14:16
とりあえず名前付き引数をサポートする為に
(win32ole:invoke obj wFlag (arg1 arg2..) ((name1 val1) (name2 val2) ...))

という感じにinvokeを変更して、

(win32ole:WithEvent obj func event_name)

という感じにwitheventを実装するつもりです。

どうしたらいいか良くわからないのがイベントループ回り。
こういうのはScheme的にはどう実装する物なんでしょうか?

ほかに、ここのインターフェースはまずい、とかありますか?
現状ではこんなのが動いてます。

(define ie (win32ole:create "InternetExplorer.Application"))
(win32ole:invoke ie *win32ole:DISPATCH_PROPERTYPUT* "visible" t)
(win32ole:invoke ie *win32ole:DISPATCH_METHOD* "GoHome")
(win32ole:invoke ie *win32ole:DISPATCH_METHOD* "Quit")
(win32ole:uninitialize)
>>899
> (define ie (win32ole:create "InternetExplorer.Application"))
> (win32ole:invoke ie *win32ole:DISPATCH_PROPERTYPUT* "visible" t)
(略)

symbolの方がLisp/Scheme的じゃない? どうせ文字列に蛙の簡単だし。
901デフォルトの名無しさん:02/03/09 15:53
>>899
ぜひexcel1.pl excel2.plのscheme版を作ってほしい(w
私も作りかけのやつ抱えてますが、なかなか面倒なのでほったらかし・・。
他にもそういう人がいたって事でまた再開しようかな。
自分的にはエクセルで帳票が作れれば十分なんだけど、
まだ起動して表示するまでしかやってない。(VARIANTで一旦挫折)
イベントループは自分で回すやつとVBのDoEvent相当があれば良いと思いますが。
あとコールバック関数の継続の入出力は無理っぽいですね。
再度read-eval-loop相当をコールバック関数上で回す必要がある筈。
SCMだとどうなるんだろ。
902デフォルトの名無しさん:02/03/09 16:02
>>900
大文字小文字が区別されるモードがある処理系じゃないとシンボルで使えないけど、
こんな風にできれば便利かもね
(define excel (create-oleinstance "Excel.Application"))
(excel 'visible #t)
(excel 'destroy)
903デフォルトの名無しさん:02/03/09 16:32
(define workbook1 ((excel 'Workbooks) 'Add))
(define sheet1 (workbook1 'Worksheets 1))
こんな感じでしょうか。
やっぱ戻値の振り分けが大変だなあ・・
wtypes.hのVT_*の部分。
904デフォルトの名無しさん:02/03/10 12:58
>>904
帯も保存してあるなんてかなり貴重かも・・。
独自仕様なんだよね。
しかしなんで3だけ売りに出すのか気になる。
>>898 >>901
ここ参考にしてがんばってくれ
ttp://www.asahi-net.or.jp/~kv8s-yjm/another/yjamain.htm
質問です。

(((lambda (x) (lambda (x) (* x 3))) 4) 5)
は、何故 5 が評価され、4 が評価されないのでしょうか?

((lambda (x) (lambda (x) (* x 3))) 4)
のところで (* 4 3) になると思うのですが。
908OLEさん ◆l/oKiJ62 :02/03/10 21:46
>>900

うーん。
シンボルでもいいかな、と最初は思ったんだけど、
コアの部分はCでの処理がすけて見える方がいいかな?と
思ってなるべく素のままにしてます。
シンボルにしたりとか、そういう事は上の層で皆が
勝手にやる方がScheme的かなぁ、と思ったので。

>>901

excel1,2ともすでに出来てるんだけど、ちょいと長い。
ここに貼ってもいいかな?とは思うけど、、、
あとVB知らないのでDoEvent相当、と言われても良くわかりません(w
Scheme的に書くとどんな感じか、とか言ってくれると嬉しい。

>(excel 'visible #t)

クロージャを返すのか。
invokeとPropertyputの区別さえ出来れば
そう難しくも無い気もするけど。
上の層で組むのは面倒かな?

(define create-oleinstance
(define obj (win32ole:create "Excel.Application"))
(define (propertyput name value)
(win32ole:invoke obj *win32ole:DISPATCH_PROPERTYPUT* name '(#value)))
(define (invoke-method name args)
(win32ole:invoke obj
(+ *win32ole:DISPATCH_PROPERTYGET* *win32ole:DISPATCH_METHOD*)
name args))
(define (dispatch m)
(cond ((eq? 'propertyput) propertyput)
((eq? 'invoke) invoke-method)))
dispatch)

で、
(define excel (create-oleinstance "Excel.Application"))
((excel 'propertyput) "visible" t)
((excel 'invoke) "destroy")
とかの方がSchemeっぽい気が私はするのですが。
Rubyは=だったらpropertyput、という区別があるけど、
Schemeだとそういう事も出来ないと思うし。

>>906

そこも見たけど、文字列変換とか逃げてるので
むしろ面倒に見えました。
結局海外のサイトで適当なサンプルコード見ながら
書きました。

909OLEさん ◆l/oKiJ62 :02/03/10 21:47
現在は名前付き引数の実装が終わって、excel3.rbの移植が
終わった所です。
この次に進むには、

1、ループ周りのインターフェース
2、定数周りのインターフェース
3、処理系

を決めてからの方が良さそうなのでサスペンドしてます。
3は今の所SCMだけど、WinのSchemeって何がメジャーなのか
良く知らないので、皆の意見をききたいと思います。
VC++でコンパイルしやすい処理系の方が、
後のActiveScript化(やる人がいるかは知りませんが)等
との関係からいい気もしますが、そういう事も良くしら
ないので。

定数周りはRubyの実装しか見た事無いのでScheme的には
どうしたらいいのか良くわかりませんでした。
Rubyはクラスにロードしていました。
>>907

((lambda (x) (lambda (x) (* x 3))) 4)

この最初のxは何にも使われて無い気が。
((lambda (x) (lambda () (* x 3))) 4)
こういうつもり?
>>910
Scheme のテキストで、lambda 式の解説にあったのを殆どそのまま
写したものです。
自由変数と束縛変数と言う概念を交えて説明してあるのですが、さらっと
説明してあるだけで、良く分かりません。

最終的にその式はこのように変換され、解が 15 になるらしいのですが、
((lambda (x) (* x 3)) 5)
その過程が良く分かりません。
912デフォルトの名無しさん:02/03/10 23:57
> (((lambda (x) (lambda (x) (* x 3))) 4) 5)

((lambda (x) (lambda (x) (* x 3))) 4)
この時点で始めの lambda 式の x に 4 が入るが、
この関数はその x の値を無視して
(lambda (x) (* x 3)) こういう procedure を返す。
で、この (lambda (x) (* x 3)) に 5 がわたされるから
15 になる。

始めの x はひっかけ。
913901:02/03/11 00:04
>>908
VBのDoEventはMFCのPumpMessagesや昔のYieldなんとかと役割は同じです。
ところでOLEのイベントってhook関数のことですか?
まだイベントまで考えが及ばないです。

>(define excel (create-oleinstance "Excel.Application"))
>((excel 'propertyput) "visible" t)
>((excel 'invoke) "destroy")
そうそう、こんなのがいいです。
デフォでclosureを返して呼び出しはユーザーに任せると。
インスタンス独自の専用メソッド作って、
(excel-visible #t)とかやるのはユーザーの責任と言うことで。

もし移植を考えるなら、DLLかなんかでFFIの部分だけ作って、
処理系毎の初期化スクリプトやなんかで差分吸収するしかない気がします。
とりあえず比較的メジャーなGuile/SCMで使えれば問題ないと思います。
DrSchemeにはすでにMysterX?というモジュールがあるみたいだけど詳細不明。
cygwinで動作する処理系もいくつかある様なので
最低限、DLLさえ見えれば使用可能って形になるといいと思います。

自分はまだこんなの作ってExcelが表示できたと喜んでる状態です・・
(co-initialize 0)
(define excel (ole-create-instance "Excel.Application"))
(ole-invoke excel "Visible" DISPATCH_PROPERTYPUT 1 (ole-object->variant #t) (ole-make-variant))
(ole-destroy-instance excel)
(co-uninitialize)
914901:02/03/11 00:15
915901:02/03/11 00:19
>>912
成る程。内側の (lambda (x) (* x 3)) がそのまま返されるのですね。
解説どうもありがとう御座いました。
917OLEさん ◆l/oKiJ62 :02/03/11 01:11
>リンク

いろいろ調べたんですが、ソースだけコピペして周ってたので、
リンク残ってません。すみません。

現在win32oleのコードとインストール手順を
http://nanasidayomon.hoops.ne.jp/
に置いときました。かなり手抜きですが(^^;
サンプルもie.rbとexcel1.rb,excel2.rb,excel3.rb
の移植版が入ってます。
918OLEさん ◆l/oKiJ62 :02/03/11 01:38
>>901

お、そっちも結構似た所まで来てますね。
dll化は結局、
SCMのオブジェクト<->VARIANT
の変換が肝になるのに、これが処理系依存なので
いまいちな気がするんですが。

イベントは、たぶんhook関数の事だと思います。
Ruby版のソースしか読んで無いので良くしりませんが(^^;
イベント周りを考えてる所です。
919デフォルトの名無しさん:02/03/11 06:09
macro の力を理解して悟りをひらきたいので、
macro 活用法を学べる、良い本やサイトを教えれ。
なんかレベル高いなぁ。まったくわからないことばっかりだ。

>>919 は気になる。「普通のやつらの上を逝け」だっけ?にも lisp といえば
macro だ。みたいなこと書いてありましたね。いろいろ調べてるけど今いち分
からない。でも elisp のパッケージで関数の定義見ようとしたら実はマクロ
だったっていうの発見してちょっと感動した(w
macro っていうのは special form でしかできないような
構文を自分で作るってことだよ。

(if (a) (b) (c))

(a) が真で (c) が無限ループするような時、
if が special form かどうかでこの文の動作がかわる。

他にも macro の使い道はあるけど。
>>919
Paul Graham の On Lisp
923901:02/03/12 02:10
>>917
うまくまとまってますね。(build.scmが凄すぎ)
>(define get_and_inv
> (+ *win32ole:DISPATCH_METHOD* *win32ole:DISPATCH_PROPERTYGET*))
この辺のフラグの組み合わせ法則がよくわかりませんでした・・
本買ってこないとだめかも。

こちらはなんとかセルに値を設定するまではできる様になりました。
あとはページ設定や罫線が引けたら自分としては満足です(w

VARIANTについてですが、include/oleauto.hに定義されてる、
VariantChangeType()や
VarXXXFromYYY() (YYY型からXXXへ)
で都合の良い型(Date->Stringなど)に変換できるみたいなんで、
VARIANTをほぼそのままscheme-objectにして
oleaut32.dllをdynloadしてapiを直呼びって手もあるなと思いました。
参照変数を引数に渡したい場合とか。(そんな要求があるのか不明ですが)

あと、ここ見たら
http://member.nifty.ne.jp/hippo2000/perltips/index.htm
定数を読みこむ手段がある様ですね。
メリットは自分で使う定数を再定義する必要が無い事?
namespaceの無い言語だとそのまま環境に展開するのは抵抗があるから、
(ole-const->value "xlThin")みたいなことする必要ありかも。
924919:02/03/12 06:26
>>921
「special form でしかできないような構文を自分で作る」てのはわかります。
でも単にそれだけじゃ、そんなにすごくないような気がします。
感動や悟りまではいかないような。。。

「他の macro の使い道」というのが気になるので教えてくだされ。

>>922
情報、サンクスです。
というか、以前から読みはじめてはいたんですけど、
英語っちゅうせいもあって、なかなか読み進まないんですよ。
だからこそ、macro の魔力を理解して、読み進む動機づけにしたい。

(macro に期待しすぎかなあ)
「なんでもマクロ」きぼんぬ?
>>924
本探すより、
処理系の拡張構文の実装のほとんどはマクロだから参考になるよ
927922:02/03/12 15:07
>>924
そうでしたか。自分も読み切ってはいないんですけど。
自分は、コードをより handy にしたい場合によくマクロを使います。
例えばプログラムのあらゆる箇所で同じ様な処理を行う場合とか、
コードの見た目が美しくない時などですね。

いずれにせよ、関数 (手続き) でできる事は関数で済ませますし、
そうでない場合はマクロを使います。無理にマクロを使う必要は
ないと思いますよ。関数だけでもかなりの魔力を持ってますからね。
928デフォルトの名無しさん:02/03/12 20:40
Linux で scheme な人って処理系は何を使ってます?
emacs で elisp をいじるみたいな環境が理想なんですが、guile emacs 使う
のがてっとり早いですかね。guile + emacs で M-x run-scheme はいまいち使
いにくいんですが。あと windows 環境についてもできたら聞きたいです。
;; 今 SICP のオンライン版を解読しつつ勉強中です。
929デフォルトの名無しさん:02/03/12 23:18
Gauche は "ガウチェ" と読むと思ってたよ。
ゴーチエ、ゴーシェ、ガウチョ、と色々悩んだ末だったので、もうガウチェとしか
読めない頭になってしまった。

>>928
要はエディタのマクロを scheme で書きたいって事ですか?

scheme のフロントエンドにエディタを使いたいなら emacs 使えば良いよね。
あと、NGSCM は、使った事無いけどちょっと興味あり。
http://aten.aial.hiroshima-u.ac.jp/Reprints/NGSCM/ngscm.html

>>705
XSCML きぼん。
930928:02/03/12 23:38
>>929
エディタのマクロを書きたいというわけではなくて、scheme の勉強をしたい
んです。M-x run-scheme はちょっと使いにくいんで他にいい方法がないかな
と。emacs 上で elisp 動かすみたいに scheme が動いてくれたら嬉しいんで
すけど、それをやるなら guile-emacs ですかね。NGSCM というのをちょっと
調べに逝ってきます。
931929:02/03/13 00:01
>>930
これも使った事ないんだけど、>>352 は如何?
便利だったら教えてね。
932836:02/03/13 00:43
>>930
836 で同様の質問をした者ですが
>>352 で紹介されているやつはすごくいいです。

lisp-interaction-mode とほぼ同様の感覚で
Scheme が使えます。例えば S 式を書いて
[C-j] で評価することができます。さらに
M-tab で補完もできるようになります。
933836:02/03/13 00:48
>>928
ちなみに当方の環境は
Windows-2000 + cygwin + guile-1.5.4 + Meadow + emacs-guile
でかなり快適に使えています。
934928:02/03/13 00:52
>>932
あ、禿げしく外出だったんですね。すみません。

でも guile1.4 が make できない。version1.4 以上じゃないといけないんで
すよね...
$ ./configure
$ make
$ su
$ make install
でできないとお手あげな厨房なんですが...
935928:02/03/13 01:01
あ、FAQ にありました。またやりなおしに逝ってきます。
>>934
環境が書いてないのでなんともいえないけど、
Linux なら rpm か deb がどっかにあるんじゃないの?
Windows なら cygwin 用の rpm が Project HeavyMoon
>>835 にあるよ。
937928:02/03/13 01:46
>>936
環境は Redhat7.2 と windows2000 + cygwin です。
FAQ にあったとおり ibguile/net_db.c, line 85 をコメントアウトして
guile の make は成功しました。

rpm も探したんですがいろいろあってわけわかんなかったのと src.rpm のイ
ンストール方法がわからなかったので(汗

emacs-guile もすごくよさそうですね。これから遊んでみます。
みなさんいろいろと情報ありがとうございました。
既出の質問をしてしまってすみませんでした。
938928:02/03/13 01:51
>>937
すみません。libguile/net_db.c, line 85 です。
コピペしたら 1文字抜けました。

>>931さん、>>932さんが書かれている通りすごく便利そうですよ :-)
>>924
例えばファイルや DB などで
「オープン - 読み書き - クローズ」
みたいなコードは頻繁に現れるけど、
マクロがあれば以下のようなコードを

(setq stream (open "foo.txt"))
;; stream に読み書き
(close stream)

下のみたいに書くことができるようになるけど

(with-open-file (stream "foo.txt")
 ;; stream に読み書き
 )

こう書けると便利だよね?
クローズし忘れもなくせるし。
(ちなみに実際の with-open-file の定義は上とは違うよ)
940939:02/03/13 02:26
実際の with-open-file はこんな感じだと思う。
処理系によってはもっと下のレベルで実装され
ているかもしれないけどね。

(defmacro with-open-file ((var &rest open-params) &body body)
 `(let (,var)
   (unwind-protect
     (progn
      (setf ,var (open ,@open-params))
      ,@body)
    (close ,var))))
Gauche は「藤原嘉藤冶」と読みます。
>>941
それが既に読めないよ・・・。

vi 遣いに優しい scheme 実行環境は無い物か。
シェルのラインエディティングは emacs 互換モードを使ってるから、別に良いけど。
944デフォルトの名無しさん:02/03/13 20:20
FFの赤マ同志が持ってるのはマインゴーシュ
945デフォルトの名無しさん:02/03/13 20:31
FFとは限らないだろ
946デフォルトの名無しさん:02/03/13 20:43
>942
じゃあemacsみたいにschemeでvi作ってよ
LISP対scheme(=emacs対vi)
みたいでおもしろいじゃん
947デフォルトの名無しさん:02/03/13 20:48
よろしければ教えてください。
SCMで実行している環境の持っている環境変数の一覧を得る方法を
探しています。ご存じの方がいらっしゃればよろしくお願いします。
Unix環境で使っています。
>947
getenvじゃだめなの?
>>947
(system "env")
でどう?
950947:02/03/13 21:30
getenvだと逐一指定しないといけないのが困ります。
想定していない分も表示できる方法はないでしょうか。
951947:02/03/13 21:32
>>949
ありがとうございます。
これをリストに直せるか試してみます。
952947:02/03/13 21:42
上手く行かないようです。名案のある方がいらっしゃればお願いします。
何度もすみません。
Guile だと (environ) で全部出るけど、SCM は知らん。

>>952
#\newline で split すればいいじゃん
>>946
是非作ってみたいんだけど、Gauche に curses とか readline みたいな
ライブラリってあったっけ? slib にならあるかな。
956947:02/03/14 01:52
>>964
あまりSchemeから出たくないですが、それしかないでしょうかね。。。

( ("TERM" . "kterm") ("PWD" . "home/hoge") ......)のように連想リストの形にしたい
と思っています。Guileも入れてみたので、こっちでも試してみます。

>>955
すでにご存じだと思いますがどうぞ。
http://tanaka-www.cs.titech.ac.jp/~euske/scm/oldindex.html
957953:02/03/14 02:03
>>956
Guile だとこんな感じかな。もっと良いの書けそうだけど。

(map (lambda (str)
    (call-with-input-string str
     (lambda (port)
      (let* ((key (read-delimited "=" port))
         (val (read-delimited "" port)))
       (cons key val)))))
   (environ))
958デフォルトの名無しさん:02/03/14 09:03
>>955
描画部分はviから奪ってくればよし
959デフォルトの名無しさん:02/03/14 12:16
scheme を使った階乗の計算で、
(define fact
(lambda (n) (if (= n 0) 1
(* (fact (- n 1)) n))))

は末尾再帰を使うと
(define fact-tail
(lambda (n x) (if (= n 0) x
(fact-tail (- n 1) (* n x)))))

のようになるらしいのですが、どのように考えたら下の式のようなものが書け
るようになりますか?

末尾再帰って禿げしく便利そうだということをよく見かけますが、実際に自分
では書けそうな気がしません。

;; 末尾再帰が「引数つき goto」っていうのも、再帰と goto がどう結びつく
;; のかよくわからないんですが。
960947:02/03/14 12:16
>>957
ありがとうございます。
求めていたものが得られました。
これからも精進します。
961 :02/03/14 12:19
     |Д`)
     |⊂  ダレモイナイオドルナライマノウチ
     |     


           Å
       ♪ / \
     ♪  ヽ(´Д`;)ノ ランタ ランタ
         (  ヘ)   ランタ タン
          く     ランタ タンタ
                 タン

          Å
     ♪   / \
        ヽ(;´Д`)ノ ランタ ランタ
      ♪  (へ  )   ランタ タン
            >   ランタ タンタ
                 タン
>>959
http://www.stdio.h.kyoto-u.ac.jp/~hioki/gairon-enshuu/SchemeNotes/recursive.html
これとか読んでわからなかったら死にましょう。
964デフォルトの名無しさん:02/03/14 21:26
mit scheme で cmu-scheme.el でなく xscheme.el 使えば
emacs の lisp-interaction-mode に近くなるよ。
あと mit scheme だけでできてる emacs like editor も
面白いかも。elisp と scheme が入れかわったような感じ。
emacs ほどボリュームはないけど拡張性は同じくらいある。
965デフォルトの名無しさん:02/03/14 23:39
guile-1.7.0 を使っているのですが、readline を使おうとしたら

guile> (use-modules (ice-9 readline))
ERROR: In procedure dynamic-link:
ERROR: file: "libguilereadline", message: "file not found"
ABORT: (misc-error)

となってしまいます。/usr/local/lib の下に libguilereadline.a や .so な
どのファイルがあるのですが、何か設定しなければならないのでしょうか。
Info にはとくに何も書いていないのですが。
966デフォルトの名無しさん:02/03/14 23:49
>>955
vimにschemeを組み込むってアプローチもあると思う。

vim-perl - Vi IMproved - with perl support
vim-python - Vi IMproved - with python support
vim-tcl - Vi IMproved - with tcl support

好きな言語ないから素のvim script使ってるけど、schemeがあれば使う。
>>347 に regex と readline が必要だったって書いてありますね。
readline は rpm で入ってたけど regex がなかったので、
regex-0.12.tar.gz 入れたけどやっぱりだめだ。。。
>>965
まずエラーの原因を特定する。メッセージのとおりなのか、それとも誤報なのか
コード公開されてんだからわかるっしょ。デバッガもあるし、
truss/strace/ltrace系のツール使ってもわかるだろうし。
メッセージのとおりの原因だったら何でダイナミックリンク失敗するか考えてみ。
ld.so.confとか確認したか?
そろそろ次スレを立てれよ
970デフォルトの名無しさん:02/03/15 01:26
現実問題として、vi-schemeなんかがんばって作っても使う人いないと思う。
ただでさえviなんだからさ(w
971965:02/03/15 01:43
>>968
エラーの原因ですか、、
strace と ltrace というのを今初めて使って調べてみましたが何だかよくわ
からないです。
とりあえず分かる範囲で、/etc/ld.so.conf に /usr/local/lib と
/usr/local/include/libguile を追加して /slib/ldconfig してみましたが状
況は変わりませんでした。続きはまた明日調べてみます。
973953:02/03/15 01:52
偏見で申し訳ないが、vi ユーザに Lisp/Scheme は合わない。
閉じ括弧だけの行を作ったり、タブ文字でインデントするような
人達だから。Haskell でも使ってなさい。
>>965=967=971
ldd -V guileしてみ
975vi-lisper なめんな:02/03/15 01:57
>>953
vi -l してみ
976965:02/03/15 02:22
>>974
レスありがとうございます。でも新しい問題が発生しました。
$ ldd -V guile
ldd: unrecognized option `-V'
Try `ldd --help' for more information.
となってしまいます。man ldd には確かに -V オプションの説明があるのですが。

$ ldd --help
Usage: ldd [OPTION]... FILE...
--help print this help and exit
--version print version information and exit
-d, --data-relocs process data relocations
-r, --function-relocs process data and function relocations
-v, --verbose print all information
Report bugs using the `glibcbug' script to <[email protected]>

となっています。ldd なんていじってないのになぁ。man とバージョンが違う
なんてことはないですよねぇ。OS は Redhat7.2 です。
;; 板違いになってしまってすみません。
977デフォルトの名無しさん:02/03/15 03:19
>>976
あのさ、>>965のエラーって、
ld.soじゃなくて、guileがlibdlを使って、(dlopen(3)ね)
moduleが必要になったときにやるdynamic linkingだよ。
libguilereadline.so*があるか、
あるならdynamic-linkが使うpathがあってるか調べなよ。

readline.scm:
(dynamic-call "scm_init_readline" (dynamic-link "libguilereadline.so"))
こういうことになってるから。
978965:02/03/15 10:52
In guile-1.4 you could just type into a repl:
(use-modules (ice-9 readline))
(activate-readline)

This doesn't work in guile-1.5.x out of the box because the default
curent module for the repl is now (guile-user). The workaround is to
place in your .guile file:
(define-module (guile-user))
See NEWS for more info.

もしかして、1.7 では使えないってことでしょうか。
今 windwos2000 + cygwin + guile-1.5.4 なんですが、同じエラーが出ます。
cygwin だからだめなんだと思って昨日はあきらめてたんですが。

LD_LIBRARY_PATH=/usr/local/lib
と libguilereadline.a と libguilereadline.la がある場所を指定してみた
んですがこれは関係ないようですね...
979965:02/03/15 23:22
あ、guile 関係のファイルを一回全部消してからインストールやりなおした
ら readline 使えるようになった。よかったぁ。
>>978
cygwin では "guile" コマンドの make 時に libguilereadline.a
を一緒にリンクしてしまえば readline が使えるようになるよ。
981デフォルトの名無しさん:02/03/16 01:45
Gauche でシェルのコマンドを実行するのは (sys-system "command")
でできるのね。

>>973
tput 等使ってムフフなスクリプトを書いていますよん。
そろそろ次スレだね
いちおう、次スレです

LISP Scheme Part4
http://pc.2ch.net/test/read.cgi/tech/1016211619/
984 :02/03/16 03:11
age
>984
次スレあるのに。
あまのじゃくさん?
;; あまりに低レベルなのでこっちに。
nil でなければ t にするのに適当なのありますか?
(not (null hoge)) ってのはチトカコワルイ
>>986
nilでなければtにするのがnotだと思うんですけど……。
ifの代わりならunless、とか?
  ∧_∧
 ( ・∀・) ニヤニヤ
 ( 1000 )
 | | |
 (__)_)
コソーリ
マターリ
ヒソーリ
コソーリ
マターリ
ヒソーリ
コソーリ
(・∀・)アト4!!
∀・)アト3!!
・)アト2!!
 サッ
)彡
10001000 ◆h.gHK9LE :02/03/19 14:42
                / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
         Λ_Λ <  コソーリ
        (´∀` )  \__________
  ∧ ∧   (___,,)_     
 (.,゚Д゚)/ ̄ ̄ ̄ ̄ /|     
 │ /∧ ∧    //||
 (/___(   ,,) _//  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ||  ,,/  つ ||/   <  1000!!
 ||  (__丿  ||      \__________
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。