LISP Scheme Part8

このエントリーをはてなブックマークに追加
意味的には「見たまんまの」って感じでしょ?>レキシカル
字句的が一番だろ。
レキシカルなんて、意味わかんねーよ。

でなかったら、textualだな。
ちょっと質問なのですが、
gclから他のコマンドやシェルスクリプトを呼び出して、
その標準出力を文字列としてgcl側で受けとるということは
可能なのでしょうか?

イキナリでごめんなさい。
マニュアルに載ってるんじゃない?
systemとかprocessって名前で。
とりあえず,外部コマンドを実行してストリームに出力する関数さえ
見つければ with-output-to-string 使って簡単にできるだろう.
gcl 手元にないけど CMUCL だと↓みたいな感じ.
(with-output-to-string (s) (run-program "ls" nil :output s))
907899:03/11/19 20:47
「字句解析的(コンパイル時に決定される)スコープ」て
ちゃんと書いてあった。(my変数の説明)
別に訳者を悪く言うつもりじゃなかったんだが…すまん
マニフェストとかよくわからんカタカナ並べられるよりは
manifesto と書いてもらった方がしっくりくる。
カタカナ英語の意味には日本人の感違いしたニュアンスが入ってる
ことがよくあるんで、よほど一般的な単語でない限り使うなと思うね。
909国研:03/11/20 00:01
感違い → 勘違い
日々の授業とレポートと学園祭でデスマ入っているOn Lisp訳者です.
# 3時4時までJavaです...

術語は悩みの種です.いっそ原語表記にしちゃおうかとも思います.
(売り物の本では「訳してないぞ」的批判を避けるために原語を取り除くのでしょうが,
私の場合はその心配はありません.ちなみに現段階でも並記してる部分もあります)

ただ片仮名9文字の「レキシカルスコープ」より漢字片仮名交じり7文字の
「字句的スコープ」の方が目に優しいと思います.その点は他でも考慮しました.
私の持っている培風館のCの本ではscopeは「有効範囲」でした.それだと漢字のみ7文字.

ただ,今は先へ先へと進めるのが優先なので (最近進んでない) その辺は後回しにさせて下さい.

そもそもなぜlexicalが一般化したのでしょう.私ならsyntacticかcontextualにしますね.
初めて「レキシカル」という言葉を知ったときは,しばらく理解できませんでした.
lexical(辞書の,語彙の)は意味以前の,文字同士の関係に関する言葉ではないでしょうか.
まあしょせん素人ですけど.lexical, syntactic, grammatical, semantic...

# lexicalで擦れが盛り上がっててビクーリ
911国研:03/11/20 00:14
lexically delimited scopeって感じ?
>>905
>>906

確かにgclの場合はsystemという関数があって実行できるのですが、
ストリームを指定することができず、標準出力にたれ流しになってしまいます。

system関数についてのマニュアルもあさったのですが、
何分"system"というそこかしこにある単語のためうまく検索できませんでした。
(そもそも載っていないような気も?)

もうちょっと調べてみます。ありがとうございました。
>>912
> ストリームを指定することができず、標準出力にたれ流しになってしまいます。

これでいけるんじゃねーの? declare は書かなくても大丈夫だけど。

(with-output-to-string (s)
(let ((*standard-output* s))
(declare (special *standard-output*))
(system ...)))
914デフォルトの名無しさん:03/11/20 11:27
ACL購入記念あげ
915914:03/11/20 11:36
あれ?規制されてたと思ったのに書けちゃった。くだらないこと書いてごめんなさい。

仕事柄プログラミング言語に関する各種の本を読んできましたが、「静的スコープ」
や「レキシカルスコープ」とはいいますが、「字句的スコープ」という言い方
はしないようです。この文脈での"lexical"という英語と「字句的」という日本語は
微妙に意味が違うと思いますね。じゃあ何かいい訳は無いのかと言われても困り
ますが。私が以前ある文書を翻訳したときは、”lexical scope"は全部「静的スコープ」
にしてしまいました。元の文を尊重するという点ではだめなのかもしれませんが、
この場合意味するところは同じなので、変な訳語を創出するよりよく使われている
訳語にあてはめてしまう方が誤解がないと考えたのです。
時代は性的スコープだろう
覚書。
scopeとは、ある名前があるモノを束縛(binding)しているとき、その束縛が見える範囲。
extentとは、ある束縛関係が生き延びる範囲(lifetime)。

dynamic binding = dynamic scope + unlimited extent 
lexical binding = そんな用語あったっけな。

Emacs Lisp は変数、関数とも dynamic binding だと elisp マニュアルに書いてあったと思う。
Common Lisp の変数は 何も言わなければ lexical scope。special variable として
宣言すれば dynamic scope。関数については忘れた。
Scheme は関数と変数の name space が同一。そしてlexical scope で unlimited extent だとR5RSに書いてあった。

shallow binding, deep binding は実装上のテクニック。
>>917
scope と extent の説明で使われている「範囲」という言葉の2つの意味。
1つめは、ソースファイル内でのここからここまでという意味。
2つめは、ある関数や構文(let, flet, labels, ...)が実行中である、
この場合の実行中とは、その関数が他の関数を呼んでいる(そして
それが、また別の関数を...)場合も含める。

>>918
ソースファイル上での範囲は「静的な」範囲で、
関数の実行時の呼び出し関係における範囲は「動的な」範囲。
うざい。
Common Lispの開発環境で、Emacs lisp用のedebugみたいなソースレベル
デバッガがついたものはありますか?

Emacsのilispパッケージにはなさそうだし、昔ためしたAllegro Common Lisp
のWindows上のIDEにもなさそうでした。
>>914
おっ金もっち〜。
前スレ、html化してもらいました。
まあ、このスレもそろそろ落ちそうですが。

LISP Scheme Part7
http://ruku.qp.tc/dat2ch/0311/20/1042167213.html
>>893 ある意味、神というか才能だろうな。かなり数の居た暇にあかせて宿題でも解くか〜
という連中をたったの1レスで殲滅するとは…。大物になれるよ。ほんと。
>>924
>>894 じゃないか?
>>913

コードまで書いてもらえるとは・・・。ありがたいです。

実際にやってみたのですが、やはり標準出力にたれ流しになってしまい、
式自体の値は""になってしまいました。

現在はとりあえずの処置として、コマンドの出力をリダイレクションして
そのファイルを読み込むようにしていますが、不格好なことこの上ない感じです。

もうちょい調べてみますね。
>>926
>>913 がだめだとするとその関数くさってるね。Lisp コードレベルではどう
しようもない可能性がある。それと "(system " とかで検索した?
ここで聞いたらひどいかもしれませんが、日本でLISPはなぜ人気がないのでしょうか?
人気がない=糞言語という意味ではありません。メジャーじゃないんではないかという疑問です。
>>928
括弧だらけで気持ち悪いからだろ
(●)(●)(●)(●)(●)
>>928
日本以外では人気があるとでも?
>>931
漏れもそれが知りたい。
アメリカの話しか聞いたことないよね。ヨーロッパとかアジアではどうなんだろ?
>>928
俺もずっとそう思ってました。

Lispについていろいろ解ってくると、
「なんでこんなに面白くてパワフルな言語なのにみんな使わないんだろ?」
と疑問を感じることが多いです。

身近な友人にデモを交えてLispを説明したことが何度かあるのですが、
みんなLispに対して「処理が遅い」「表記が特殊で難しい」
「実績がない」などの誤解をしていることが多いようです。

あと、自分の使うプログラミング言語に対して
わりと保守的な姿勢を取る人間が多いんですよね。
「自分の使ってる言語はメジャーだから良い言語なのだ」という
盲信がけっこうあるような気がします。
>>933
フランス: CMUCL のデベロッパーの Eric Marsden
イタリア: EncyCMUCLopedia の編集者 Paolo Amoroso とか arnesi, FiveFM の Marco Brainger
ドイツ: CL-PPCRE の作者の Edi Weitz

とかを始めとして、ヨーロッパ圏のデベロッパーも結構居るだろ。

http://www.cliki.net/xearth

まぁ、928 よ。C/C++ ほどメジャーではないのは常識だぞ?
>>927

以前に試したのですが、googleだと"("が無視されてしまうので"system"という単語が
検索されてしまってうまくいかなかったです。
gclのInfo内も検索してみたのですがひっかかりませんでした。

あとgclにはhelp機能があって「(help '関数名)」とかやると
その関数の説明を表示してくれるのですが、
それでもダメですね。

gclってLisp処理系としてはあまり良くないのでしょうか?
CLOSも実装されてないみたいだし、ドキュメントも書きかけの
項目が多いし・・・

こりゃもうcmuclかclispに乗り変えるしかないですかね。
>>934
括弧は伊達じゃない事に気づくのにどれくらいかかった?
漏れは lisper の開発風景を実際に見るまで、括弧ウザーと思ってたよ。
>>936 gclにこだわる理由が何かあるのなら、子孫である EcoLisp(ECL-Spain)
なんかどう?
939938:03/11/21 13:47
> ECL-Spain, a member of the KCL Family, is a Common Lisp implementation forked from ECL.
> Since 2001 the source code of ECL-Spain becomes the official branch of the family,
> acquiring the name ECL and superseding the out-of-date implementation ECoLisp.
ということみたいだね。
ちなみに、ちょっと前のことだけど、CLOSみたいなのも付いてたよ。
GNU Info形式の英語で書かれたマニュアル付きでした。
>>933
> アメリカの話しか聞いたことないよね。ヨーロッパとかアジアではどうなんだろ?
Lispを使う側じゃなくて、作る側の人だけど、GNU Clisp はドイツ人が開発しているでしょ。
clispのソースを読もうと思ったけど、コメントにドイツ語が結構あってめげました。
アメリカでも AI winter の影響で「Lisp」という単語がトラウマになっている
人がいると聞いたことがあるよ。

Franz社が「Lisp」という言葉を前面に出したがらないなんて噂も聞いたことあるし。
今はどうかしらないけど。
>>941
たぶん,その Franz の噂ってのは Paul Graham の Being Popular ネタだろうな.
http://www.franz.com/about/bios/fkunze.lhtml とかの話だろう.CLOS は出てくる
けど,Lisp という単語が出てこない.でも Franz 社のページにはしっかり今も昔も
CLOS, Common Lisp という単語が出てくるよ.
>>937
Lisperの開発風景を見て何を思ったの?
暇があるときにLispに関わりのある、または、あった人のページをgoogleって
遊んでいます。以下の人は割りと有名だと思いますが、その他の人で面白そうな
人がいれば教えて下さい。

古株:竹内郁雄、和田英一、萩谷昌己、湯浅太一
敬称略
>>943
それまで俺は、いちいち対応する括弧を入力してから中を書いていた。つーかそーゆうもんだと思ってた。
C とかで {} 対応させてから中書いてたから。で、ある日 Emacs スレで
http://pc.2ch.net/test/read.cgi/unix/1066719492/16
を見かけて lipser に操作画面を見せてもらったわけだ。S 式単位の編集を見て、な
るほど、括弧はただの無駄ではなかったんかと思い至ったわけ。

開発環境もおどろいたなぁ。コンパイラの警告やエラーの位置にソース上で下線が引
かれて、カーソルを合せると警告内容が表示されたりとか。漏れは C++ 派だったし、
警告なんて行数とファイル名くらいだと思ってたからビクーリした。
>>944
中西正和、黒川利明、川合史朗
あまり思いつかん・・・。

>>945
(define ... (let ... (cond ... (else ...
ってあったら括弧入れるごとに
else,cond,let,define
よし全部閉じた。
ってやるもんじゃないの?
>>945
>開発環境もおどろいたなぁ。コンパイラの警告やエラーの位置にソース上で下線が引
>かれて、カーソルを合せると警告内容が表示されたりとか。-snip-

これって、Emacs上での開発環境だよね?
聞いた話だけど、Symbolics なんかの Lisp machine 上での開発は、
もっとずっとすごかったらしいです。どうすごいのかは、comp.lang.lisp
でたまーに話題になったりします。

とは言うものの、C, C++, Java なんかの統合開発環境(IDE)も最近はいい線
いっているという話もありますな。
948943:03/11/21 16:24
>>945
なんだそんなことか…
>>948 初心者にとっては、そんなことがLispを始めるときの第一関門になると思う。
>>947
はい。Emacs でした。警告内容も「引数が VECTOR で SIMPLE-ARRAY じゃないから配
列アクセスの最適化ができねーYO!!」といった最適化のヒントと「未定義の変数 Y
ってなんだYO!!」といった警告とでは下線の色が違ってて見やすかった。
VisualStudio にもあーゆうのが欲しいなぁ。

Lisp マシンですか。やっぱ開発環境も凄かったのかなぁ。

>>948
妙な期待をさせてしまったようで申しわけないです。
schemeを理解しよーとして、脳内でCに変換中。
空リストはNULL、nilは(他のLISPとちがい)単なるシンボルとして扱ってよいのかしら?
nilなんてない。
Cに展開しようとする辺り、まだ思考回路がこっち側にスイッチしてなさげ。
そのうちScheme/Lisp自身で考えられるようになれるようがんがれ。
954951:03/11/21 20:30
説明読んでていきなりnilとか書いてあったんで、面食らってるところなんですー(;_;)
シンボルnilがソースリスト中に現れたら、
schemeでは特別な意味を持たないが、
他のLISPでは特別な意味を持つでよいのかしら。

>>953
へい、がんがりまし。
awkで書かれたわずか500行のLispインタプリタ
awklispを読めばLispが理解できる
ttp://www.accesscom.com/~darius/




かも?
957955:03/11/21 22:07
>>956
955は>>951の「schemeを理解しよーとして、脳内でCに変換中。」に対するレスです。
コードを脳内でCに置き換えるよりも、脳内にインタプリタを内蔵してしまうほうが早いので。
scheme で
つい (setq a nil)
(if a hoge)
とかやって失敗する。
>>954
>schemeでは特別な意味を持たないが、
>他のLISPでは特別な意味を持つでよいのかしら。

Common Lisp と Emacs Lisp では、空リスト ()とシンボル NILは
Lispのオブジェクトとしては同一。(eq '() 'nil) => t
そして真偽値における偽値として使用される。
(if '() '1 '2) => 2
(if 'nil '1 '2) => 2
nilも()も(って同一物だが)は評価(evaluate)すると自分自身になる。
nil => nil

Schemeでは偽値として#fを使う。
(if '() '1 '2) => 1
(if 'NIL '1 '2) => 1
960959:03/11/22 14:34
しまった... NIL と nil を混ぜて使ってしまった。
961スレ違い:03/11/22 16:59
1ch.tv のLisp/Schemeスレはさびれているな。
というか1ch.tvって商売としてなりたっているのか?
そもそも1ch.tvというのが何なのかさえわかりませんが(w

ところでそろそろ新スレじゃないですかね。
Lisp歴は多少あるのですが、2ちゃんねるは初心者の者です。
新スレへの移行にあたって何か協力できることは無いかなと思っているんですが、
そこらへんの勉強をするための情報はどこにありますか?

とりあえず、新スレが立ち上がったら参考文献なんかの情報を補充したいと
思っています。
>>963
次のスレ立ては藻前に任せる。ガンガレよ。
966デフォルトの名無しさん:03/11/23 22:22
Lispのことはよく知らないオレに「マスターしたときの素晴らしい悟り」
というのを簡単に教えていただけませんか?

それと
http://www.shiro.dreamhost.com/scheme/trans/beating-the-averages-j.html
「LispのプログラムコードはLispのデータオブジェクトから出来ている。
それは、ソースコードは文字列で出来ていて、文字列は言語でサポートされている、
というようなつまらない意味じゃない。」
というのは、他のインタプリタのevalとは違うんでしょうか。

現在はjavaとかrubyあたりやってりゃいいかなと思ってるんですが
素晴らしい悟りが本当にあるならLispにチャレンジしようと思ってます。
マスターしないと教えてもわかんないよ。ガンガレよ。
>>966
そういう姿勢でいる限りおまいは何も得ることはできない
963じゃないけど立てました

次スレ

LISP Scheme Part9
http://pc2.2ch.net/test/read.cgi/tech/1069594582/
LISPのevalは単なるリスト処理なわけよ。
evalから見たら、いきなりリスト化された構文木が手元にあると思っていい。
後は意味解析して評価するだけの状態。
他の言語のevalだとまず見えないし、触れない。
>>969
>12 笑た。
それって単に人間プロセッサで構文木を作ってるだけじゃないの?
だとしたら人間にとって自然じゃないことをやってるから非効率だと思うが?
>>973 マクロで構文は人間向けに調整されている。反復系の構文も
マクロ展開すると条件分岐と goto になるが、書く人間は意識しないしな。
for(int i=0; i<10; i++) { ... }
(dotimes (i 10) ...)
を見て、下のほうが人間にとって自然じゃなくて非効率だと思うなら仕方が無いが。
大袈裟に「人間プロセッサ」って言う程頭使う様に見えるのか。
C言語 f()
LISP (f)
これだけの違い。
>>973
それ言ったら、他の言語を習得することも人間プロセッサって言わないか?
guile で define-syntax が通らん…
>>977
いや普段前置記法で思考してないから

中置記法の数式を Lisp の数式に置き換えるのに手間取る
>>966
まずreadで読み込んでLispで簡単に扱えるデータにしてる。
で、いじくるなりなんなりしてevalで評価してもらう。

こうするとevalではreadがやってくれるから文字列の解釈も必要なく
データの操作に専念できる。

データ自体を単純にするとデータの操作も簡単なもので十分になる。
仮にデータの操作が基本五関数の組み合わせで全てできるものとする。
この組み合わせを表現するプログラミング言語ができて
データからデータに変換をしてくれる。

入力データ -> プログラム -> 出力データ

このプログラミング言語をデータに変換できたとすると
入力データとプログラムをデータにしたものを入力に受け取って
出力データを返してくれるプログラムがあればよい。

[入力データ+プログラム] -> プログラム -> 出力データ

このプログラムもデータからデータの変換にすぎないので、
プログラミング言語の中でつくることができる。
これが万能関数evalである。

悟れた?
例えば

x = ( -b + sqrt( b * b - 4 * a * c ) ) / ( 2 * a )

みたいな数式を S 式に置き換えるのにこのスレの人はどれくらい掛かるの?
982981:03/11/23 23:52
作業用の変数にバインディングするのは OK という条件で
(setf x (/ (+ (- b) (sqrt (- (* b b) (* 4 a c)))) (* 2 a)))
にってこと?頭っから一発で書き下せるが…。確かに昔はめんどくさかったかも。
まぁ、中置記法リーダーマクロで
#$[x = ( -b + sqrt( b * b - 4 * a * c ) ) / ( 2 * a )]
ならコピペでもオッケーだがな。
>>981
普通に式を書き下すだけの時間しかかからんが?
よくわからんがこうして欲しいのか?
(set! x (/ (+ (- b) (sqrt (- (* b b) (* 4 a c)))) (* 2 a)))
986981:03/11/24 00:13
実際に計ってみたら
がんばったのに30秒も掛かった…
987デフォルトの名無しさん:03/11/24 02:18
まあまあ
単に慣れの問題だよ。
>>978 define-syntax は (use-modules ((ice-9 syncase))) すると使えるよ。
>>938
さっきECL入れてみたんですけど、非常に良い感じです。

938はん・・・なんちゅう処理系を教えてくれたんや・・・
>>987
義務教育で前置記法を標準にすれば、いいのにな
SBCL 凄い事になってるね。コンパイラと思えぬサポートプラットフォーム数だ。
http://sbcl.sourceforge.net/
>>990
(・∀・)イイ!! もう順番に悩まなくていいんだ.
カッコの種類にうるさい奴らも一掃.
>>988
ありがとうございます
通りました
>>990
後置記法ならともかく前置記法では頭の中で演算子スタックが必要になるのでは?
>>992
複雑に括弧のついた Lisp プログラムをエディタの支援なしで読めるの?
適切なインデントくらいはしていてもいいけど
>>994
+ を2項演算子として
前置記法
+ + + + + + + + 1 2 3 4 5 6 7 8 9
後置記法
1 2 3 4 5 6 7 8 9 + + + + + + + +
1000
999
998
>>996
嘘をつけ
交換則が成り立つから同じに見えるだけだろ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。