トップページ⇒tech
1001コメント412KB

CommonLisp初心者スレ

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさんNGNG
ま、ぼちぼちやりましょうよ。
0002デフォルトの名無しさんNGNG
 iーー- ,,-ーーーーー、-ーつ
 と、 , ´ ・("▼)・ ヽノ
   .>  ,,, _フil=li=、_< 
  (   /彡 ┃ ┃{i|
   ゝ(|il(_, ''' ヮ''丿|
   〆(⌒)-ーー-(⌒)>2ゲッシ!
   ( i⌒ヽ,   i⌒ヽ,
   ヽゝ、__ノー-ーゝ、__ノ
0003デフォルトの名無しさんNGNG
スレの目的としては、

本家スレは高度過ぎて質問しずらい。
LISPやりけど、何していいかわからん。
他いろいろ。

な、初級LISPスレにしていきたいなぁ。
0004デフォルトの名無しさんNGNG
処理系ってどこにあるの?
0005デフォルトの名無しさんNGNG
Hello world教えて
0006最凶VB厨房NGNG
CommonLispは仕事の効率を良くしてくれますか?
0007デフォルトの名無しさんNGNG
maximaをもっと使いこなせるようになりたいです。
0008デフォルトの名無しさんNGNG
初級 Scheme はどこれかたればいいのれすか?
0009デフォルトの名無しさんNGNG
>>8
SICP読書スレを立てるとか
0010デフォルトの名無しさんNGNG
>>8
WiLiKi に逝くとか何事も無かったのようにここで語るとか。
0011デフォルトの名無しさんNGNG
CommonLispのチュートリアル、Web上になんかいいのないかな
0012デフォルトの名無しさんNGNG
俺も仲間に入れてくれ。とりあえずGCL入れたぞ。
ドキュメントが激しく読みにくいんだが・・・。
0013デフォルトの名無しさんNGNG
CLISPやXYYZYとかでもいいのか?
っつーかその程度しか環境しらん。
0014デフォルトの名無しさんNGNG
漏れはcmucl入れたぜ!maximaも動くぜ!
M-x run-lispでインタラクテチブだぜ!
0015デフォルトの名無しさんNGNG
教材はこれをつかおうぜ!
ttp://user.ecc.u-tokyo.ac.jp/~g340299/onlisp_j.pdf
0016デフォルトの名無しさんNGNG
微妙に期待してみる。おまいら、充実したスレに育ててね。
0017デフォルトの名無しさんNGNG
>(write-line "Hello World")
Hello World
"Hello World"

何で二回出力されるんだ!わからん!もういい寝る!
0018デフォルトの名無しさんNGNG
>>17
write-lineと式の評価の二つ実行されるからじゃないか?
0019デフォルトの名無しさんNGNG
http://www.hssh.jp/~hssh/doc/emacs-lisp-intro-jp/emacs-lisp-intro-jp.html#SEC_Top
こういうのも見つけたぜ。読みやすそうだぜ!
0020デフォルトの名無しさんNGNG
Perl
print $a=sub{$_[0]*2}->(3);
CommonLisp
((lambda (x) (* x 2) 3)

Lispの方が(・∀・)イイ!!
0021デフォルトの名無しさんNGNG
ANSI Common Lisp
http://www.franz.com/support/documentation/5.0.1/ansicl/ansicl.htm

Common Lisp the Language, 2nd Edition
っていう本がWebに公開されてたんだけど、いつのまにかネット上から消えてた。
まあ上のfranzのサイトにあるので十分っぽいけど。
0022デフォルトの名無しさんNGNG
scheme初心者もいれてください
comon lispって処理系をいれられないっす
んっと、gclは「成功です」ってメッセージだけで
トップレベルにならない。
schemeは、インストールの失敗しないけど解説も
CommonLispより更に少ないんですよね
0023デフォルトの名無しさんNGNG
scheme初心者まで入ってきたら本家スレとの区別がなきに等しくなりますよ。
どうせ住人はかぶるんだし、このスレはcommon lisp中心でいきませんか。
0024デフォルトの名無しさんNGNG
CommonLispとSchemeって何が違うの?
defunとdefineしか分らん。。。
0025デフォルトの名無しさんNGNG
nilがなくて (eq? #f ()) => #f だとか set! が戻り値がなかったりとかが
ちょっとや〜ねえ、というところ。〉scheme

0026デフォルトの名無しさんNGNG
新しい言語覚えるのってなんか新鮮でいいね。
インタプリタに打ち込みまくり。Emacsを最近覚えたから
少しは楽になったけど。
0027デフォルトの名無しさんNGNG
CommonLispって動くの?
嘘だといって欲しいよ。
xyzzy使えばいいのかなぁ
win98からfedoraに移行したんだけどなんか
戻りたくないんですが。

0028デフォルトの名無しさんNGNG
>>27
CommonLispはclisp,cmucl,gcl,aclの四つが有名なんじゃないかな。
aclはお試しばんがインターネッツ上に公開されてまつ。
$telnet prompt.franz.com
これだけでOK。WindowsだろうとMacだろうと問題なし。
Linuxだったらどれでも普通に使える予感.
0029デフォルトの名無しさんNGNG
SBCL
0030デフォルトの名無しさんNGNG
>>29
>>28はwindows系なんでしょ。UNIX系だったら
cmucl,sbcl,clisp...みたいになるかもしれないけどさ
0031デフォルトの名無しさんNGNG
Windowsで使えるCommon Lisp処理系の紹介。
有料
Allegro Common Lisp 日本語 http://jp.franz.com/ 英語 http://www.franz.com/
お試し版あり。 Windowsに限りVisual Basicみたいなフォームエディタ付き。
ネイティブコンパイラ付き。値段は交渉によって決まる。
LispWorks http://www.lispworks.com/
お試し版あり。
GUIは、Common Lispベンダで一応標準のCLIMか、独自のCAPI。
ネイティブコンパイラ付き。Professional edition $999 (academic $599)
Corman Lisp http://www.cormanlisp.com/
お試し版あり。ネイティブコンパイラ付き。$249.00. 学生 $125.00

無料
GNU CLISP http://clisp.cons.org/
バイトコードインタプリタ。

GNU Common Lisp (GCL) http://www.gnu.org/software/gcl/gcl.html
Kyoto Common Lisp family。
Cへ翻訳してからCコンパイラでネイティブコードにコンパイル。
ANSI Common Lispへの準拠の度合が他の処理系よりも遅れている。

Freeなら手軽さでGNU CLISPがおすすめ。
0032デフォルトの名無しさんNGNG
Windowsで使えるエディタで、Common Lispからいくつか機能を削った言語をマクロ言語として
採用しているものにxyzzyがある。

同じくWindowsを含め幅広いOSで使えるエディタで、Common Lispに良く似たEmacs Lispという
言語をマクロ言語として採用しているEmacsもある。EmacsのWindowsへの移植で有名なのは
Meadow2がある。

Common Lispにこだわる必要が無くて、なんとなくLisp的なものの感触を掴みたい人はこれらの
エディタで、自分の欲しい機能を書いてみるというのが実践的な身に付け方としておすすめ。
0033デフォルトの名無しさんNGNG
普通のやつらの上を行け ---Beating the Averages---
http://www.shiro.dreamhost.com/scheme/trans/beating-the-averages-j.html

人気の言語を作るには ---Being Popular---
http://www.shiro.dreamhost.com/scheme/trans/being-popular-j.html

技術野郎の復讐---Revenge of the Nerds---
http://www.shiro.dreamhost.com/scheme/trans/icad-j.html

がんがっていきましょう


0034デフォルトの名無しさんNGNG
とりあえずこれからCommonLispを始めようという人へ

--CommonLispの実装--

[UNIX/Linux]
選択肢が豊富なので良く使われている(ような気がする)ものを

CMUCL
http://www.cons.org/cmucl/
ネイティブコードへのコンパイラが優秀で機能性も申し分無し。多くのプログラムはCMUCLには対応している。
SBCL
http://sbcl.sourceforge.net/
CMUCLの派生でかなりたくさんのパッケージがついてくるのでこちらもお薦め。
GCL
http://www.gnu.org/software/gcl/gcl.html
日本発のKyoto CommonLispの流れをくむ実装。
GCLで動かないプログラムが結構あって、何故か無視され気味な気がする。
ECL
http://ecls.sourceforge.net/
GCLと同じく日本発のKyoto CommonLispの流れをくむ実装。
自分があまり使っていないのでコメントできず。
CLISP
http://clisp.cons.org/
ポータブルな実装だが、バイトコードコンパイラであることが他の実装と比べて見劣りするのか、
UNIX上では意外に話題が出ないような気がする。Unicode対応という点は特筆すべきかと。

個人的にはcmuclかsbclがお薦め。
0035デフォルトの名無しさんNGNG
>>31
おっ、重なっちまった。
じゃ、Windowsは省く。

[Mac]
finkパッケージマネージャで、UNIX系の実装の幾つかが使えるので、そちらはUNIX/Linuxの方を参照。

SBCL
http://sbcl.sourceforge.net/
速いし、機能性も十分だし、多くのパッケージ付き。もっともお薦め。
OpenMCL
http://openmcl.clozure.com/
SBCLと比べたときの利点が分からないが、使われている。
MCL
http://www.digitool.com/
商用。トライアルバージョンが微妙だし、勉強用としては上の二つを薦める。
0036デフォルトの名無しさんNGNG
WindowsでClispをやろうとしている人への助言。
Meadow2 + ilisp + CLISP + HyperSpec + Common Lisp the Language 2ed(CLtL2)
という環境がおすすめ。調べたい関数や変数を説明した、HyperSpecやCLtL2の該当
ページを、補完機能つきで指定して、表示させるコマンドがilispにはあります。

CLISPが異常に重いと感じたら、Cygwin版のものを使うと軽くなるかも。
Cygwinのネットインストーラーのメニューに探せばCLISPがあるので簡単です。
0037デフォルトの名無しさんNGNG
ツッコミを入れておくか.

SBCL の売りは Linux + SBCL だとネイティブスレッドが使える事〜.

GCL が無視され気味なのは単純に ANSI CL に準拠してないからだろう.

# Mac 用の CMUCL はもうスクリーンショットが出回ってるね.もうすぐかなー?
0038デフォルトの名無しさんNGNG
>>35
Mac 界隈では SBCL より OpenMCL の方が人気あるっぽいよ。
スレッドも使えるし、Cocoa へのインターフェイスもあるし。
0039デフォルトの名無しさんNGNG
Kyoto Common Lisp familyの歴史的経緯をすこし。
現在の米国規格協会(American National Standards Institute 略称ANSI)
が規定している、ANSI Common Lispが制定される途中の段階で、規格制定
委員会に参加しているGuy L. Steele Jr.という人が
"Common Lisp the Language"(CLtL1)という中間報告的な本を出版しました。

Kyoto Common LispはこのCLtL1に準拠するべく湯浅 太一、萩谷 昌己さんたち
によって書かれた処理系です。したがって、現在の規格とは微妙に動作が違っ
たり、必要な機能が欠けていたりします。

Kyoto Common Lispの目立った特徴は、独自のコンパイラは持たず、システムに
備わった既存のCコンパイラを使う点です。もちろん開発中、動的にある一つの
関数だけをコンパイルすることもできます。

Kyoto Common Lispはその後いろいろあって、GNU Common Lisp(GCL)や
Embedable Common Lisp (ECL)へと受け継がれ、今にいたります。

私が昔触った感じでは、ECLの方がより規格に準拠しているように感じました。
0040デフォルトの名無しさんNGNG
ポールグラハムは一流のエッセイストですね。
0041デフォルトの名無しさんNGNG
おぅ、初心者らしき質問があるじゃねーか。ネタ初心者かもしれんが。
Common Lisp と Scheme の違い
* T, NIL と #t, #f ←これの所為で互換性大幅ダウン
* 規格にパッケージシステムやオブジェクトシステムがあるかどうか
少々気にいらなくてもどこでも使えるタフなのが欲しいか,
処理系依存の気配がしても自分のお気に入りのがいいか
* 関数と変数の名前空間が分かれてるかいないか
Scheme は分かれてないから ((if pred? x y) 100) とか書ける
CL は分かれてるから (funcall (if pred? x y) 100) となる
そんかわり Scheme で大規模なものつくるときは名前にちょっと注意い
* 末尾再帰の最適化が
Scheme は規格で決まってる
CL は処理系のマニュアルを読まなきゃ(実装でどうするか決まってる)
↑(これをやる最適化オプションとか決めたいよね〜とかいう話もあった)
* (規格レベルで)コンパイラを意識しているか
CL : かなり
Scheme : あんまり
0042デフォルトの名無しさんNGNG
なんか段々と話がむこうのスレに近付いて来てないか?
むこうのスレの奴が話をまとめに来てるだけだったりして。
#俺もそのうちの一人だけど
0043デフォルトの名無しさんNGNG
(defun make-add (n)
#'(lambda (x) (+ x n))) ・・・(a)
;(defun make-add (n)
; (lambda (x) (+ x n))) ・・・(b)

(setq add2 (make-add 2)) ;add2にはラムダ関数のリファレンス?
(funcall add2 3)

aとbどちらでも同じ結果が得られます。#'というのは関数への
リファレンスを取得するようなイメージを持っているのですが、
これは勘違いでしょうか。cmucl-18を使っています。
またfuncallとはPerlでいうろとこのデリファレンス(して関数呼び出し)
のように思っていたのですが、これもやっぱり見当違いかな。
#'の有無に関わらず(add2 3)の形式では呼び出せません。
0044デフォルトの名無しさんNGNG
sub make-add{
my $n
return sub{$_[0]+$n};
}
$add2 = make-add(2);
print $add2->(3);
Perlだとこんな風になるのかな。当然関数本体を
変数に格納することはできないので$add2には関数の
リファレンスしか入りません。
0045デフォルトの名無しさんNGNG
HyperSpec macro としての lambda の説明
http://www.lispworks.com/reference/HyperSpec/Body/m_lambda.htm
> (lambda lambda-list [[declaration* | documentation]] form*)
> == (function (lambda lambda-list [[declaration* | documentation]] form*))
> == #'(lambda lambda-list [[declaration* | documentation]] form*)
つまり、#'(lambda () (foo))と(lambda () (foo))では同じ結果となります。

まず、Common Lispでは、シンボルのValue cellとFunction cellが分かれています。

> funcallとはPerlでいうろとこのデリファレンス(して関数呼び出し)
Value cellをデリファレンスして関数オブジェクトを取得したのちに
関数呼出しということでいいと思います。

(add2 3)の形式で呼び出せないのは、(add2 3)などのfunction formをeval
するときは、先頭(この場合add2)がシンボルのときは、そのfunction cell
をデリファレンスすると決められているからです。

(setf (symbol-function add2) (make-add 2))としてやれば、(add2 3)が
うまくいくでしょう。
0046デフォルトの名無しさんNGNG
>>43 質問キター

Common Lisp では一つのシンボルは変数としての値と関数名としての値
の二つを持つ.(それぞれ symbol-value と symbol-function でアクセス可能)
(setq add2 (make-add 2))
だとシンボル add2 の値(symbol-value で取り出すほう)に (lambda ...) が
入るわけ.で,
(add2 3)
ってやると add2 は関数だからシンボル add2 の symbol-function を
取り出そうとするわけだが,当然空なのでエラー.どうすりゃいいかっつーと
(funcall add2 3) ←こいつは add2 の symbol-value を使うので平気なわけ.

で,たとえば (funcall car '(1 2)) とかしたとき,シンボル car の
symbol-value は(普通)空っぽなんでダメポ.そこで function のほう,
と指定するために #' をつけるわけだ.
(funcall (symbol-function car) '(1 2))
なども可能ではあるがカコワル.
(funcall (funcion car) '(1 2))
の省略系として
(funcall #'car '(1 2))
なわけ.

CLHS によれば function (つまり #' ね)は "function name => function" で
名前が symbol だったら symbol と対応した関数を,lambda 式だったら
レキシカルクロージャを返すわけだ.
0047デフォルトの名無しさんNGNG
更新してなかったんで 45 と被った〜鬱

0048デフォルトの名無しさんNGNG
>>47 いや、多角的な説明になってかえっていいんじゃない?
今なら、親切な講師陣が懇切丁寧にCommon Lispを説明します。>all
0049デフォルトの名無しさんNGNG
でも質問があまりないじゃないか。
ネタ初心者として自作自演に走らないと盛りあがらないかも。
0050デフォルトの名無しさんNGNG
>>45 さっそくのド素人な質問におつきあいどうもありがとうございます。

>Common Lispでは、シンボルのValue cellとFunction cellが分かれています
>>41さんも書いていてくれましたね。よく読まないとだめですね。
add2という自由"変数"だからfuncallが必要のですね。関数はdefunで作られた
名前だけということになるのかな。

>(add2 3)などのfunction formをevalするときは、>先頭(この場合add2)がシンボルのときは、
>そのfunction cellをデリファレンスすると決められているからです。
その位置によってLISPが探すシンボルテーブルが異なるわけですね。
先頭だけがFunction Cellをみて、残りはすべてValue Cellになるのかな。

>>45-46さん
symbol-value,symble-functionについてはよく読んで勉強させてもらいます。

あと44に書いたPerlはめちゃくちゃでした。これが正しいかもしれません。
print sub{my $n=$_[0]; sub{$_[0]+$n}}->(2)->(3);
0051デフォルトの名無しさんNGNG
細かいけど一つのシンボルが複数の値をもってるんだ.シンボルテーブルが関数用と
変数用に分かれてるんじゃなくて,シンボルが関数用と変数用の値を持ってるわけ.
シンボルに value cell と function cell があると理解して,アクセス方法もわかれば
defun 相当を作るのは簡単だ.

(setf (symbol-function 'hoge) (lambda (x y z) (+ x y z)))

でいいわけだからな.で hoge が名前(name)引数リスト(args) が (x y z) で
定義本体(body) が (+ x y z) だと見て,マクロを使えば

(defmacro my-defun (name args &body body)
`(setf (symbol-function ',name)
(lambda ,args ,@body)))

(my-defun hoge (x y)
(+ x y))

(hoge 1 2)
=> 3

で俺 defun の完成ってわけ.

# 本当の defun はもーちょいいろいろやるけど学習向けね
0052デフォルトの名無しさんNGNG
スコープはどう扱うの?
0053デフォルトの名無しさんNGNG
>シンボルが関数用と変数用の値を持ってる
うわー、分ってる人の説明は分り易いです。
目から鱗です。OnLispをまだろくに読んでないのに
こんなに親切丁寧に、、申し訳ないです。。。
0054デフォルトの名無しさんNGNG
>>50
Lispのsymbolを普通の言語における"変数"として理解しようとすると、ハマるかも。
むしろ、Perlでいうなら、名前がついたハッシュ値として解釈したほうが良いかも。
$my-symbol = \{ 'value' => nil, 'function' => sub{$_[0]+$n}, 'plist' => (),}
みたいにね。(Perlはもう忘れかけれるからmock perlね)

あと、Lispでは値はすべてリファレンス値として考えていいと思います。
だから明示的に演算子でデリファレンスすることはありません。
0055デフォルトの名無しさんNGNG
>>52 スコープは、ダイナミックスコープとレキシカルスコープがある点でPerlと
同じです。っていうか、スコープの何が知りたいの?
0056デフォルトの名無しさんNGNG
>>53
OnLisp は入門者が読む本ではないが….最初は
ANSI Common Lisp, Paradigms of Artificial Intelligence Programming (PAIP)
ウィンストンさんの Lisp 3 版(日本語版は訳が…)
あたりがオススメ.PAIP は AI の本としては古いけど Lisp の勉強用なら全然問題ない.
後半は高度な話題もあって楽しいよ.

>>52
質問の意味がよーわからんなぁ.修行が足りないのか?
Common Lisp ではダイナミックスコープとレキシカルスコープがサポートされてます.
本当はスコープとエクステント(変数の寿命)は別なんですが
ダイナミックスコープ : いわゆるグローバル変数
レキシカルスコープ : いわゆるローカル変数
という理解で最初はいいんじゃないでしょうか.
0057デフォルトの名無しさんNGNG
シンボルが関数用と変数用の値を持ってるなら
レキシカルスコープはどうやってやるの?
0058デフォルトの名無しさんNGNG
>>56に補足して。英語でいいのならCommon Lispの入門書はネットで無料で読め
るものがたくさんあります。これらをまとめたウェブページがあればリンクを
張りたいところだけど、分からないや。気がむいたらまとめます。

>>57
レキシカルスコープをやるやりかたは、普通の言語と同じです。
Lispがレキシカルスコープを実装する方法が知りたいのかな?
それとも使い方かな? あなたが現状で堪能なプログラミング言語が
あればそれを書いてくれると、説明しやすいです。
0059デフォルトの名無しさんNGNG
どう?というのがイマイチ…

(defun lexical2 ()
(labels ((f () (print "I'm f")))
;; (print f) ←変数 f は未定義
(f)
(labels ((f () (print "I'm f..:-)")))
;; (print f) ←変数 f は未定義
(print (symbol-value 'f)) ;; unbound ←この辺が疑問?
(print (symbol-function 'f)) ;; function は入ってる
(f))
(let ((f 10))
(print f) ;; それともこの辺?
(f))))

# というかこーゆうのは初心者の質問なのだろうか?
0060デフォルトの名無しさんNGNG
実装する方法です。
0061デフォルトの名無しさんNGNG
CL を実装というなら初心者スレじゃなくて本スレのほうが…
0062デフォルトの名無しさんNGNG
>>60 レスがハヤッ!
レキシカルスコープの実装はC, C++などの変数と同じです。
たしかに初心者スレから逸脱しそうな雰囲気なので、
これ以上の議論をするときは本スレへ移動しましょう。
0063デフォルトの名無しさんNGNG
レキシカルスコープよりダイナミックスコープのほうが
C/C++の経験者には新しい概念だと思います。
0064デフォルトの名無しさんNGNG
>>60 は #<unbound> でも代入しとくように.で,スレの目的の初心者質問マダー?
0065デフォルトの名無しさんNGNG
括弧の対応がわからなくなるんですがどうすればいいですか?
0066デフォルトの名無しさんNGNG
どうぞ Python をお使い下さい。
0067デフォルトの名無しさんNGNG
emacsの(show-paren-mode)を使う。
0068デフォルトの名無しさんNGNG
お使いのエディタで対応を強調する方法を調べてください.
vi なら % キーで GNU Emacs なら show-paren-mode とか.
あんま気にしないでインデントがそろうまで括弧入れるとか.
最初のうちはだれでもうまく行かないもんです.

(a (b c) ((d e) (f g) (h i)))

↑のツリーが理解できるくらいまで cons を理解できるように
なれば自然と見え方がかわるんじゃないかな.漏れは師匠に最初に
cons セルを手書きさせられたもんです.これも学習法としては
オススメ.
0069デフォルトの名無しさんNGNG
質問ばかり待つといきなり寂れそうなので積極的に解説もしてみよう.

初心者向け cons セルドリル(こんなの→http://perez.cs.vt.edu/usna.navy.mil/HW3P1.gif)
1. (a b c)
2. (a (b c))
3. (a ((b c)))
4. ((a b) (c d))
5. (+ a b)
6. (* (+ a b c) (+ (/ d e) f g))
7. (defun foo () (bar))
8. (let ((x 10) (y 20)) (+ x y))
全部できたら Lisp の構文木を脳内イメージできるようにしましょう.
マクロが構文木へのパターンマッチであるという事が理解できるれば
面白くなってくる筈です.きっと.

# どうしても駄目なら Python でもどーぞ.
0070デフォルトの名無しさんNGNG
>>22
GCL は今は ANSI CL 準拠へ向けてがんがってるところだから
初心者にはお勧めできない。環境がわからんのでとりあえず
CLISP のバイナリパッケージをお勧めする。
0071デフォルトの名無しさんNGNG
入門文献、ブックマークから適当に漁ってみました。
上から順に短め・初心者向け、て感じで並べてあります。
ちなみに全部英語。日本語でも大学の講義資料とかでいいなら結構転がってたりします。

Common LISP Hints
ttp://www.n-a-n-o.com/lisp/cmucl-tutorials/LISP-tutorial.html
Lisp and elements of style.
ttp://www.fast-index.com/declarative/lectures/
Chapter 2 of ANSI Common Lisp
ttp://lib1.store.vip.sc5.yahoo.com/lib/paulgraham/acl2.txt
Loving Lisp
ttp://www.markwatson.com/opencontent/lisp_lic.htm
Common Lisp:A Gentle Introduction to Symbolic Computation
ttp://www-2.cs.cmu.edu/afs/cs.cmu.edu/user/dst/www/LispBook/index.html
Successful Lisp
ttp://www.psg.com/~dlamkins/sl/cover.html

上記の中では A Gentle Introduction... が一番丁寧でお勧めかなあ、という感じがします。
図版が多いので英語が苦手でも安心かもしれません。

text というより tips な感じなのがこの辺。

Lisp style guide
ttp://www-2.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/lisp/txt/style/ht_guide.txt
Common Lisp Pitfalls
ttp://www.aiai.ed.ac.uk/~jeff/lisp/cl-pitfalls
The Common Lisp Cookbook
ttp://cl-cookbook.sourceforge.net/
0072デフォルトの名無しさんNGNG
(defparameter *data*
'((1 3 4) (3 4 5) (1 1 1) (1 0 1)
(4 5 5) (4 1 0) (3 2 3) (4 5 4)
(4 2 1) (4 9 0) (0 0 1) (0 9 1)
(0 8 1) (3 4 5)))

(my-sort *data*)
=> ((0 0 1) (0 8 1) (0 9 1) (1 0 1) (1 1 1) (1 3 4) (3 2 3) (3 4 5) (3 4 5) (4 1 0) (4 2 1) (4 5 5) (4 5 4) (4 9 0))

こんな感じで1番目の要素と2番目の要素でソートしたいんですが、
どうすればいいの?
0073デフォルトの名無しさんNGNG
比較関数を用意してソート関数(sortやmerge)に
渡せばいいかと。
0074デフォルトの名無しさんNGNG
オライリーの薄いハンディタイプのリファレンス本あるじゃん。
あのLisp版て無いの?
0075デフォルトの名無しさんNGNG
をを、めちゃ盛況ですな。

環境依存な質問です。
xyyzzyで、任意のディレクトリ名を指定して、そのディレクトリ内に
存在するファイル名を取得する方法って何がありますかね?
007622NGNG
>>70
ありがとうございます
CMUCLとCLISP入れてみました
なんとなくCLISPの方が無難な感じですね
0077デフォルトの名無しさんNGNG
>>75
xyzzyスレで聞けば?
0078デフォルトの名無しさんNGNG
(sort *data* #'(lambda (x y)
(if (= (car x) (car y))
(< (cadr x) (cadr y))
(< (car x) (car y)))))
0079デフォルトの名無しさんNGNG
>>75
確かに初心者向けと銘打ってはいるが、質問の初心者は…。Windows 板に
xyzzy スレってなかったか?でも親切がモットーのスレなので答えておこう。
(directory "ディレクトリ名")
だ。c:\ の一覧が欲しいなら (directory "c:\\") ね。

>>76
cmucl も入れたのか?ならそっちのほうが性能いいけどな。
でも clisp は起動も速いから性能に不満がでるまで clisp でもいいかもな。
開発環境のセットアップは大丈夫か?Emacs + ilisp がないとマンドクサだぞ。

慣れてきたら Emacs + SLIME がお勧め。
SLIME はドキュメントがないので素人にはおすすめできない。
0080デフォルトの名無しさんNGNG
>>74
今のところありません。Lisp 人気が急上昇でもしない限り今後もでないでしょう。
開発時に参照するなら Emacs から HyperSpec を引くのがコマンド一発
なわけですが。ハンディリファレンスの Lisp 版があったらどう嬉しい
ですか?
0081デフォルトの名無しさんNGNG
>>78 car, cadr のかわりに first, second を使うスタイルもありだね。
あと sort は破壊的な関数なので引数で渡されたリストが壊れるって事
に注意。
(setf *data2* (sort *data* (lambda (x y) ....)))
*data2*
=> ウマー
*data*
=> アレ?ナニコレ?マズー
となっちゃう。*data* が壊れるのが嫌な場合は
(setf *data2* (sort (copy-list *data*) (lambda (x y) ....)))
とかしてやれば ok。まぁ、
(setf *data* (sort *data* (lambda (x y) ...)))
みたいに *data* を更新に使う用途ならいいんだけど。
0082デフォルトの名無しさんNGNG
>>78 >>81 おぉ、ありがとうございます。昇順降順の切り替えもこれなら楽ですね!
0083デフォルトの名無しさんNGNG
>>80
>ハンディリファレンスの Lisp 版があったらどう嬉しいですか?

寝る前に布団の中で暗記したりとか・・・。
全体像を掴むのに要点だけかいつまんである紙があるといいじゃん?
あとコマンド名が思い出せない時とか。
0084デフォルトの名無しさんNGNG
>>83 寝る前に覗いてみれば…生活時間帯がかぶってるのかね。
なるほど布団の中で暗記ね。我々小市民がオライリーに頼んでも
無駄でしょうから自作しますか。 PDF でよければ。
どっかの Lisper に頼めば Web スペースを借りるくらいできるでしょう。

では欲しい要点と忘れやすいコマンド名(関数の事?)をどーぞ。
0085デフォルトの名無しさんNGNG
>>83
CLtL2 とか CLHS, CMUCL User's Manual がそれに当たるのかなぁ。
0086デフォルトの名無しさんNGNG
> 全体像を掴むのに要点だけかいつまんである紙があるといいじゃん?
だからそれらは全部却下だろう。要点ねぇ。まぁ、>>835 の欲しい要点を
聞こうじゃないか。

漏れはハンディリファレンスとやらの類は読んだ事無いが、
構文とかエラーチェックとかリスト処理とかカテゴリ別に重要なやつだけ
ちょこちょこ解説があればいいのかな?
0087デフォルトの名無しさんNGNG
>>79
>開発環境のセットアップは大丈夫か?Emacs + ilisp がないとマンドクサだぞ。
ilisp拾って来て解凍した後が訳分りません
/usr/share/emacs/21.3/site-lisp
あたりに突っ込むのやら、.emacsに何か書くのか、
他になにか設定ファイルか必要なのか全くダメです。
レベルが低くて申し訳ないのですが教えて頂けないでしょうか?
0088デフォルトの名無しさんNGNG
>>87
.emacsに自分の使っているインタプリタのフルパスを

(setq lisp-program-name "/usr/bin/lisp")

と一行入れるだけで、あとは
M-x run-lisp
として、Emacsバッファ内でインタラクティブにLispが使えるようになるよ。

CommonLispの日本語リファレンスマニュアル本としてこんなのはどうでしょうか?
http://www.amazon.co.jp/exec/obidos/ASIN/4320025881/
英語のは持っていますが、翻訳がいいなら買おうかと思います。
Lispは数学のように用語がしっかり統一されているイメージがあるので
なるべくちゃんとしたリファレンスを用意しておくべきかなと思ってます。
0089デフォルトの名無しさんNGNG
>>87 ふむ。環境は重要だからな。一応ロードパス通ってるところに
置けたってことは Emacs は少しは使えるってことなのかな。とりあえず
1. ilisp ディレクトリで make してバイトコンパイル
2. ↓のを .emacs に追加。
(require 'completer)
(require 'ilisp)
(load "completion")
(initialize-completions)
(setq clisp-hs-program "clisp -I") ;; clisp のパスね。-I は ilisp 用で起動ってこと。
(set-default 'auto-mode-alist
(append '(("\\.lisp$" . lisp-mode)
("\\.lsp$" . lisp-mode)
("\\.cl$" . lisp-mode))
auto-mode-alist))
(add-hook 'lisp-mode-hook (lambda () (require 'ilisp)))
(load-library "cl-indent")
(add-hook 'ilisp-load-hook
(lambda ()
(setq lisp-indent-function 'common-lisp-indent-function)
(setf ilisp-*prefix* "\C-c"
lisp-no-popper t
ilisp-*arglist-message-lisp-space-p* t)))
くらいでどーだ?後は M-x ilisp-mode とかやると ilisp が起動すると思うのだが。
これが出来たら次は HyperSpec と CLtL2 が ilisp からコマンド一発で参照できるように
するわけだが、まずは(スペースの都合でね)これくらいから。どう?
0090デフォルトの名無しさんNGNG
>>88 ANSI Common Lisp 規格と微妙に異なる点があるが買ってもいいだろう。
翻訳もいいんじゃねーの。意味は通じるし、英語版と比較すりゃ勉強にもなる。
だが、やっぱり足りない部分もあるので、
http://www.lispworks.com/reference/HyperSpec/Front/Contents.htm
が本物だという事は忘れるな。調べるときは日本語→HyperSpec でも
当分イイが、段々と HyperSpec を当たる癖をつけるように。
0091デフォルトの名無しさんNGNG
わけ、わかんざき
0092デフォルトの名無しさんNGNG
関係ないけどconsってコンストラクタの略だと思ったけど
http://www.lispworks.com/reference/HyperSpec/Body/14_.htm
Consesときたよ。
Consesて、なんて読むの?
つーかこれ造語?
0093デフォルトの名無しさんNGNG
conses : cons の複数形
... conses are the fundamental building blocks of lists. ;-)
0094デフォルトの名無しさんNGNG
おまいら朝から元気ですね
0095デフォルトの名無しさんNGNG
ilisp使ってるとキー一発でHyperSpec引けるので、心配しなくても
そのうち本は見なくなりますよ。
0096デフォルトの名無しさんNGNG
Lispは人工知能の研究専用の言語だと言っている人がいました。
本当ですか?
0097デフォルトの名無しさんNGNG
>>92 日本語風に発音すると、「コンスィズ」だと思う。
0098デフォルトの名無しさんNGNG
>>88 thxです。
(setq lisp-program-name "/usr/bin/clisp")
で、
M-x run-lisp
だとcmuclが起動しました。こっちでもいいんですけど、
(/usr/local/bin/lispでcmucl起動します)
(exit)も(quit)も効きませんね。

>>89
.emacsに入れてみました。一度は打ち込んだんですが括弧の対応を
間違えましたのでコピペして、clispのpathの所だけ変えました。
(write-line "hello world")とだけ書いたhello.clというファイルを
開いた状態で
M-x ilisp-mode
とするとミニバッファに
Dialect:
と表示されて入力待ちのなるようです。Dialectは方言って意味みたいなので
clispと入れると、画面が二分割されて下半分にILISPモードの*clisp-hs*バッファが
開きました。
0099デフォルトの名無しさんNGNG
>>96
> Lispは人工知能の研究専用の言語だと言っている人がいました。
人工知能の研究くらい難しいことにも柔軟に対応できる能力がある言語と
いうことで、汎用の言語として使う事もできます。

他の言語では、複雑すぎて実現できそうもないことが出来たりするので
大きくて複雑なアプリケーションを書く事にも向いているし、
また例えばGNU CLISPなどの比較的軽い処理系を使えば、Perl, Python,
Rubyなどのスクリプト言語と同じような使い方もできるのではないか
という議論もあります。
0100デフォルトの名無しさんNGNG
>>96
残念ながら汎用目的の言語です。歴史的に Lisp (または Lisp を採用)
したプロジェクトで有名なものは一般向けでは
- エディタ(Emacs 系列とか)
- CAD(AutoCAD とかね)
- コンパイラ(パーサーの後の構文木から先の辺とか)
- 数式処理ソフト(Maxima)
と人工知能に関連しそうなものはありません。最近のプロジェクトとしては
NASA の宇宙開発関連(http://ic.arc.nasa.gov/projects/remote-agent/)
とかが比較的人工知能っぽいかもしれません。まぁ、Lisp の開発者が
人工知能の偉い人だったので当然そっち方面で使われたという歴史も
ありますが。
0101デフォルトの名無しさんNGNG
PVSもCommonLispらしいですよ。
あとMaximaと被ってるけど、代数システムとしてAXIOMとか。
どっちにしても「計算」っていう言葉を連想させる分野が
多いですね。
0102デフォルトの名無しさんNGNG
>>98 よしよし。無事 ilisp のインスコができたようだな。次は HyperSpec を
ダウソして引けるようにしなきゃならんが、その前に覚えるコマンドがある。
http://www.geocities.co.jp/SiliconValley-SanJose/7474/LispDevelopEnvironment.html
↑(昔は HyperSpec の設定とか載ってたと思ったんだが消えてるな…)にあるコマンド一覧
からの転載だが、この3つは必須。
C-c s status-lisp ilisp の状態を表示
C-c g abort-commands-lisp lisp に送ったコマンドを中断
C-c z reset-ilisp lisp の状態をリセット
ilisp と lisp の通信がおかしくなる(特にエラー時)ときとか、この3つが
使えないと話にならない。ilisp が固まった〜とかでうろたえないように。
0103102 の続きNGNG
1. まずは HyperSpec をダウンロード
ftp://ftp.xanalys.com/pub/software_tools/reference/HyperSpec-6-0.tar.gz
2. .emacs で
(setq common-lisp-hyperspec-root "file:///home/someone/doc/HyperSpec/"
common-lisp-hyperspec-symbol-table "/home/someone/doc/HyperSpec/Data/Map_Sym.txt")
と HyperSpec のディレクトリを指定してやればいい。後は M-x hyperspec-lookup でカーソル
位置のシンボルを HyperSpec から引いてくれる(ブラウザが起動する)。キーは自分ですきなところに割り当ててくれ。

漏れはブラウザに w3m を指定してるな。これは ilisp とは関係なくて browse-url 関連の設定なわけだが。
0104デフォルトの名無しさんNGNG
>>99
スクリプティング向けのパッケージでも用意すれば話は別だけど現状
CommonLisp でスクリプティングは無理だろう。それ向けの処理系
がない、識別子が長い、等々色々あるが、スクリプティング目的の人に
CommonLisp を勧めるのはどうだろう。Gauche とかが良いのでは。
0105デフォルトの名無しさんNGNG
comp.lang.lispは未だに必読?
0106デフォルトの名無しさんNGNG
>>102
はい
そちらのサイトはよく検索でhitするんですが、開発環境自体を
の意味を良く理解してないので見てもいまひとつ分りませんでした。
呑み込みが良くないかもしれませんが堪忍してください。
とりあえず必須の3つは了解です。
0107デフォルトの名無しさんNGNG
>>105 そんなことないと思うけど…。昔は必読だったの?
0108デフォルトの名無しさんNGNG
>>104
> スクリプティング向けのパッケージでも用意すれば話は別だけど現状
> CommonLisp でスクリプティングは無理だろう。

最初にスクリプティングという目的があって、Perlなんかと同レベルの
サポートを求められると、現状では無理があるだろうけど、Common Lispを
習得するという目的が最初にあるのなら、スクリプティング環境が整って
いないのを逆手にとって、自分でXMLパーサを書いてみたりとか、やるべき
ことがたくさんあってかえって面白いんじゃない?

まぁ、ライブラリを書かなくても、CSVファイルの処理をちょっとCLで書いて
みるとか。日々の雑用をちょっと書いてみるという感覚ね。

現在の状況ではGuacheがLisp系でスクリプティングに向いているというのは
賛成だけど。Common Lispがスクリプティングに向いていないということは
ないと思う。
0109デフォルトの名無しさんNGNG
Lispの応用例の話題だけど、クラッシュバンデクーというゲームで
Game Oriented Object LispというLisp系の言語が使われていたんだって。
あと、Graphics分野でLispが強いんだって、意外な感じ。
http://www.ogis-ri.co.jp/otc/hiroba/others/OORing/interview21.html
> Square に行きましたら、その時初めて知ったんですけど、グラフィックス関係って
> もともと Lisp が使われてたんですね。グラフィックスのプログラムってのは、
> オブジェクト同士がリンクを張りまくって、参照しまくって。Lisp だとその
> ネットワークが簡単に実現できるんです。
0110デフォルトの名無しさんNGNG
>>109
意外だったのか!? Lisp といえばグラフィックスでは先駆者な
はずだが…。そもそも Lisp マシンとかってグラフィックス装備
のシステムとしては最先端だったのだが。
0111デフォルトの名無しさんNGNG
> そもそも Lisp マシンとかってグラフィックス装備のシステムとしては最先端だったのだが。
でも昔だとLispって遅そうなんだもん。そんでグラフィックスというと速さが命みたいな
イメージが俺にはあんだよね。アセンブラでレイトレーサを書くとか、古いかな。

とはいうものの、LispマシンってハードレベルでLispに最適化してあるから、
汎用マシンに比べてなかなか速いって話は聞いた事あります。

P.S. ilispインストールした人、元気にLispしてますか?
ここらへんは無駄口ですから、気にせず質問があったらしてくださいね。
0112デフォルトの名無しさんNGNG
ilispというのはEmacs用のアプリケーションだったんですね。
/usr/portage/dev-lisp/*にないから、Gentooは
対応してないのかと思ってました。
0113デフォルトの名無しさんNGNG
文字列に文字を追加したいのですが、どのようにすればいいのでしょうか?
こんな感じのを書きたいのですが。
(concatenate 'string "hell" #\o)
0114デフォルトの名無しさんNGNG
(concatenate 'string "hell" (string #\o))
0115デフォルトの名無しさんNGNG
文字列の連結ってよくやる処理のような気がします。
(concatenate 'string "hell" (string #\o))
はちょっと冗長な気がするのですが、こういうときは、
積極的に(str-cat "hell" #\o) => "hello"みたいな関数をみなさん
定義しているのですか?
0116デフォルトの名無しさんNGNG
しない。
0117デフォルトの名無しさんNGNG
>>115 慣れの部分もあるけど、冗長だと感じるのならstr-catって分かりやすい
名前だと思うし、よく使うのなら定義してもいいと思うよ。string-concatenate
じゃあほぼ同じ長さだし。ただ、Common Lispでは表記レベルでプログラムを
短くするという努力はしていないので、multiple-value-bindとか長い名前が
よくあるね。
0118デフォルトの名無しさんNGNG
しませんねぇ。大抵補完で済んじゃうので。本当に多用するなら考えるかもしれないけど。
出力時は format で結構いけるし、文字列構築とかも with-output-to-string があるしなぁ。
0119デフォルトの名無しさんNGNG
>>103
browser.elの設定に時間が掛かりました。
(setq browse-url-browser-function 'browse-url-netscape)
(setq browse-url-netscape-program "mozillafirebird")
(global-set-key [S-mouse-2] 'browse-url-at-mouse)
(global-set-key "\C-c\C-z" 'browse-url-at-point)
fedoraの設定をいじってない状態のw3m(KDE, Konsoleの中で)だと、
Opening socket...
という表示で待たされる間が6秒程あってなかなかきびきびした
動作ができません、なのでmozillaで起動するようにしました。

お蔭でilisp-modeの中の、 M-x hyperspec-lookupでヘルプが
立ち上がりました。そもそもこんなものがあるのも知らなかったです。
ありがとうございました。

0120デフォルトの名無しさんNGNG
>>113
なんでローカルのファイル開くのに Socket 開くんだろう?
まぁ、とりあえず使えるならいいか。Happy Hacking!!
0121120NGNG
>>119 だ間違えた…。
0122デフォルトの名無しさんNGNG
ilispってmeadow2ではつかえますか?
とりあえず、ilisp解凍後meadow2/site-lispに中身をいれて、
Makefileの
Emacs = /path-to-meadow/Meadow.exe
とかして、コンパイルはできたのですが、
>>89を.emacs.elに書き込み、ilisp-mode起動、clispを選択後に、
Copyright (c) Bruno Haible, Sam Steingold 1999-2003

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
[1]>
[2]> ;;; Loading f:/Meadow2/site-lisp/ilisp-pkg.lisp
*** - LOAD: A file with name /f/Meadow2/site-lisp/ilisp-pkg.lisp does not exist
Break 1 [6]> ;;; Loading f:/Meadow2/site-lisp/cl-ilisp.lisp
*** - LOAD: A file with name /f/Meadow2/site-lisp/cl-ilisp.lisp does not exist
Break 1 [8]> ;;; Loading f:/Meadow2/site-lisp/cl-chs-init.lisp
*** - LOAD: A file with name /f/Meadow2/site-lisp/cl-chs-init.lisp does not exist
Break 1 [10]>
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ってのと、新しいウィンドウに
*** - LOAD: A file with name /f/Meadow2/site-lisp/cl-chs-init.lisp does not exist
とでてきます。

INSTALLATIONファイルに
You should add the directory where all of the ILISP Emacs Lisp files reside
to your load-path. There is an example of this in `ilisp.emacs'.
とありますが、全部のファイルの頭でload-pathを設定する必要があるのでしょうか?
0123デフォルトの名無しさんNGNG
>>122 えーとね、とりあえず、Windows9x + Meadow2 + ilisp + clisp で
動いてます。詳しい事はまた書くね。
0124デフォルトの名無しさんNGNG
あなたが使っているCLISPはCygwin環境でコンパイルされたものだと思います。
ここで、問題となっているのは、Windows形式とCygwin形式のファイルネーム
の変換問題です。私は以下のようなことをしてとりあえずうまく動いています。

ムリヤリな感じがするので、もっといい解決方法があればどなたか教えてください。

(add-hook 'clisp-hs-hook
          '(lambda ()
            (defun file-name-hack (file-name)
              "change Windows filename to cygwin filename, needed on Meadow2 + cygwin clisp."
              (concat "/cygdrive/" (subseq file-name 0 1) (subseq file-name 2)))))
0125124NGNG
忘れた。上記のコードを.ilispファイルに書き加えてください。
0126122NGNG
>>124
うまくいったようです。ありがとうございます。
環境はWin2k+Meadow2+ilisp+clisp(cygwin)です。

とりあえず、ESC C-xでS式の実行を確認できました。
他はまだ調べてないですが、次にヘルプが出せるようにしようと思います。
0127デフォルトの名無しさんNGNG
.emacsが読めるようになってきたからって、そっちばっかりいじってるな。。。
0128デフォルトの名無しさんNGNG
>>127
emacs-lisp は lisp としては古いという事を頭の片隅に置いといて
いただければ結構ですよ。いや、たまに
「Lisp は駄目だ。私は Lisp の経験があるがあれはまったく時代遅れの酷い代物だ。」
と言ってる人に詳しく聞いてみると経験は emacs-lisp のみだったりする事があるので…。
0129デフォルトの名無しさんNGNG
そういやハンディリファレンス欲しいとか言ってた人はどうした?
やっぱ PDF とかじゃ要らないのかね。
0130デフォルトの名無しさんNGNG
スレ違いではありますが、ご存知の方が入ればよろしくお願いします。
GentooLinuxにおいてclisp,ilisp-cvs(ilispではtetexを入れる必要があったので
変わりにCVS版をひとまず入れました)を入れて、>>89さんのilisp用の設定を
.emacsに書き込み、EmacsからM-x ilisp-modeとしてclispを起動しました。
そのときに表示されたエラーが以下のものです。

[1]>
[2]> ;;; Loading /usr/share/emacs/site-lisp/ilisp-cvs/ilisp-pkg.lisp
*** - LOAD: A file with name /usr/share/emacs/site-lisp/ilisp-cvs/ilisp-pkg.lisp does not exist
Break 1 [6]> ;;; Loading /usr/share/emacs/site-lisp/ilisp-cvs/cl-ilisp.lisp
*** - LOAD: A file with name /usr/share/emacs/site-lisp/ilisp-cvs/cl-ilisp.lisp does not exist
Break 1 [8]> ;;; Loading /usr/share/emacs/site-lisp/ilisp-cvs/cl-chs-init.lisp
*** - LOAD: A file with name /usr/share/emacs/site-lisp/ilisp-cvs/cl-chs-init.lisp does not exist
Break 1 [10]>

ilisp-pkg.lispというファイルがないと表示されていますが、
このファイルは /usr/share/common-lisp/source/ilisp/ の下にあります。
上記のエラーメッセージが0)Emacs,1)clisp,2)ilispのどれが表示させて
いるのかすら分りません(Emacsの可能性は低いかな)。どなたかよろしくお願いします。
0131デフォルトの名無しさんNGNG
;; Loading file /home/tomato/.clisprc.lisp ...
;; Loading file /usr/share/common-lisp/source/ilisp/ilisp-pkg.lisp ...
;; Loaded file /usr/share/common-lisp/source/ilisp/ilisp-pkg.lisp
;; Loaded file /home/tomato/.clisprc.lisp
[1]>
[2]> ;;; Loading /usr/share/emacs/site-lisp/ilisp-cvs/ilisp-pkg.lisp
*** - LOAD: A file with name /usr/share/emacs/site-lisp/ilisp-cvs/ilisp-pkg.lisp does not exist
Break 1 [6]> ;;; Loading /usr/share/emacs/site-lisp/ilisp-cvs/cl-ilisp.lisp
*** - LOAD: A file with name /usr/share/emacs/site-lisp/ilisp-cvs/cl-ilisp.lisp does not exist
Break 1 [8]> ;;; Loading /usr/share/emacs/site-lisp/ilisp-cvs/cl-chs-init.lisp
*** - LOAD: A file with name /usr/share/emacs/site-lisp/ilisp-cvs/cl-chs-init.lisp does not exist
Break 1 [10]>

${HOME}/.clisprc.lisp に(load "/usr/share/emacs/site-lisp/ilisp-cvs/ilisp-pkg.lisp")
なんて書いてもダメぽでした。今日はもうねまつ。。
0132デフォルトの名無しさんNGNG
力になりたいけどダメぽ
おやつみ
0133デフォルトの名無しさんNGNG
(sleep 'zzz)
0134デフォルトの名無しさんNGNG
CVS版がいけないっぽいので、明日の夜はTeXの巨大なパッケージと一緒に
app-emacs/ilispを入れてみてから、もう一回試してみるぽ。
っていうか、仕組みが分っていれば解決できそうなもんだけど
Emacsにも慣れてないとかなり難しいぽ。
0135デフォルトの名無しさんNGNG
ELISPで*scratch*バッファに式書いてC-jで手軽に評価するようなことが
CommonLispでもできればいいなあ。そうしたらもう最強だろうな。
0136デフォルトの名無しさんNGNG
>>135
emacs-guile というパッケージ使うと *scratch* で C-j で Scheme が評価で
きるようになる(scheme-interaction-mode)。これを参考にして同じ方法で CL
用に実装すればできるよ。昔 Gauche 用のをちょっと書いたことがある。でも、
シンボルの補完みたいなことをしようとするとちょっと大変。
emacs-guile はここ(guile-emacs ではない)。
http://sourceforge.net/project/showfiles.php?group_id=3545
0137デフォルトの名無しさんNGNG
FranzのELIパッケージみたいなことがしたいのか?
ILISP/SLIMEと本質的には同じだと思うってかLisperなら普通に暮らしてる環境なんだが。
135が何をしたいのか誰か解説してくれ。
0138デフォルトの名無しさんNGNG
>>130
> スレ違いではありますが、ご存知の方が入ればよろしくお願いします。
このスレでもいいと思いますよ。

> ilisp-pkg.lispというファイルがないと表示されていますが、
> このファイルは /usr/share/common-lisp/source/ilisp/ の下にあります。
> 上記のエラーメッセージが0)Emacs,1)clisp,2)ilispのどれが表示させて
> いるのかすら分りません(Emacsの可能性は低いかな)。どなたかよろしくお願いします。
このエラーメッセージを出しているのはclispだと思います。ilispに含まれるファイル群で
ファイル名に.lispが付いているのは、Common Lisp処理系が解釈するはずのファイルです。

> [2]> ;;; Loading /usr/share/emacs/site-lisp/ilisp-cvs/ilisp-pkg.lisp
> *** - LOAD: A file with name /usr/share/emacs/site-lisp/ilisp-cvs/ilisp-pkg.lisp does not exist
> Break 1 [6]> ;;; Loading /usr/share/emacs/site-lisp/ilisp-cvs/cl-ilisp.lisp
...
> ilisp-pkg.lispというファイルがないと表示されていますが、
> このファイルは /usr/share/common-lisp/source/ilisp/ の下にあります。

clispがilisp-pkg.lispを探しているディレクトリは、
/usr/share/emacs/site-lisp/ilisp-cvs/ilisp-pkg.lisp
なので、
/usr/share/common-lisp/source/ilisp/
を探すように、clispを諭すのが正道でしょう。

しかし、とりあえず、動けばいいやと言うレベルの解決策は...
/usr/share/common-lisp/source/ilisp/以下の各ファイルへ
/usr/share/emacs/site-lisp/ilisp-cvs/からシンボリックリンクを張るなんて
どうでしょうか。
0139デフォルトの名無しさんNGNG
>>128
> 「Lisp は駄目だ。私は Lisp の経験があるがあれはまったく時代遅れの酷い代物だ。」
> と言ってる人に詳しく聞いてみると経験は emacs-lisp のみだったりする事があるので…。
最初にemacs-lispを触ったのはc, c++, perl5を経験したあとでしたが、それでも言語の柔軟性に感銘を受けました。
実際問題、フリーのLispで開発環境が一番ととのっているのは、emacs-lispだったりして。
0140130NGNG
>>138
朝のお忙しい中、ありがとうございます。
not existのエラーが出ていた三つのファイルに対して、
/usr/share/emacs/site-lisp/ilisp-cvs/の下にシンボリックリンクを貼り
M-x ilisp-compile-inits としてコンパイルしたら以下のファイルが
リンクを作成したディレクトリに新たに出来ました。

-rw-r--r-- 1 root root 1171 Feb 2 08:24 ilisp-pkg.fas
-rw-r--r-- 1 root root 669 Feb 2 08:24 ilisp-pkg.lib
-rw-r--r-- 1 root root 37767 Feb 2 08:24 cl-ilisp.fas
-rw-r--r-- 1 root root 12939 Feb 2 08:24 cl-ilisp.lib
-rw-r--r-- 1 root root 2916 Feb 2 08:24 cl-chs-init.fas
-rw-r--r-- 1 root root 281 Feb 2 08:24 cl-chs-init.lib

これで全てうまく逝きました。どうもありがとうございました。
インストール時に解決する方法は、もう少しelispとCommonlispに慣れてから
調べたいと思います。
0141デフォルトの名無しさんNGNG
clispを使っている人へディレクトリの変更の仕方は(ext:cd "/cygdrive/c/src/lisp")です。
0142デフォルトの名無しさんNGNG
>>141 エスパーですか
0143デフォルトの名無しさんNGNG
>>141 リスパーですか
0144デフォルトの名無しさんNGNG
下がりすぎ
0145デフォルトの名無しさんNGNG
>>139
実はそうでもない。Scheme や Common Lisp の環境も実は結構良い。
Scheme/CommonLisp が Emacs Lisp よりで優れている点として開発環境で思いつくのは
Scheme - PLT Scheme のエディタは変数や関数の関連を線で表示してくれたりする。
関数定義んとこで関数名を書き換えると,他のところで使われる部分も修正されたりとか。
Common Lisp - SLIME はエラーやワーニング等をソース上で下線を引いて教えてくれる
デバッガもバックトレースやスタック内のインスペクト等は充実。
あたりかね。ただ SLIME はドキュメント類が未整備なので Emacs や Lisp にある程度
慣れてないとエラーやトラブル時に困るのでオススメしにくいんだよね。セットアップは
簡単なんだが。
0146デフォルトの名無しさんNGNG
SLIMEって期待できそう。CLISPに対応していればナー。Windowsで使えるのに。

有料、無料を問わずCommon Lispの開発環境でソースレベルデバッガが付いているものはありますか?
0147デフォルトの名無しさんNGNG
>>143
リスカーです
0148デフォルトの名無しさんNGNG
結論。

Lispを使うのは、

リスキーです。
0149デフォルトの名無しさんNGNG
Lispを使う人は、
リスパーです。
0150デフォルトの名無しさんNGNG
Lisper真須美
0151デフォルトの名無しさんNGNG
コラッ!
0152デフォルトの名無しさんNGNG
SLIME は CLISP にも対応してるよ.Cygwin で動かしてる人も居るみたい.
Windows ユーザーの言うソースレベルデバッガってのは VisualStudio みたいに一行一行
実行していくスタイルのデバッガって事だよね?フリーでは見た事ないな.貧乏 Lisper
なので商用は知らないけど.

で,それだけだとダメポって感じなんだけど,実は Lisp ではあんまり一行一行実行って必要ないよ.
漏れは元々 C 使い(今もだけど)で VisualStudio とかから入ったクチだけど lisp でのデバッグは
スタイルが違う(最初は戸惑ったけど).デバッグビルドして〜デバッガ起動して〜とかそーゆうのじゃねぇわけ.
1. エラーで止まる(ここでいきなりデバッガが起動してる)
2. バックトレース(いきなり取れる)
3. スタック上の変数を調べる(大抵これでウマー)
4. もし原因がみつからないならスタックを一つ辿る
5. 3-4 の繰返し
ってのがほとんど.バックトレース時の表示でソースのどの辺かもわかるし,CMUCL なら
:vsource ってコマンドでその場所周辺のソースが表示できるしね.あとは関数をトレース
するとか.フォーム一個実行する step とかあるけど,ほとんど使った事ない.
0153デフォルトの名無しさんNGNG
しまった age ちゃった.ゴメンなさい….
0154デフォルトの名無しさんNGNG
LispやSchemeってどのくらいの期間でマスター出来ますか?
0155デフォルトの名無しさんNGNG
んー。。。
誰か、例題出してくれませんか?
はじめて3日ですけど、自分で何とかできそうな奴。
0156デフォルトの名無しさんNGNG
[問1] リスト処理関数 reverse, append, length, mapcar 等を作成せよ。(20点)
0157デフォルトの名無しさんNGNG
>>155
はじめて3日という情報だけでは、他の言語でプログラミング経験があるのか
どうかとか、使える関数とかその辺が伝わってこないので難しいな。cons って
なに?とかいうレベルなら >>69 の手書きとかいいと思うが。マクロの理解には
リストの理解が必須だからね。

でも、とりあえず例題を出しておくか。
[問2] '(1 2 3 4 5 6 7 8 9 10) のような数字のリストを引数として取り、
1. ぜーんぶ足した総和を求める関数 : (f1 '(1 2 3)) => 6
2. それぞれの数を二乗したものの和を求める関数 (f2 '(1 2 3)) => 14
を作成せよ。簡単だ〜って場合はできるかぎりいろんな方法で実装してみてください。
0158デフォルトの名無しさんNGNG
>>154
難しい質問ですね。マスターするにはそれなりの期間が必要ですが
個人差が大きいですから。経験的には普通の言語よりは短くて数ヶ月で
そこそこのレベルに到達できます。ただし病的に括弧を恐れる人は別ですが。

もちろん人によっては Lisp を短期間で極める事は可能でしょうが、大抵
本当に学ぶにはどんな言語も 10 年くらいはかかるものです。↓とか参照の事。
http://www1.neweb.ne.jp/wa/yamdas/column/technique/21-daysj.html
0159デフォルトの名無しさんNGNG
Mac OS X 10.3.2 で clisp のインスコに失敗しますた。症状はまさにコレと同じ。
#-(and) 付ければビルドは通るんだけど、端末上の文字が化けるようになってしまった。

http://article.gmane.org/gmane.lisp.clisp.general/7834

上手くいった人いませんか?
0160デフォルトの名無しさんNGNG
>>156
155じゃないけど、mapcar以外は出来た。
mapcarができない。
リストを作り直してそれぞれにapplyでやれば出来そうだけど、
リストを作り直すのが上手くいかない。
ヒントください。
0161デフォルトの名無しさんNGNG
>>160
おそらく複数のリストを引数としてとるちゃんとした mapcar を作ろうとして
ますね?リストを作り直すだけでは、どうやろうとしたのかイメージがつかめないけど。
関数を二つつくって、一個は N 引数を、一個はリスト一つだけ、と分割して考えれば
どうでしょう。かなり推測に頼ってるので的外れなヒントになる可能性も高いですが…。
0162デフォルトの名無しさんNGNG
>>160 問1のヒント
(define (identity obj) obj)

(define (for-each-list f g n lst) ; not末尾再帰版
(if (null? lst) n
(g (f (car lst)) (for-each-list f g n (cdr lst)))))

(define (my-copy-list lst)
(for-each-list identity cons '() lst))

(define (my-map-1 f lst)
(for-each-list f cons '() lst))

(define (my-map-n lsts)
...)

(define (my-map f lst1 . lsts)
(if (null? lsts) (my-map-1 f lst1)
(my-map-n f (cons lst1 lsts)))

この for-each-list を使って、reverse, append, length も書ける。
0163デフォルトの名無しさんNGNG
>>159 ACL Trial 使っとけ。
ttp://www.geocities.co.jp/SiliconValley-PaloAlto/7043/ACLTutorial.html#sec2
0164160NGNG
やっと出来たよ。
もう眠いよ。あひゃひゃ。
全部で5個も関数作ってるから、多分「なんじゃこりゃ」と言われそう。

>>161-162
もう頭回らないので、明日じっくり読もうと思います。サンクス。
0165デフォルトの名無しさんNGNG
>>162
つーかここでヒント出すならCommonLISPで書こうや
0166デフォルトの名無しさんNGNG
>>165 それじゃヒントつーか解答になっちゃうじゃん.
それより激しく Schemey なヒントだな.CL 初心者を Scheme に引き込も
うとしてるんじゃねーの?

まぁ,とりあえず >>160 は自分書いたやつを晒せと.
「できました」じゃ良いのか悪いのか採点しようがないじゃん.
0167デフォルトの名無しさんNGNG
とりあえずANSI common lispを進めてたときの記録を

(defun $reverse (lst)
(reduce #'(lambda (a b) (cons b a)) lst :initial-value nil))

(defun $length (lst)
(if (null lst)
0
(+ ($length (cdr lst)) 1)))
0168デフォルトの名無しさんNGNG
なんだか微妙にちぐはぐだな。かたや高階関数を使いこなしているかと思いきゃ $length は
末尾再帰でもなんでもない再帰だし。末尾再帰を使わないのに reduce とか使いこなすって,
どーゆう段階でそんなんなるんだろ。ちょっと興味あるね。↓みたいのならわかるんだが。

(defun $reverse (lst)
(if (null lst)
nil
(append ($reverse (cdr lst)) (list (car lst)))))

(defun $length (lst)
(if (null lst)
0
(+ 1 ($length (cdr lst)))))
0169デフォルトの名無しさんNGNG
reduceを使ったreverseカコイイ。
0170167NGNG
>>168
記録からの抜き書きなので同じ時期にやったわけじゃないです。
0171デフォルトの名無しさんNGNG
>>170
なるほど納得。

>>163
MacOS って逝ってんだから勧めるなら OpenMCL とか MCL じゃないの?

でも初心者の数は予想通り少ないねぇ。開発環境整えるだけでも結構敷居が
高いのからなぁ。でも開発環境無しだとシンボル補完もキー一発のマニュアルも
無いわけで厳しいだろうしな。Emacs + ilisp + CLISP パッケージとか作ったら
需要はあるだろうか?
0172160NGNG
ただいま〜今日は1日中眠かったよ…
解答うpしますね。
ちなみに環境はxyzzyです。

(defun _reverse (x &optional (y nil))
(if (null x)
y
(_reverse (rest x) (cons (first x) y))))

(defun _append (x y)
(if (null x)
y
(cons (first x) (_append (rest x) y))))

(defun _length (x &optional (y 0))
(if (null x)
y
(_length (rest x) (+ y 1))))
0173160NGNG
(defun mc1 (x)
(if (null x)
nil
(cons (list (first x)) (mc1 (rest x)))))

(defun mc2 (x y)
(if (null x)
nil
(cons (cons (first x) (first y)) (mc2 (rest x) (rest y)))))

(defun mc3 (x)
(if (null (rest x))
(b (first x))
(mc2 (first x) (mc3 (rest x)) )))

(defun mc4 (x y)
(if (null y)
nil
(cons (apply x (first y)) (mc4 x (rest y)))))

(defun _mapcar (x &rest y)
(mc4 x (mc3 y)))

こんな感じ。
0174160NGNG
あ、mc1使ってないや。
0175160NGNG
すみません。173じゃなくて、こっちで。
もう寝ます。

(defun mc1 (x)
(if (null x)
nil
(cons (list (first x)) (mc1 (rest x)))))

(defun mc2 (x y)
(if (null x)
nil
(cons (cons (first x) (first y)) (mc2 (rest x) (rest y)))))

(defun mc3 (x)
(if (null (rest x))
(mc1 (first x))
(mc2 (first x) (mc3 (rest x)) )))

(defun mc4 (x y)
(if (null y)
nil
(cons (apply x (first y)) (mc4 x (rest y)))))

(defun _mapcar (x &rest y)
(mc4 x (mc3 y)))
0176デフォルトの名無しさんNGNG
>開発環境整えるだけでも結構敷居が高いのからなぁ。
シェルに向かってコマンドを打てない奴がLispのプロンプトに向かってS式を打てるわけがない。
0177デフォルトの名無しさんNGNG
>>176
Windows ユーザーの事が頭にあったんだが…。いや漏れは ~/site-lisp 以下は
Windows なマシンと同期するために定期的に tar 玉にまとめてるんだが、これに
Emacs と CLISP つっこんで clisp のパスを決め打ちにするとかして
Emacs + site-lisp (ilisp込み) + CLISP
としたら Windows ユーザーに良いかな〜と。インスコが展開 + .emacs のコピー
だけで済むのは楽じゃん。と思ったがこれでは MS-IME が使えない罠。
0178デフォルトの名無しさんNGNG
スレ違いっぽいけど>>177と似たような話なので言うけど、
Windowsユーザーのことを本気で考えるなら.emacsにいきなり
elispで書かせる風習を*いいかげんに*なんとかしてほしいもんだ。
.emacsの修正スキル取得は最初の鬼門であるからして。
より具体的にはセットアップウィザードみたいなめにゅー形式で
機能の追加削除をロギングマクロみたいに*自動更新*とか
までやっちゃってほしいもんだ。
あと現状のWindows版て、Windows標準UIのことを*完全無視*
してくれちゃってる辺りも本当になんとかしてほしいもんだ。
ほんとはあの変態キーバインドもなんとかしてほしいんだけど、
そこまで言っちゃうと、変態に慣れきったお兄様方がら
*じゃあ、使うなよ!*とか文句言われておしまいなので
これ以上言いません。
0179デフォルトの名無しさんNGNG
>>178
それはMeadowの人たちに対してだよね?
Emacsもう、なくなるまで変わらんよ。。。
0180デフォルトの名無しさんNGNG
>>179
香ばしいねぇ。これが 2ch 名物アレか。しっかし空気読めてない香具師だな…。
0181デフォルトの名無しさんNGNG
>>179 厨の煽りにマジレスすんなって。>>178 は真性の予感。
0182デフォルトの名無しさんNGNG
>178
黙ってxyzzy使ってろ
0183デフォルトの名無しさんNGNG
Emacsってメニューから,オプションを変更するためのボタンの並んだ
(テキスト)画面に進めませんでしたっけ?
あれが和訳されるといいのかなぁ.
まあelisp好きじゃないからemacsいじったことないけど.
Elispだって柔軟さについては大抵の言語にひけを取らないわけで,
elispマクロによるUIの向上はいくらでも余地がありますよね.

あと,何かGatesの名を冠したelispを読ませるとC-sでセーブとかできるんじゃなかったっけ.
Emacsの良さはC-c C-sにあるんじゃないよね.(キー違うかも)
0184デフォルトの名無しさんNGNG
初心者スレたるもの、マターリが基本。煽らず、煽られず。
ところで問1とか解答とか解説しちまっていいんかね?
他にやってる香具師いるの?
0185デフォルトの名無しさんNGNG
>>184
すいません。平日は言語の勉強もなかなか厳しいです;;
0186デフォルトの名無しさんNGNG
>>184
そういやそうだな。酒のんだ勢いでネタバレしちまうところだった。
んじゃ週末まで待つよ。
0187デフォルトの名無しさんNGNG
つーかね、CommonLispでGUI仕様があれば、LISPも使われるんじゃないのかな?

で、ここでその仕様について語ってみようよ。
JAVAが標準な世の中だぜ?
LISPだって標準なフレームワークや仕様があれば現場で採用されるかも・・・。
0188デフォルトの名無しさんNGNG
初心者スレで語られても困る
0189デフォルトの名無しさんNGNG
本スレ逝け。
0190デフォルトの名無しさんNGNG
>>177 WindowsではEmacsじゃなくてMeadow2の方がいいとおもう。
Meadow2 + .emacs + ilisp + .ilisp + GNU CLISP + HyperSpec
のインストーラか、圧縮ファイルを配れば便利かも。

ACL体験版のほうが楽か。
0191デフォルトの名無しさんNGNG
ACL 体験版ってヒープ制限と 60 日毎のライセンス更新だっけ?どーもなぁ。

確かに Meadow2 の方が良いだろうとは思うのだが。漏れは UNIX : Win 比率が 9:1
くらいなんで Windows 専用機能はあんま要らないというかよくわかないんだよね。
Meadow だとインストールとか設定は NetInstaller とかでなんとかなったりする?
0192デフォルトの名無しさんNGNG
初心者スレのつもりが、
本スレから出て来た奴らがLisp人口を増やすための方策を論ずるスレになっちまったな。
0193デフォルトの名無しさんNGNG
御免なさい。今後気をつけます。
0194デフォルトの名無しさんNGNG
>>156
Scheme 初心者です。append と mapcar(map?) は難しすぎて無理でした...
(define (my-reverse list)
(if (list? list)
(let loop ((list list)
(result '()))
(if (null? list)
result
(loop (cdr list) (cons (car list) result))))
list))
(my-reverse) ; => err
(my-reverse '1) ;; => 1
(my-reverse '1 '2) ;; => err
(my-reverse '(1 2 3))
(my-reverse '(1 2 (3 4)))
(define (my-length list)
(let loop ((list list)
(result 0))
(if (null? list)
result
(loop (cdr list) (+ result 1)))))
(my-length) ;; => err
(my-length '(1 2 3 4))
0195デフォルトの名無しさんNGNG
>187
CLISPを単体で使ってみたLISP初心者です。
LISPはいい言語だと思うのですが(煩わしい作業が乏しい)
なんではやらないんでしょうね?
速度もjavaとそれほど変わらないぐらいらしいのに。
インタラクティブに開発ができるのだから、javaよりは開発効率
は宵と思うけどなぁ。
0196デフォルトの名無しさんNGNG
何故 Scheme 使いが?まぁ、いいか。
評価:
非常にノーマルな Scheme です。ちゃんと末尾再帰してるし。
半分解けてるので 10 点。なんで append ができないのかが謎。
>>168 に出ている最悪の reverse 実装をみてもうちょっと
マシな reverse を実装してみましょう。何で 168 のが悪いのか
理由も含めて 1 レス以内にまとめる事。できれば Common Lisp で!
0197196NGNG
しまった意味不明なレスをしてしまった。できてないのは append だよな。ワリィワリィ。忘れてくれ。
0198デフォルトの名無しさんNGNG
Scheme ならば list と云う変数名を使うのはマズヒ。
0199160NGNG
ただいま〜

_| ̄|○

漏れのカキコミは皆スルーか…
0200デフォルトの名無しさんNGNG
>>199
落ち込むなYO。別にスルーしたわけじゃなくて、マダやってる香具師が
いるから解答しないだけだ。全部末尾再帰だし特にツッコミどころが無い
からな… mapcar 以外は。
0201デフォルトの名無しさんNGNG
>>198
listを使わないならマズくないだろ
0202デフォルトの名無しさんNGNG
初心者スレだけに list の変数名は list にと覚えたらマズーかも。
Scheme だと変数名に list を使っちゃうと関数の list が使えなくなるんだYO!!
…と Common Lisp スレで言うのもなんとなく意味無いような気もする。
0203デフォルトの名無しさんNGNG
みなさん再帰での実装ばかりですが、Common Lisp では再帰よりも繰返しを使っ
て書くことのほうが多いです。
参考: http://www.lisp.org/table/style.htm#efficiency
copy-list の 7 種類の実装が載っているあたり。

[問3] 繰返し(dolist, dotimes, do, do*, loop 等) を使って問1を解け。
0204デフォルトの名無しさんNGNG
>>203 がイイこと言った。
Common Lisp では反復的な操作は反復で。再帰的な操作は再帰でが基本です。
0205デフォルトの名無しさんNGNG
>>199
まず、関数名/変数名に気をつかおう。変数 x がリストなのか関数なのかコー
ドを読まないとわからないのはつらい。それと mc1, mc2, ... という名前で
は何をしている関数なのかさっぱりわかりません。

Common Lisp では長い関数名/変数名が好まれます(というか長くなっても許される?)。
0206デフォルトの名無しさんNGNG
無名関数を引数として受け渡すときに、#' のをよく見かけるのですが、
これはないとあかんもんなんですか? なくても期待通りの動作をする
ので違いがいまいち掴めてません。

あるときとないときで挙動が違う身近な例を教えていただけると
理解が早くて嬉しいです。処理系は CLISP を使っています。
下は HyperSpec にあった例であってもなくても同じ挙動をします。

(defun adder (x) (lambda (y) (+ x y)))
(setq add3 (adder 3))
(funcall add3 4) => 7

(defun adder (x) #'(lambda (y) (+ x y)))
;; (defun adder (x) (function (lambda (y) (+ x y))))
(setq add3 (adder 3))
(funcall add3 4) => 7
0207デフォルトの名無しさんNGNG
>>206
>>45
0208デフォルトの名無しさんNGNG
>>45より HyperSpecにある、macroとしてのlambdaの説明
http://www.lispworks.com/reference/HyperSpec/Body/m_lambda.htm
> (lambda lambda-list [[declaration* | documentation]] form*)
> == (function (lambda lambda-list [[declaration* | documentation]] form*))
> == #'(lambda lambda-list [[declaration* | documentation]] form*)
つまり無名関数に#'をつけてもつけなくても挙動は常に同じになるように規定されています。
違う挙動になる例は存在しません。

じゃあ、いつ#'を使うかといえば、(reduce #'- '(1 2 3 4)) => -8 なんていうシンボルに
対してでしょうか。(reduce - '(1 2 3 4)) とやると、-のvalue cellが参照されてしまい
ます。じゃあ'をつけて(reduce '- '(1 2 3 4))なら同じかというと、違います。
(結果として同じになることもありますが、動作原理は違います。)
(progn
  (defun foo (x y) (+ x y))
  (flet ((foo (x y) (* x y)))
    (values (reduce 'foo '(1 2 3 4))
            (reduce #'foo '(1 2 3 4)))))
=> 10
24
一般に関数名が求められている場所で、#'fooをつかうとその場所でのレキシカルな環境
でfooという関数をさがします。'fooをつかうとグローバルな環境でfooという関数を
さがします。glossaryでfunction designatorを調べるといいかもしれません。

ちなみに#'というのはリーダーマクロといって、
#'(lambda () (foo))と(function (lambda () (foo)))はreadによって文字列から
Lispオブジェクト(この場合はリスト)に変換されたあとは、区別できません。
(tree-equal (read-from-string "#'(lambda () (foo))")
            (read-from-string "(function (lambda () (foo)))"))
0209デフォルトの名無しさんNGNG
>>207-208
おお。さっそくありがとうございます。分かりました。
ときに、なくても同じなのに #' を付ける慣習があるのは、
気分の問題(あるいは、シンボル時との見た目の整合性をはかるため)
でしょうか?

ついでにシンボルの持つふたつのセルについても学べました。
つまり、こんなこともできちゃうのですね。

(setf (symbol-value 'test) 0)
;; (setq 'test 0)
(setf (symbol-function 'test) (lambda () (incf test)))
test => 0
(test)
test => 1
0210デフォルトの名無しさんNGNG
俺も習慣で無名関数にも#'を付けるけど、理由はわからん。
Emacs Lispだと理由があったような気もするな。
0211デフォルトの名無しさんNGNG
>>210 Emacs Lisp でも lambda に #' を付ける意味はないぞ。むしろ付けないほうが効率が良い。
0212デフォルトの名無しさんNGNG
>>211
効率に影響するってことは意味があるのでは・・・?
0213デフォルトの名無しさんNGNG
>>212 211 は「付ける意味はない」と言ってるんだから……
まぁ付けない方が良い理由は↓を参照汁。
http://www.mew.org/~kazu/doc/elisp/function.html
まぁ elisp の話はスレ違いだと思うので sage
0214デフォルトの名無しさんNGNG
common lispだと大体みんなつけるけどね。
0215デフォルトの名無しさんNGNG
"ANSI common lisp"によると
#'(lambda (x y) (+ x y))の"lambda"は初期のLispで関数とリストが
同じ表現で扱われていて区別出来なかったため、最初に"lambda"が来るか否かによって
区別したそうな。で、common lispではその心配はなくなってlambdaに意味はなくなり
#'((x y) (+ x y))で無名関数を表すようにしても問題はないのだが、
lambdaをつけるのが習慣であったため残したのだと。

lambdaってのは"無名関数ですよ"と宣言するのが目的なわけだから、
漏れは普通の関数と整合性を保つために#'を付ける方がいいような気がする。
0216デフォルトの名無しさんNGNG
(lambda (x y) (+ x y))
#'(lambda (x y) (+ x y))
#'((x y) (+ x y))

つまりこの3種類が可能ということですか。
初心者はこれらを構文糖と考えてしまっていいんですね。
0217デフォルトの名無しさんNGNG
> #'((x y) (+ x y))で無名関数を表すようにしても問題はないのだが、
> lambdaをつけるのが習慣であったため残したのだと。

この >>215 の記述が原因だな.初心者さんよ,これは #'((x y) (+ x y)) が可能と言ってる
んじゃないんだよ.というわけで #'((x y) (+ x y)) は不可能.ダメっす.
0218デフォルトの名無しさんNGNG
lambdaって単語にどうしてこれほど拘るんだろ。
アメリカじゃChurchは論理学の分野で神的存在なんですかね。
0219デフォルトの名無しさんNGNG
functionなどというキーワードを使うにしても,結局
「ああこれはλ関数に使うのね」などと覚えることになるのではないか.

それと >>218 よ,Churchが神なのではない.神が誰かは知らない.
しかし少なくともLispは真理を説いた経典だ.
0220215NGNG
誤解を招く言い方にはなっていないような気もするが、現に誤解を招いてしまったので
>>216よ。#'((X Y) (+ X Y))は使えないぞ。
0221デフォルトの名無しさんNGNG
>>218
習慣の問題でしょ。
0222デフォルトの名無しさんNGNG
>>215
期待しちまったじゃないか…
ホントにそう書けたらいいのに.
0223デフォルトの名無しさんNGNG
>>222
Lisp ではその手のカスタマイズは可能だからガッカリすることはない。
やりたいようにやってよし。例えば
(mapcar {|x| (* x x)} '(1 2 3 4 5))
=> (mapcar (lambda (x) (* x x)) '(1 2 3 4 5))
とするリーダーマクロが↓で紹介されている。(引数んとこで | を使うのはマズーだと思うが)
ttp://www.geocities.co.jp/SiliconValley-SanJose/7474/cmuclMemo.html#0013
0224デフォルトの名無しさんNGNG
>>223
Lispってそこまでカスタマイズできたのか!
てっきり、括弧しか使えないものかと思っていた・・・
0225デフォルトの名無しさんNGNG
>>224
でもそーゆう激しいカスタマイズは基本をおさえて一人前になってからだぞ。
精進汁。ちなみに前置記法がダメポの人のための #${ 1 + 2 * f(x) + g(x, y) }
みたいなものすらある。要するに S 式に変換できりゃいいわけだからな。

…でも reader macro の話は初心者スレ向きの話題なのか? >>223
まぁ、モチベーションの維持のためには良かったのかもしれないが。
0226newbieNGNG
ilisp の使い方でお聞きしたいことがあるのですが、、、

>> 89さんの設定を利用し ilisp で clisp を起動しています。

引数を調べたいと思って (dotimes のところで arglist-lisp
を実行すると、
dotimes (Macro): (???)
のような表示になってしまい、引数リストうまく表示されません。

なにか注意すべき点はありますか。
~/.emacs に書いたことは、 >>89 と同一です。
hyperspec-lookup, cltl2-lookup はうまく引けています。

(環境は Debian sid で emacs, ilisp, ilisp-doc, clisp 等
すべて最新版)
0227デフォルトの名無しさんNGNG
初心者とそうでない人との境界線は?
0228デフォルトの名無しさんNGNG
「初心者です」と書くか、名前が初心者なら、初心者。
0229デフォルトの名無しさんNGNG
>>226
私もclispでは同じようになってうまく表示されません。cmuclでは、うまくいきました。
clispではマクロは全滅みたいですね。

でもclispの引数の命名方法がいいかげんだから、表示されてもあまり手助けに
はならないんだよね。
REDUCE: (arg0 arg1 &key from-end start end key initial-value) ;; clisp
REDUCE: (function sequence &key key from-end (start 0) end (initial-value nil ivp)) ;;cmucl

調べたらclispの(arglist symbol)が返す情報が使われているみたい。
0230デフォルトの名無しさんNGNG
>>225
> >>224
> でもそーゆう激しいカスタマイズは基本をおさえて一人前になってからだぞ。
一人前になった頃には、前置記法マンセイな人に変貌していましたとさ、というオチに
なりそうな気がする。

Emacsでプログラミングしている初心者の人へ、長いシンボル名を入力するときに、
自分ですべて入力していたら、スペルミスとか、面倒だとかいやなことがイパーイある
ので、M-/ {dabbrev-expand} や ESC TAB {complete-lisp} を積極的に利用して楽を
しましょう。
(mul<ESC TAB> -> (multiple-value-p<ESC TAB> -> (multiple-value-prog1
0231デフォルトの名無しさんNGNG
(mul<ESC TAB> -> (multiple-value-
(multiple-value-p<ESC TAB> -> (multiple-value-prog1
0232猿以下でごめんなさいNGNG
ilispの使い方を教えて下さい
しかし丁寧に教えられても理解できないので
こんなもーんって程度でいいです
0233デフォルトの名無しさんNGNG
使い方?かつこんなもーん?でいいのか。
コピペですまんが Emacs の機能がこんなもーん
;; Emacs
C-SPC : S 式を一個選択
ESC C-k : kill-sexp : カーソル位置から始まる S 式を kill する
ESC C-a : beginning-of-defun : defun の先頭へ移動
ESC C-t : transpose-sexps : ポイント位置前後の S 式を入れ換える
ESC C-e : end-of-defun : defun の末尾へ移動
ESC C-f : forward-sexp : カーソル位置から始まる S 式の末尾に移動
ESC C-b : backward-sexp : カーソル位置より一つ後の S 式の先頭に移動
ESC C-d : down-list : 1 レベル内側の S 式へ移動
ESC C-u : backward-up-list : 1 レベル外側の S 式へ移動
ESC C-n: forward-list : 括弧のグループを超えて前方へ移動
ESC C-p: backward-list : 括弧のグループを超えて後方移動
ESC C-h : mark-defun : defun 全体をマークする
C-x n d : narrow-to-defun : defun の範囲に narrow する
C-x n w: widen : narrow-to-defun を解除
こんな機能があって ILISP を使うとさらに
;; ILISP
C-c L cltl2-lookup CLtL2 を引く
C-c H hyperspec-lookup HyperSpec を引く
C-c k compile-file-lisp ファイルをコンパイル
C-c l load-file-lisp ファイルをロード
C-c t trace-defun-lisp 関数のトレース ON/OFF
C-c ) find-unbalanced-lisp 括弧の不一致を見つける
C-c ; comment-region-lisp リージョンをコメントアウト
こんなもーん、が追加されまつ。
0234デフォルトの名無しさんNGNG
こんなのもあるのね
http://www.nongnu.org/grt/

GRT is a Common Lisp raytracing system
0235猿以下でごめんなさいNGNG
>>233
ありがとーん、ございます。
0236デフォルトの名無しさんNGNG
>>235
いやいや昆虫以下だと思うよ。
0237デフォルトの名無しさんNGNG
キー一覧みせられて納得するような昆虫がどこの世界に居るというのか。
0238デフォルトの名無しさんNGNG
トノサマバッタならそれくらいやってのけるよ。
0239デフォルトの名無しさんNGNG
バカ殿様バッタはできなかったって言ってるよ?
0240デフォルトの名無しさんNGNG
ヘタバッタ
0241デフォルトの名無しさんNGNG
バッタ━━━━━━(゚∀゚)━━━━━━ !!!!!
0242デフォルトの名無しさんNGNG
昨日初めて Scheme の仕様書を読んだ。
delay と force に感動した。
0243デフォルトの名無しさんNGNG
……で?それを CL の、しかも初心者スレで語ってどうしようというのだ?
初心者への説明:
delay と force ってのは遅延評価(呼ばれたときにすぐ実行され
ずに計算をサボる事だとでも思ってください)を行うためのオペ
レータです。↓みたいなもんだと思ってください。
(defmacro delay (&rest form) `(lambda () ,@form))
(defmacro force (form) `(funcall ,form))
で、コレを使うと評価するタイミングを遅らせることができます。
> (setf x (delay (expt 2 1000)))
#<CLOSURE :LAMBDA NIL (EXPT 2 1000)>
↑この段階ではまだ (expt 2 1000) は実行されない。
> (force x)
10715086071862... (ry
↑force してやっと評価されます。
これでなにが嬉しいかは、興味のある人がいたらまた後日。
0244デフォルトの名無しさんNGNG
delay/forceのもう一つの重要な点は、中身の評価は「一度きり」しかされないということ
0245160NGNG
>>200 mapcarのやり方、楽しみにしてます。
>>205 ご指摘ありがとうございます。

んで、明日は休みなので、>>162さんのfor-each-listで
reverse,append,lengthをやってみた。
とりあえずlambdaというのもつかってみた。
イマイチよく分かってない。

(defun _reverse (lst)
(for-each-list #'list #'(lambda (x y) (append y x)) nil lst))

(defun _append (lst1 lst2)
(for-each-list #'identity #'cons lst2 lst1))

(defun _length (lst)
(for-each-list #'(lambda (x) 1) #'+ 0 lst))
0246デフォルトの名無しさんNGNG
局所変数なるものがありますが、局所関数というものはないのですか?
lambdaでなくて、letの中で定義してletの中でしか名前が有効でないものです。
ないすかね??
0247デフォルトの名無しさんNGNG
>>245
>>172 をよーく見てると、同じパターンが何度も出てくるので抽象化できそう
な気がしてこない? その辺をうまく高階関数やマクロで抽象化できるように
なると Lisp 中級者かな。

n 個の引数をとる append はこうなる。
(defun _append-n (&rest lsts)
(cond ((null lsts) lsts)
((null (cdr lsts)) (car lsts))
(t (_append (car lsts) (apply #'_append-n (cdr lsts))))))
0248デフォルトの名無しさんNGNG
(let ((temp 0))
(defun func()(print temp))
)
と、書いたのですが、このfuncが使用しているtempはletに属しているのに
なんで外部から使用可能なfuncでも0と表示されるのか分かりません。
どなたかおわかりになられますか??
0249デフォルトの名無しさんNGNG
>>246
局所関数は flet と labels を使う。flet では再帰が使えないが、labels は
再帰できる。
(defun test ()
(flet ((square (x)
(* x x)))
(print (square 5)))
(labels ((fact (n)
(if (<= n 1) 1
(* n (fact (1- n))))))
(print (fact 5))))
それと、macrolet というのもある。
0250デフォルトの名無しさんNGNG
>>248
クロージャの説明クル━━━━━━(・∀・)━━━━━━ !!!!!
0251newbieNGNG
以前、ilisp の使い方を聞いたものです(>>226)。
>>229さん、調べてくださってありがとう!
そうですか。clisp ではダメなのか〜。
今度、cmucl の方で試してみます。

Emacs の describe-function と同じような
インターフェースで、Common Lisp の関数が
引けると便利かも。
0252デフォルトの名無しさんNGNG
>>251
Common Lisp の標準関数なら HyperSpec とか CLtL2 引くほうが例も載ってて
ウマーだぞ。describe したいだけならコレ(ILISP info)。89 氏の設定だと C-c i だな。
`<C-z> i (describe-lisp)'
Describe the previous sexp (it is evaluated). If there is no
previous sexp and if called from inside an ILISP buffer, the
previous result will be described.
0253デフォルトの名無しさんNGNG
>>248
Q1. スコープ外なのに見えるのはなんで? という疑問な場合
A1. それは func 自体は let の内側にあるからです.外部からはどうやっても temp の値を
操作する事はでませんが,func を通じて見る事だけはできます.

というレベルなのか

Q2. let が終った瞬間に temp って消えちゃうんじゃないの?(← C 的思考)
A2. Lisp では変数のスコープ(見える範囲)とエクステント(生存期間)はそれぞれ独立した概念です.
let の範囲内(lexical)でしか temp は参照できませんが temp そのものは生存期間は func と同じ
です.この例だと func の定義が上書きされてこの func の定義が不要になったときに temp は GC に
回収されるでしょう.
もちろん C のようにスタック上に変数領域を確保してスコープの終了と同時に自動的に消えるという変数も
コンパイラに指定する事はできます.ただしフリーの実装でこの機能(dynamic-extent)を安定して使える
コンパイラは少ないですので初心者にはお勧めできません.(CMUCL にはおそらく次のリリースで載ります
がまだ危険です! デフォルトで off になってます)

なのか解説者の力量不足でわかりません.どっちでしょう?
0254デフォルトの名無しさんNGNG
どちらの説明もしておいて正解。
0255デフォルトの名無しさんNGNG
で、問題は解答しちゃって良いのか?もうやってる香具師は居ないのか?
0256デフォルトの名無しさんNGNG
「質問Xのネタバレ見るな」とか先頭に入れとけばいいのでは?
0257デフォルトの名無しさんNGNG
そろそろ解説 plz
0258デフォルトの名無しさんNGNG
>>253
おお、なるほどそういうことですか。
すっかりCで考えてました。寿命とスコープが違うんですね。

今はlambdaだけで再帰が出来るかどうか考え中です。
0259デフォルトの名無しさんNGNG
[ネタバレ注意 : mapcar, lambda だけで再帰]
>>258
お役に立って幸いです。C でも malloc しちゃうとスコープとエクステント
がズレたりちゃうのでこの際スコープとエクステントについて意識する
ようにしちゃっても悪くないでしょう。lambda だけで再帰というのは、
直接関数名を使わずに再帰という事なら可能です。↓に一緒に載せてお
きました。考え疲れたらどーぞ。

>>257
では再帰無しの mapcar の例です。もっと効率がいい方法もあるかもしれません。
(といっても出題者じゃないのでひょとして再帰が正解なのかな?)
http://cgi.at.infoseek.co.jp/lambda_list/cgi-bin/lambda.cgi?name=Examples
0260デフォルトの名無しさんNGNG
このマジでいいスレだな〜
そのまんま入門者用のFAQができあがりそうだ。
0261156NGNG
>>259
初心者にとってはちょっと難しいかな?

出題者としては、「CommonLisp初心者」向けの問題なので、dolist あたりで
素直に解答してくれることを想定していました(Lisp ハッカにとってはつまら
ないでしょうけど)。http://www.lisp.org/table/style.htm#efficiency の
copy-list の 2 番目みたいなやつ。
0262デフォルトの名無しさんNGNG
局所変数はスコープが異なるだけで、参照されている限りは
寿命が尽きないならば、
(let ((temp 0))
(defun func()
(print temp)
(setq temp(+ temp 1)))
みたいな関数を定義したときこのFUNCは呼ばれるたびにtempの
値が変わると・・・lengthみたいなものを作ってるんですが、
二回目に関数を呼ぶと前の値に足されてしまう・・・。
やっぱり、関数の最後で局所変数を初期化するんですかね。
それとも、変数を解放(deleteみたいなもの?)する命令が
あるんでしょうか?
0263デフォルトの名無しさんNGNG
何か勘違いしてるんだと思う。
0264デフォルトの名無しさんNGNG
勘違いしてました。

こうだと思います。
(defun func(lst)
(let ((temp 0))
(labels
((foo(x)
(if(null x)temp
(progn
(setq temp(+ temp 1))
(foo (cdr x))))))
(foo lst))))
0265デフォルトの名無しさんNGNG
何が云いたいのか全くわかりません。
0266デフォルトの名無しさんNGNG
>>265
馬鹿は出てこなくていいです。
0267デフォルトの名無しさんNGNG
>>261
一日中格闘するくらいの気慨がある初心者なら十分理解できるよ。
ちょっとがんばればlispの実装のソースを読むくらいできたりする(俺の場合はclやり始めて一ヶ月くらいでcmuclのコードが少しは読めるようになったし)
0268デフォルトの名無しさんNGNG
>>264
foo(x)の代わりにfoo(x temp)ってして
(foo lst 0)ってすると思う。
0269デフォルトの名無しさんNGNG
一応確認させてね。262さんの疑問は、264の自己レスで解決したんだよね?
0270デフォルトの名無しさんNGNG
>>261
引数に関数とリストを一つ取る、という風に制限した mapcar のほうが良かったかもね。
そうすりゃ dolist でリストの各要素に関数を適用して結果を push してく、とか素直な
解答が出たのかも。
0271デフォルトの名無しさんNGNG
引数のリストはひとつだけ(関数が引数ひとつを許容する場合)というのを考えてみました。

(defun my-mapcar (fn list)
(if (not list)
nil
(cons (funcall fn (car list)) (my-mapcar fn (cdr list)))))

(my-mapcar #'1+ '(1)) => (2)
(my-mapcar #'1+ '(1 2 3)) => (2 3 4)

&rest を使った引数リスト数が任意のときでも、この考え方の延長線上でできますか?
ちょっと試してみたのですが、こんがらがってきたのでギブアップしてしまいました。
具体的には、&rest で得られたリストの cdr のリストを第2引数の list の cdr とともに
再帰の my-mapcar に引き渡す方法を見つけられませんでした。
0272デフォルトの名無しさんNGNG
そうそう。初心者はそこで引っかかると思ったわけ。
よーするに car と cdr に分離したいわけだよね?
せっかく作った my-mapcar を利用してみてはどうでしょう。
↓こんなんでヒントになるかな?

(my-mapcar #'car '((1 2 3) (a b c) (x y z)))
=> (1 a x)
(my-mapcar #'cdr '((1 2 3) (a b c) (x y z)))
=> ((2 3) (b c) (y z))

# 皆さん再帰好きですね〜。do や loop は全然出てこないなぁ。
0273デフォルトの名無しさんNGNG
CLの場合再帰の方がやりやすいような言語仕様になってるからじゃないのかなw
loopは直接的には単純だけど、かなり複雑な仕様があるし、doを使うよりは再帰の方が考えやすいような。
0274デフォルトの名無しさんNGNG
そーゆうもんですか。今は Paul Graham 本が入門書としてはメジャーだから loop
は知らない使えないって人が居るのはなんとなくわかるんだけどね。漏れなんかむし
ろ do のほうが複雑な気がするんだけどなー。

CL が再帰やりやすい仕様になってるというのは、末尾再帰の最適化が仕様に入って
ないあたりとかですか?インタプリタだと大抵末尾再帰の最適化が行なわれないので
デバッグ時に再帰が見えてウマー。
0275デフォルトの名無しさんNGNG
>>272
ありがとうございます。ただ、問題はそこではなくて、そうして得られた
((2 3) (b c) (y z)) をどうやって再帰呼び出しの my-mapcar の引数に
与えてやるか、というところで行き詰まっています。

>>272-273
動作機序を考える必要さえなければ、記述としては再帰のほうがシンプルだし
数学的にもそちらのほうが自然ですよね。
0276デフォルトの名無しさんNGNG
apply
0277デフォルトの名無しさんNGNG
あー、そっちか。そういや再帰したいんだっけか。私の浅慮でした。
別に関数を準備するか apply とか使うか、かな。
(defun foo (lst &rest lsts) ...)
という関数なら↓のようにすれば
(apply #'foo '(b c) '((x y) (2 3)))
== (foo '(b c) '(x y) '(2 3))
で lst = (b c), lsts = ((x y) (2 3)) となります。

> 動作機序を考える必要さえなければ、記述としては再帰のほうがシンプルだし
> 数学的にもそちらのほうが自然ですよね。

再帰で書いてシンプルになるならもちろんそれで何の問題もありませんが。
反復は特殊な再帰なわけですから反復で書こうと再帰で書こうと違いなどないのです。
だから短くて簡潔なほうを選ぶべきかと…。
0278デフォルトの名無しさんNGNG
mapcarの終了条件はどうするの?
0279デフォルトの名無しさんNGNG
1. リストが一つなら要素全部
2. 複数のリストなら一番短いやつの要素数
じゃないのか?
0280デフォルトの名無しさんNGNG
>>276-277
おお。できました。ありがとうございます。
(defun my-mapcar (fn list &rest lists)
(if (not list)
nil
(cons (apply fn (car list) (my-mapcar #'car lists))
(apply #'my-mapcar fn (cdr list) (my-mapcar #'cdr lists)))))

(my-mapcar #'1+ '(1 2 3)) => (2 3 4)
(my-mapcar #'+ '(1 2 3) '(4 5 6)) => (5 7 9)
(my-mapcar #'+ '(1 2 3) '(4 5 6) '(7 8 9)) => (12 15 18)
(mapcar #'+ '(1 2 3) '(4 5 6) '(7 8 9)) => (12 15 18)
0281デフォルトの名無しさんNGNG
* (my-mapcar #'list '(1 2 3) '(4 5) '(7 8 9))
((1 4 7) (2 5 8) (3 NIL 9))

* (mapcar #'list '(1 2 3) '(4 5) '(7 8 9))
((1 4 7) (2 5 8))
0282デフォルトの名無しさんNGNG
うーん。考える力が養われるなあ、、、
正直、ぬるま湯につかりっぱなしなので、とても勉強になる。
0283デフォルトの名無しさんNGNG
ぬるぽ湯
0284デフォルトの名無しさんNGNG
        ∬           ∬
        。。 ・・  。。  ・。。。   
     o0o゚゚       ∧⊇∧ ゚゚Oアッタマルネ
    。oO ,,ヘヘヘヘ,, ((( ・ω・ )∩  O0o
   (~~)ヽミ,, ・ω・ ミ   ::.:::.:     (´^ヽO,
  (⌒ヽ   ::.:::.:        (⌒)(゙゙゙)~
   /~゙゙ヾ⌒`ゝ-(~´`(⌒(⌒~ヽ~ ~~  
   ゝー ′ '"      ``"   
          ソウダナモー
0285デフォルトの名無しさんNGNG
再帰な解答マダー?
0286デフォルトの名無しさんNGNG
>>280
(not list) ==> (some #'null (cons list lists))
0287デフォルトの名無しさんNGNG
>>285 一般的な再帰な解答は既に出尽くしてない?
0288デフォルトの名無しさんNGNG
>>287 どこに?漏れの目が節穴なのかな?
0289デフォルトの名無しさんNGNG
すみません、append の解答例も是非お願いします
0290デフォルトの名無しさんNGNG
(defun my-append-1 (lst1 lst2)
(if (null lst1) lst2
(cons (car lst1) (my-append-1 (cdr lst1) lst2))))

(defun my-append (&rest lsts)
(cond ((null lsts) lsts)
((null (cdr lsts)) (car lsts))
(t (my-append-1 (car lsts) (apply #'my-append (cdr lsts))))))

my-append-1 を末尾再帰にして reverse を使うという手もある。
0291289NGNG
>>290
ああ、そこで apply なんですね。そーかー... どうもありがとうございます。
自力で解けないのが悔しい。
0292デフォルトの名無しさんNGNG
(defun foldr (kons knil lists)
(if (null lists)
knil
(funcall kons (car lists)
(foldr kons knil (cdr lists)))))

(defun my-append (&rest lists)
(foldr #'my-append-1 nil lists))
0293デフォルトの名無しさんNGNG
(defun my-append (&rest lists)
(reduce #'my-append-1 lists))
0294デフォルトの名無しさんNGNG
まあ、こまかいことなんだけど、
(append) => nil
(append 1) => 1
なので

>>292
(292-my-append 1) => Error: Attempt to take the car of 1 which is not listp.

>>293
(293-my-append) => Error: MY-APPEND-1 got 0 args, wanted 2 args.
0295デフォルトの名無しさんNGNG
ベタベタに反復な append です.でもきっとビルトインの append はこんな
動きをするハズです.速度と効率しか見てません.
>>294 さんの指摘でさらに長くなりました….

(defun my-append (&rest lsts)
;; 頭の nil をとばす
(do ((l lsts (cdr l)))
((or (null lsts) (not (null (car l)))) (setq lsts l)))
;; 先頭が atom のみだったらそれを返す
(when (atom (car lsts))
(if (null (cdr lsts))
(return-from my-append (car lsts))
(error "~S is not a list." (car lsts))))
;; 先頭となる result と cons したセルを指す ptr を準備
(let* ((result (cons (caar lsts) nil))
(ptr result))
;; 先頭のリストを cons する.このとき ptr はリストの末尾のセルを指す
(do ((p (cdar lsts) (cdr p)))
((null p))
(setq ptr (setf (cdr ptr) (cons (car p) nil))))
;; 末尾のリスト以外をコピー(末尾のリストは ptr で指すだけ)
(do ((l (cdr lsts) (cdr l)))
((null (cdr l))
(setq ptr (setf (cdr ptr) (car l)))
result)
;; 個々の lst の複製リスト
(do ((p (car l) (cdr p)))
((null p))
(setq ptr (setf (cdr ptr) (cons (car p) nil)))))))
0296デフォルトの名無しさんNGNG
>>295 append ってこんなにややこしかったっけ?

;;; dolist 版
(defun my-append-1 (lst1 lst2)
(let ((result lst2))
(dolist (item (reverse lst1) result)
(push item result))))

(defun my-append (&rest lsts)
(cond ((null lsts) lsts)
((null (cdr lsts)) (car lsts))
(t (let ((result nil))
(dolist (item lsts result)
(setq result (my-append-1 result item)))))))
0297デフォルトの名無しさんNGNG
reverseでconsセルができるのを嫌がってるのだろう。
0298295NGNG
lisp でも効率を意識したプログラムが書けるんだぞという事で.cons しつつポイン
タを書換えていくあたりがナカナカ.まぁほとんどの人には気に入らないでしょうけど.
皆さん再帰ばっかりなのでちょっとひねくれてみました.

;; でも CLISP だと reverse が組み込みでしょうから do でループするこっちのより
;; >>296 さんのやつのほうがはやいかもしれませんね…
0299デフォルトの名無しさんNGNG
あと無理矢理理屈をつけると nconc に発展させやすいとか?
0300デフォルトの名無しさんNGNG
(defun do-nreverse (x y)
(if (null x) y
(let ((temp (cdr x)))
(setf (cdr x) y)
(do-nreverse temp x))))

(defun do-reverse (x y)
(if (null x) y
(do-reverse (cdr x) (cons (car x) y))))

(defun my-append (&rest lsts)
(if (null lsts) lsts
(do ((lsts lsts (cdr lsts))
(r '() (do-reverse (car lsts) r)))
((null (cdr lsts)) (do-nreverse r (car lsts))))))
0301159NGNG
ビルド通りました。EasyPackage でインスコした iconv が原因でした。
端末上の文字が化ける件は変わらずですが。

一応ご報告。
0302デフォルトの名無しさんNGNG
なんか初心者のレベルを越えだしてるような…
0303295NGNG
>>300
こ,これは簡潔かつ高性能ですね.目から鱗です.いやぁ勉強になるなぁ.
0304デフォルトの名無しさんNGNG
>>302
初心者が書くようなコードじゃないもんな。まぁハカーが寄ってくるのは良いスレの証。
[初心者向けじゃないかも] くらい書いといてもらえば良いのではなかろうかと。いっちょ
解説してやるかと思ったが俺が勉強になっちまったZe。
0305デフォルトの名無しさんNGNG
>>297 これで cons の数は同じくらいになる?

(defun my-nconc-1 (lst1 lst2)
(cond ((null lst1) lst2)
(t (setf (cdr (last lst1)) lst2)
lst1)))

(defun my-append (&rest lsts)
(cond ((null lsts) lsts)
((null (cdr lsts)) (car lsts))
(t (let ((result nil))
(dolist (item lsts result)
(setq result (my-nconc-1 result (copy-list item))))))))
0306デフォルトの名無しさんNGNG
[初心者向けじゃないかも]
>>305
おまえらよくやりますね…手元の cmucl で測ったら cons は 295 == 300 でほ
んのちょっと 305 のほうが cons が多いね。なんだろう?どこだろう?誤差かなぁ?
0307デフォルトの名無しさんNGNG
>>306
305 は lsts の一番最後のリストまでコピーしてるから、その分多いはず。
295 は末尾リストはコピーから除外してる。
0308デフォルトの名無しさんNGNG
【初心者:LISP時間==五時間】
これだ・・・
(defun func(lst)
(dotimes(x (length lst) y)
(setq y(+ y (car lst)))
(setq lst (cdr lst))))
0309デフォルトの名無しさんNGNG
>>308
Error in KERNEL::UNBOUND-SYMBOL-ERROR-HANDLER: the variable Y is unbound.
5時間目のエラーですか。
0310デフォルトの名無しさんNGNG
マヂすか・・・手元のXYZZYでは動いたんだが・・・と思ったが
同じ事言われてた。ナゼ?
0311デフォルトの名無しさんNGNG
こうですか?
(defun func(lst)
(let ((temp 0))
(dotimes(x (length lst)temp)
(setq temp(+ temp (car lst)))
(setq lst (cdr lst)))))
0312(define (´∀`) 'マターリ) NGNG
(defun func (lst)
(let ((y 0))
(dolist (x lst y)
(setq y (+ y x)))))

(defun func (lst)
(apply #'+ lst))
0313デフォルトの名無しさんNGNG
なんだかよくわからないけど私も

(defun func (lst &aux (tmp 0))
(dolist (x lst tmp)
(incf tmp x)))
0314デフォルトの名無しさんNGNG
(defun func (lst &aux (tmp 0))
(if (null lst) tmp (func (cdr lst) (+ tmp (car lst)))))
0315デフォルトの名無しさんNGNG
(defun func (lst)
(loop for e in lst sum e))
0316デフォルトの名無しさんNGNG
>>314
一つ忠告してやろう…… >>314 っ お主 &aux と &optional を間違えておるぞっ
&aux は 312 の上のやつと 313 のときのように let の代りになるだけで引数としては渡せんのじゃ
0317デフォルトの名無しさんNGNG
[問2] を解いてみますた。
(defun q2-1 (lst)
(if (null lst)
0
(+ (car lst) (q2-1 (cdr lst)))))

(defun q2-2 (lst)
(if (null lst)
0
(+ (* (car lst) (car lst)) (q2-2 (cdr lst)))))
0318デフォルトの名無しさんNGNG
(defun q2-2 (lst)
(apply #'+ (mapcar #'* lst lst)))
0319デフォルトの名無しさんNGNG
(defun list-sum (lst)
(reduce #'+ lst))

(defun list-square (lst)
(reduce #'(lambda (a b) (+ a (* b b))) lst
:initial-value 0))
0320デフォルトの名無しさんNGNG
(defun sum (lst)
(apply #'+ lst))

(defun square (n)
(* n n))

(defun sum-square (lst)
(sum (mapcar #'square lst)))
0321デフォルトの名無しさんNGNG
|○| |☆| < 良い初心者の諸君! 問 2 の解答の中で拡張性が当ってイイと思うのはどれだと思う!!
0322デフォルトの名無しさんNGNG
>>308,311 dotimes
>>312,313 dolist
>>312,318,320 apply, mapcar
>>314 末尾再帰
>>315 loop
>>317 再帰
>>319 reduce
0323デフォルトの名無しさんNGNG
じゃあ再帰だな。
0324デフォルトの名無しさんNGNG
reduceは使い所が限られるな。
0325デフォルトの名無しさんNGNG
四次元殺法コンビキターーー
とりあえず再帰と答えた香具師、>>323 貴様だ、貴様。
貴様はとりあえずリストの要素に関数を適用する部分を抽象化して
($sum (lambda (x) (* x x)) '(1 2 3)) == 14
みたいな $sum を作ってこい!もちろん >>320 で apply つかった実装は
既出なのでそれ以外の方法でな。

つまり問 2 を
(defun A-1 (lst) ($sum #'identity lst))
(defun A-2 (lst) ($sum #'(lambda (x) (* x x)) lst))
みたいに書けるようにするわけだ。どうウマーなのか説明できるとなお良し。
0326デフォルトの名無しさんNGNG
| O| |☆| < さりげなく >>324 が正論吐いてるな < 気にするな

0327デフォルトの名無しさんNGNG
>>325
dotimes
dolist
末尾再帰
loop
再帰
reduce
do
fold
どれがお好みだ?
0328デフォルトの名無しさんNGNG
       r ‐、
       |  (|         r‐‐、
      _,;ト - イ、     ∧l☆│∧   >>327 って初心者だと思う?
    (⌒`    ⌒ヽ   /,、,,ト.-イ/,、 l
    |ヽ  ~~⌒γ⌒) r'⌒ `!´ `⌒)    そうは思えんな。CL は初心者とか言うんじゃネーノ?
   │ ヽー―'^ー-' ( ⌒γ⌒~~ /|    
   │  〉    |│  |`ー^ー― r' |
   │ /───| |  |/ |  l  ト、 |
   |  irー-、 ー ,} |    /     i
   | /   `X´ ヽ    /   入  |
0329デフォルトの名無しさんNGNG
323も初心者じゃないと思う。
0330デフォルトの名無しさんNGNG
問2-2 のポイントは、リストを1回だけ舐めるようにして、かつ簡潔に書くこ
とだな。そうすると、reduce か loop が一番簡潔な気がする。リストを2回舐
めてもいいなら >>320 でよいと思う。
0331デフォルトの名無しさんNGNG
新しい問題をください
0332デフォルトの名無しさんNGNG
(defun sum$ (fn lst)
(reduce #'(lambda (x y) (+ x (funcall fn y))) lst
:initial-value 0))
0333デフォルトの名無しさんNGNG
[新しい問題]
ディレクトリ内のファイルのサイズの平均を求める関数を作れ。
0334デフォルトの名無しさんNGNG
ディレクトリとかファイルサイズとかわかる関数あるのか?
つーかそれおまいの宿題じゃないのか?別にいいが。
0335333NGNG
子ディレクトリ以下のファイルを含まないものと全部含むもの両方ね。
0336デフォルトの名無しさんNGNG
>>333 の問題のどこがどうこのスレに不適切なのかを答えよ。[20点]
0337デフォルトの名無しさんNGNG
ファイルサイズ関係だと、クラスタサイズで欲しい場合もあるな。
0338デフォルトの名無しさんNGNG
出題者としてどうかとおもうぞ。処理系依存話をいきなり持ち込む上
に定義も不十分だし。>>333 はとりあえずどっか逝け。ファイルシス
テムみてーに機種毎にバラバラな仕様のブツをこの段階で出すか。普通。
0339デフォルトの名無しさんNGNG
非初心者向けの問題だから。
0340デフォルトの名無しさんNGNG
じゃあ、ディレクトリツリーをただのリストの木で置き換えればよいかと。

【問3】consセルのcarに数値が入ったリスト木の
合計と平均を求める関数を作れ。

(average-tree '((123 (764) 234) 345 456 3 2)) => 275.286
(sum-tree '((123 (764) 234) 345 456 3 2)) => 1927

簡単杉?
0341デフォルトの名無しさんNGNG
つーか問3ってもうあるね。問4にしとく?
あと、簡単な様だったらリストの探索でflattenみたいな
リストの再構成は禁止しとく?
0342デフォルトの名無しさんNGNG
flatten もまだ出てないから気にする事ないと思われ。
0343デフォルトの名無しさんNGNG
(defun sum-average-tree (lst)
 (defun tree (lst &optional (sum 0) (count 0))
  (if (null lst)
    (values sum count)
   (if (listp (first lst))
     (progn
      (multiple-value-setq (sum count) (tree (first lst) sum count))
      (multiple-value-setq (sum count) (tree (rest lst) sum count))
      (values sum count))
    (progn
     (multiple-value-setq (sum count) (tree (rest lst) (+ sum (first lst)) (+ count 1)))
     (values sum count)))))
 (multiple-value-bind (sum count) (tree lst 0 0)
  (values sum (float (/ sum count)))))
0344デフォルトの名無しさんNGNG
>>340
(labels ((walk (x f &optional (y 0))
      (cond ((numberp x) (+ (funcall f x) y))
         ((endp x) y)
         (t (walk (rest x) f (walk (first x) f y))))))
 (defun sum-tree (x)
  (walk x #'identity))
 (defun average-tree (x)
  (float (/ (sum-tree x) (walk x #'(lambda (x) 1))) .0)))
0345デフォルトの名無しさんNGNG
(defun traverse-tree (f g tree)
(if (listp tree)
(apply g (mapcar #'(lambda (item) (traverse-tree f g item)) tree))
(funcall f tree)))

(defun sum-tree (tree)
(traverse-tree #'identity #'+ tree))

(defun count-tree (tree)
(traverse-tree #'(lambda (dummy) 1) #'+ tree))

(defun average-tree (tree)
;; これだと tree を 2 回トラバースしてしまう
(float (/ (sum-tree tree) (count-tree tree))))

(defun average-tree (tree)
;; 副作用があってちょっと汚いけどこれならトラバースは 1 回
(let* ((count 0)
(sum (traverse-tree #'(lambda (item) (incf count) item)
#'+
tree)))
(float (/ sum count))))
0346デフォルトの名無しさんNGNG
(defun sum-average-tree (lst)
 (defun sum-average-tree (lst sum count)
  (if (null lst) (list sum count)
   (apply #'tree (rest lst) (if (listp (first lst)) (tree (first lst) sum count) (list (+ sum (first lst)) (+ count 1))))))
 (apply (lambda (sum count) (values sum (float (/ sum count)))) (tree lst 0 0)))
0347(define (´∀`) 'マターリ) NGNG
(defun average-tree (lst)
(float (apply #'/ (traverse-tree (lambda (item) (list item 1))
(lambda (&rest x) (apply #'mapcar #'+ x))
lst))))
0348デフォルトの名無しさんNGNG
(defun tree-fold (tree fn knil)
(cond ((null tree) knil)
((atom tree) (funcall fn tree knil))
(t (tree-fold (car tree) fn
(tree-fold (cdr tree) fn knil)))))

(defun tree-sum (tree)
(let* ((sum+cnt
(tree-fold tree
#'(lambda (tr knil) (cons (+ (car knil) tr) (1+ (cdr knil))))
'(0 . 0))))
(float (/ (car sum+cnt) (cdr sum+cnt)))))
0349デフォルトの名無しさんNGNG
http://sdc.sun.co.jp/news/200201/danwa01.html
0350デフォルトの名無しさんNGNG
時也葉を辞書に登録した。
0351デフォルトの名無しさんNGNG
http://jp.franz.com/base/success_cadabra.html
http://www.tomabechi.com/
0352デフォルトの名無しさんNGNG
苫米地さん、言ってることは正しいと思うんだけど、
50年使える技術でスレッド云々はちょっと夢のない
話ではないですかね^^;
0353デフォルトの名無しさんNGNG
>>352
おー、すると今後 50 年にはどんな技術が夢があるんでしょう?
Lisp はじめたばかりなんですが、スレッドすげーというレベルなんで
上級者の将来の技術も是非聞いてみたいっす。
0354デフォルトの名無しさんNGNG
>352
何の話だ?
0355デフォルトの名無しさんNGNG
>354
http://sdc.sun.co.jp/news/200201/danwa01.html
>僕の中ではSolarisも含めてUnixの時代は終わっているんですよ。
>単純に言うと立ち上げられるスレッドの数が少なすぎ。
>僕の希望としては10万スレッドくらいが立ち上がるようなOSの出現を望みますね。
0356デフォルトの名無しさんNGNG
で、10万スレッドくらい立ち上げて何すんの?
0357デフォルトの名無しさんNGNG
5万スレッドvs5万スレッドでバスケットボールだよ。
0358デフォルトの名無しさんNGNG
Solarisじゃ10万スレッドあがらんの?
0359デフォルトの名無しさんNGNG
10万ものカーネルスレッドを実現するのは難しいだろうな。
スケジューリング自体が重くなるし他のプロセスもCPUを奪われて悪影響が出るだろう。
実質Web server1プロセスだけ走ればいいとかいうならできるだろうが。
0360デフォルトの名無しさんNGNG
Javaで全てのインスタンスにスレッド割り当てて、
有機的プログラミングとかw
0361デフォルトの名無しさんNGNG
(defun flatten-tree (tree)
(traverse-tree #'list #'nconc tree))

(defun average-tree (tree)
;; トラバースは 3 回
(let ((lst (flatten-tree tree)))
(float (/ (apply #'+ lst) (length lst)))))
0362デフォルトの名無しさんNGNG
>>349
JAVAよりLISPを選択した理由には説得力があるな。
俺はJAVAのPGだが、ここでLISPを知って思ったのだが、
JAVAってめんどくさいんだわ。C++よりはマシって同僚
はいうのだが、私的には似たようなもんではないかと。
(っーよりは、LISPが優れすぎている所為かもしれんな・・・)
マクロもいいし、型がないのがいいし、対話的にプログラミングが
できる(これだな、これが最高に優れている)のもいい。
速度も遅いといわれているが、ピュアJAVAに比べればどっこいどっこい
のような気がするし・・・何故LISPは流行らんのだ??
とぶつぶつ呟いていたらLISPの案件が来た。


・・・マヂかよ・・・。
0363デフォルトの名無しさんNGNG
>>362
なんだか型にはまりすぎていて釣りの予感もするがけど、あえて突撃しよう。

1. 遅くない。どこでガセネタつかまされたか知らんが、まともなコンパイラはネイティブ
コンパイルするので Java とどっこいどっこいって事ぁないはず。コンパイラが良くてか
つ計算用途なら C と競っちゃうくらい。
2. あと型も一応ある。性能や型チェックが必要な時だけ指定するオプショナルな型システムが。

流行らない理由はいろいろ考えられるが、まぁ括弧だろうな。でも名無しさんたちが
2ch で初心者スレなんぞをたてて地道に普及をはかっているのだ。日本 Lisp ユーザー
会みたいなのはなんだか敷居が高い上にあんま活動してなさそうだし、2ch が日本最
大の Lisp コミュニティかもしれないなぁ。
0364デフォルトの名無しさんNGNG
ひろゆきにLISP板を提案しておこう。
LISP/CS板でもいいかな。
0365デフォルトの名無しさんNGNG
>>355
のリンクの人、話しはいい、どんどん言ってくれ、おもしろい。
おもしろいのだが。
あの髪型。あの髪型なのにスーツ。男のポニーテール。これが生理的にイヤーン。
0366デフォルトの名無しさんNGNG
>>360
BeOS
0367デフォルトの名無しさんNGNG
とまべっちみたいなAV男優いるよね。最初とまべっち、
男優もやってるのかと思ってびびった。
0368デフォルトの名無しさんNGNG
すべての言語はLISPを目指す、だったっけかな?

この際、LISPはライブラリとか仕様とかいった問題ではJAVAを目指すべきだ。
DB接続の定型化、ネットワーク処理の定型化・・・
これらを実現するためのネイティブなライブラリ、
その上にのっかるフレームワーク(ここをCLOSで書く)

実現したらいいなぁ。
言うだけでは意味ないんですこしずつ書いてくよ。
0369(define (´∀`) 'マターリ)NGNG
(defun average-tree (tree)
 (let ((f (lambda (x y) (if (listp x) (cons (cons x (car y)) (cdr y))
             (cons (car y) (mapcar #'+ (list x 1) (cdr y)))))))
  (do ((x (fold f tree '(() 0 0)) (fold f (apply #'append (car x)) (cons '() (cdr x)))))
    ((null (car x)) (float (apply #'/ (cdr x)))))))

(defun do-average-tree (tree lst sum count)
 (cond ((and (null tree) (null lst)) (float (/ sum count)))
    ((null tree) (do-average-tree (apply #'append lst) '() sum count))
    ((listp (car tree)) (do-average-tree (cdr tree) (cons (car tree) lst) sum count))
    (t (do-average-tree (cdr tree) lst (+ sum (car tree)) (+ count 1)))))

(defun average-tree (tree)
 (do-average-tree tree '() 0 0))
0370デフォルトの名無しさんNGNG
そろそろ、スレに出てきた解説とかコードをまとめたほうがいいかな?
どないでしょ?
0371デフォルトの名無しさんNGNG
>>370
よろしく
0372デフォルトの名無しさんNGNG
で、形式はナニがいい?漏れは HTML か TeX くらいしか使えないので
選択肢は HTML か TeX か PDF くらいしかできんが。その辺でよければ
暇を見つけてちょこちょこやるぞ。Texinfo とかは知らん。コードは
コテハン名かレス番乗せてアリガトンくらいでいいのかな?
0373デフォルトの名無しさんNGNG
>>368
LISPからJAVAのライブラリを使うのじゃ駄目なのか?
0374デフォルトの名無しさんNGNG
>>373 全角ではだめ。
>>372 HTML でよろしくおねがいします。
0375デフォルトの名無しさんNGNG
lispdocみたいなのないの?
0376デフォルトの名無しさんNGNG
>>372
Wikiにしてちょ。
0377デフォルトの名無しさんNGNG
common lisp ってプロセスが動いているままパッチ当てたりできるんですか?
バグがあるシステムが自分自身を更新って論理学的にどうなんでしょうか。
それ言ったら極論バイナリしか扱えなくなる気もしますが。
OSからlispで書いたらマシン止めなくてもよくなるのかなあ。
0378デフォルトの名無しさんNGNG
ライブラリの交換は止めなくてもできるでしょ。
0379デフォルトの名無しさんNGNG
>>377
分かりやすく言い換えると、ドメインに該当する
古いS式のコードを、新しいS式で上書きする
ってことじゃないの?
稼動中でもシンボルの参照先変わるだけだから、
普段インタプリタ上で行う作業と同じ。
古いコードは単にGCされる。
0380デフォルトの名無しさんNGNG
>>377
パッチというか関数単位でコンパイルするので正しい定義をロードしてコンパイルす
るだけです.論理学云々は通常はあまり関係無いような気がします.そのへんはコン
パイラをいじるとか自分の足場をいじるという特殊なケースでは注意が必要というく
らいに思っとけばいいんじゃないでしょうか.
0381デフォルトの名無しさんNGNG
>>379
それは evalある言語ならできますよねえ。tomcatもできたような。
でも common lisp自身にバグがあったら困りますよね。そういう話ではない?
0382デフォルトの名無しさんNGNG
SMPシステムならもう少し複雑だろう。
http://www.idg.co.jp/lw/news/back/index20020724_01_solaris.html
0383デフォルトの名無しさんNGNG
>>381
処理系のバグがあったら困るのはどんな言語でもそうじゃないの?それを気にしたら
言語とか関係ないような.

ただの eval ってのは評価だけでしょ.Lisp ではコンパイルできるから.Perl とか
Python とかスクリプト系言語で eval するってのと Lisp でインクリメンタルにコ
ンパイルするってのは随分違うと思うのだが.
0384デフォルトの名無しさんNGNG
Cでも動的リンク使えばプロセス止めずに更新できるんですかね。型は変えられないでしょうけど。
>>383
評価とかコンパイルとかよくわからないんですけど349に書いてある、
JAVAだと止めないといけなくて ANSI CommonLispだと止めなくてもいい状況
っていうのがよく分からないんです。
0385デフォルトの名無しさんNGNG
このスレ、全然本スレと差別化されてなくないか?
0386デフォルトの名無しさんNGNG
スキーマがいないだけマシかと。
0387デフォルトの名無しさんNGNG
ココロのスキーマをお埋めします
0388384NGNG
>Cでも動的リンク使えばプロセス止めずに更新できるんですかね。型は変えられないでしょうけど。
できませんですた。すみません。
0389デフォルトの名無しさんNGNG
>>386
スキーマが嫌いなの?
排他主義?
0390デフォルトの名無しさんNGNG
まあ、少し前からCL使いに変なのが混ざってる感じだな
0391デフォルトの名無しさんNGNG
このスレ Scheme 使いも多いだろ。解答者側とか。おなじ Lisp 系だしマターリ仲良くいこうぜ。

>>383
Java って動かしてるシステム上で一部分コンパイルし直しとかできるの?できるな
ら Java でも止めなくてもいいなんじゃないかな。漏れが昔さわった時は実行時にコ
ンパイルなんて機能はなくて javac でコンパイル→実行→修正してコンパイル→実行
という流れだったんだけど。
0392デフォルトの名無しさんNGNG
>>385
差別化って言われてもなー。
SchemeとCommonLISPについて言えば、コーティングスタイルが
かなり違ってくるから、スレを分ける意味はあったと思うけど、
実際立ったのは「初心者」スレだからねえ。
どのレベルで住み分けすりゃ落ち着くかね。
とりあえず誘導してかないと分けた意味ないよね。
今までの流れ的には
LISP初心者が練習コードを書き散らす&質問スレ
で良い気がするけど。

0393デフォルトの名無しさんNGNG
>>391
JavaもC#もコンパイラ前提なんで、実行時差し替えは無理。
インタラクティブな環境作るとしたら
開発環境まるごと持ちまわる必要があるんじゃないかと。
0394デフォルトの名無しさんNGNG
>>393
Javaも.NETもクラスライブラリにコンパイラ含まれてなかったっけ?
で、クラスファイルの動的ロードも可能と。
これをファイルに一度も落とさずに済ませることはできるのかな。
0395デフォルトの名無しさんNGNG
つーか、本スレから分ける必要があったのかどうかが疑問。
最近のレスを見てると、レスが二分されてるだけのような。
0396デフォルトの名無しさんNGNG
>>392 そういう初心者のためのスレだと助かります。
0397デフォルトの名無しさんNGNG
Tomcat なら〜という話が出ていますが、クラスファイルを更新すると
勝手にアプリケーションをリロードしてくれる == Tomcat は止めなくていい
くらいの認識だったりしません?たとえば起動処理に非常に時間のかかる
アプリケーションを想像してください。で、データ構造はいじらないけど
ちょっと見た目を変更したいと。表示部分だけちょこっと更新できたらウマー
じゃありませんか?

# 最近 java は触ってないので外しているかもしれませんが。
0398デフォルトの名無しさんNGNG
表示部分だけちょこっと更新ならjspファイル書きかえればウマーかもしれない。
あんま java 知らないので外してるかもしれないけど。
0399バッタ以下でごめんなさいNGNG
くだらない質問ですが、プログラミング経験1年未満のひとで、
lispをシェル代わりに使用されてる方はいますでしょうか?
いらっしゃられたらどの辺が便利か教えて下さい。

elispもシェルスクリプトもここに書き込まれてる問題なども
読んでも見るだけで終わってしまうので、formatとかreadとか
使ったお子様大喜びな、でもってファイル管理とかの実用性が
ちょっぴりあったり、ウケ狙いな面白さのある【問n】や解答が
見たいです。その余地があればですけど。

我がままいいスマソです…。
スレに付いて行けるようにかんばりまふ。
0400デフォルトの名無しさんNGNG
そもそも Lisp をシェル代わりに使っている人なんてほとんどいないのに...
おれは Lisper だが、シェルスクリプトの類いは sh か Perl で書いてる。
0401バッタ以下でごめんなさいNGNG
そうですか。質問は流して下さい。
馬鹿なことを聞きました。
0402デフォルトの名無しさんNGNG
Lispって誰?
0403デフォルトの名無しさんNGNG
CLOSって、メソッドがクラスに含まれないらしいじゃん。
メソッドのないクラスなんて、ただの構造体じゃね?
なんでそんなのがオブジェクト指向とかいえる訳?
0404デフォルトの名無しさんNGNG
>>401 Common Lispの人に尋くからだよ。

きっと誰かがこう答えてくれたよ。「Scheme をshell scriptがわりに使って
いる人は結構いる。scsh (Scheme Shell) はそれが目的の実装。他には guile、
Gauche、stklos がそういう目的で使える。日本語でMLに質問できて、日本語
のinfoがあるのはGauche。」
0405デフォルトの名無しさんNGNG
>Scheme をshell scriptがわりに使っている人は結構いる。
その"結構"のレベルがperlなどとは比較にならない程度な訳で。
0406デフォルトの名無しさんNGNG
Perlのシェルってないの?
まああってもperl -e ''とやる手間を省略できるぐらいしか
意味がないけど。
0407デフォルトの名無しさんNGNG
403 は、インスタンスベースの言語なら、クラスがないからオブジェクト指向じゃない
とか言い出しかねないね。

とりあえず、もうちょっとまともなオブジェクト指向入門書を探して読んでから出直してこい。
0408403NGNG
>>407
プロトタイプベースだって、特定のオブジェクトにメソッドが属するだろうが。
どうせ自分だって>>403を説明できないくせにコイてんじゃねーっつの。
0409デフォルトの名無しさんNGNG
あんまり喧嘩腰なのもどうかと……。メソッドが「クラスに含まれて」いないだけで
ちゃんとクラスに対応したメソッドがあるのでただの構造体とは違います。というあ
たりで納得していただけます?

それとも

(declass foo () ()) ;; クラス foo
(defmethod bar ((self foo)) ...) ;; クラス foo のメソッド

はオブジュクト指向じゃなくて

(defclass* foo () () ;; この例は実際には動作しません!! マクロで作ることは可能ですが…
(:method bar (self)
...))

のようにクラスの中にメソッドが入ってればオブジェクト指向という表記上の
話ですか?
0410デフォルトの名無しさんNGNG
>>403
>CLOSって、メソッドがクラスに含まれないらしいじゃん。
あるメソッドがある単一のクラスに「含まれる」とはいわないかもね。
いや、言ってもいいんだよ。例えばあるクラスのオブジェクトを1つだけ
引数としてとるメソッドなんかは、そのクラスに含まれると考えても問題
ないかもね。
あるメソッド呼び出しにおいて、
(foo-method object-of-bar-class object-of-baz-class)
なんてのは、fooメソッドがbarクラスに属すのかbazクラスに属すのかCLOSでは決めてないってだけ。

>メソッドのないクラスなんて、ただの構造体じゃね?
メソッドはあるよ。
乱暴にいってみれば、構造体みたいなの + その構造体みたいなのを引数として取るメソッド群かな。
ちなみにCLの構造体は単一継承をサポートしています。
「含む」「含まない」という区別が、単にソースコード上での話なのか、
それとももっと深い考えがあるのかな?

>なんでそんなのがオブジェクト指向とかいえる訳?
オブジェクト指向という概念が現在は拡散してしまっているという点がある。
・データ隠蔽の機能はCLOSでは提供されていないから、メンバフィールドはおっぴろげで触りたいほうだい。
・メソッドはある。
・多重継承はある。
あとは、...何が欲しい?
0411410NGNG
>>409 ガソーン。カブッタカ!
0412409NGNG
いや多角的な説明になって良いんじゃないか?
……昔漏れが言われた台詞だが。
0413デフォルトの名無しさんNGNG
抽象型(内部を覗けないユーザー定義の型)
+ 型チェックがあればOOはできるというだけかと。。。
0414デフォルトの名無しさんNGNG
>>413たしかに俺のOOに対する理解もそこらへんを基盤としているな。
けど、最近はパターンがどうのと、だんだん遠いところへ逝ってしまった気がする。>>OO
0415403NGNG
>>409 >>410
Wでサンクス子。
そうか、データ隠蔽が潜在意識にあったから、メソッドが外、というのが変に見えたのか。
たしかにこれは必須じゃないね。でも、
> クラスに対応したメソッドがある
といってもこれじゃ、「クラス」というより「ユーザ定義型」と変わりなく、
「メソッド」じゃなくて「関数」のような。。。
0416403NGNG
そうか。型チェックといってしまうと語弊があるけど、
継承によるオブジェクトの多態ができるのがミソか。
しかし、オブジェクトの組み合わせで1態(?)ってのは大変そうだなぁ。。
なんか拡散するオブジェクト指向の境界レベルみたいね。
0417デフォルトの名無しさんNGNG
>>409
ほっとけ。ほっとけ。

基本を欠いている自分を棚にあげてのっけから挑発的な書き方をする時点でまともな
コミュニケーションやインフォームドコンセントを求めるには期待薄だし、そもそも
ものを教わろうとする態度じゃない。
0418デフォルトの名無しさんNGNG
どうやらその辺が誤解の元のようですね。クラスに対応したメソッドを起動するのは
システムがやってくれるんですよ?そのクラスに対応したメソッドが定義されていな
ければ継承をたどって親クラスのほうへ探してくれるわけで。普通の関数だと
(defclass foo () ())
(defmethod bar ((self foo)) ...)
(defclass baz () ())
(defmethod bar ((self baz)) ...)
というのができないでしょう。

見た目の問題ならひょっとして
(call object method arg0 ...)
みたいな形式でメソッドを起動するラッパーマクロでも準備したら納得していただけますか?

;; 良く考えたら CLOS 以外でも C++ でもインライン定義以外は
;; class { int bar(); }; /* クラス定義 */
;; int foo::bar(int x, int y) { .... } /* メソッド定義 */
;; みたいに表記上はメソッド定義とクラス定義は生き別れですわな……。
0419デフォルトの名無しさんNGNG
>>415
メソッドは仮想関数の別名。
0420デフォルトの名無しさんNGNG
>>415
> > クラスに対応したメソッドがある
> といってもこれじゃ、「クラス」というより「ユーザ定義型」と変わりなく、
> 「メソッド」じゃなくて「関数」のような。。。
色々なクラスのオブジェクトを引数として取る同一名のメソッドがたくさんあつまって、
Generic Function (GF)と呼ばれる、その名前の関数1つを構成するんだよね。

つまり、あるメソッドを呼び出すときは、本当はGFにオブジェクトを
引数として与えて呼び出すんだよね。GFは内部で、オブジェクトのクラス
を調べて、それに対応したメソッドを捜し出して、そのメソッドを呼び出すと。

いかにも遅そうでしょ? かぶってもしーらないっ!
0421デフォルトの名無しさんNGNG
あれだ、オブジェクト指向と自分の意識がどうのという 403 には Ruby を勧める。
あれは「純粋オブジェクト指向」でいいぞ。無理に馴染まないもんに手をつける事
はないよ。
0422デフォルトの名無しさんNGNG
いや、その前にCLOSのStandard Method Combinationを勉強してみてくれ、感動するから。
0423403NGNG
>>418-420
どもです。>>416って感じでよいみたいですね。

> いかにも遅そうでしょ?
動的検索呼び出しは商用界でシェアの高いJavaでもやってるんで大丈夫なのかな?
ただ、それをやるのが専用の解釈器かその上で動くプログラムかという問題はありますが。。。
0424デフォルトの名無しさんNGNG
大丈夫メソッドコンビネーションなら、次期 Ruby に装備される予定だ。

# いきなり喧嘩腰で煽りはじめる香具師が居るとスレの雰囲気が悪くなるので
# 嫌なんだが。特に OO 話は不毛な議論になる確率が高いし。
0425デフォルトの名無しさんNGNG
>>424
>大丈夫メソッドコンビネーションなら、次期 Ruby に装備される予定だ。
ほぅ。情報ありがとう。
0426デフォルトの名無しさんNGNG
初心者向けじゃないような…
0427デフォルトの名無しさんNGNG
>>426
もういいだろ。
本スレと議論を分散してるだけなんだよ、このスレは。
0428デフォルトの名無しさんNGNG
何をもって初心者というのかその区別が難しいよね。
Common Lispの初心者といっても、プログラミング歴がゼロなのか、他の言語を
知っているのか、Cだけ知っているより、Rubyも知っているほうがクロージャとか
バインディングとかLisp的な概念をすでに把握しているだろうし。

今回の話題も明らかにCLOS初心者向きだよね?

初心者が質問しやすい雰囲気を作るというのも大切だろうけど、実際に質問が
来たときに、どれだけ有益なレスをつけられるかというのが勝負所だと
個人的には思う。本家スレとの区別はあんまり気にしなくてもいいんじゃない?
0429デフォルトの名無しさんNGNG
>>403はC++/Javaのオブジェクト指向しか知らないから、誤解するんでしょ。
C++/Javaのオブジェクト指向、
メンバ関数がないオブジェクト指向(CLOSとか)、
クラスとインスタンスの区別がないオブジェクト指向(インスタンスベースと言うらしい)とか
いろいろあるけど、これらは全てオブジェクト指向の方法論。

オブジェクト指向そのものの要件はwikipediaによると

* カプセル化
* 継承
* ポリモルフィズム
http://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91

あと、"構造体とクラスが変わらない"という発言はただ単に勉強不足なだけかな。
0430デフォルトの名無しさんNGNG
>>429
Common Lispの構造体って
× * カプセル化
○ * 継承
○ * ポリモルフィズム
だよね?
0431デフォルトの名無しさんNGNG
>>430
継承、ポリモルフィズムもないぞ。
クラスには全部あるけど。
0432403NGNG
カプセル化を潜在的にprivateに結びつけてたのと、オブジェクトに関心事の局所化というイメージがあったので混乱したようです。
MethodCombinarionおもしろそうですね。Rubyには興味があるのでそのうちやってみたいです。
初心者スレということで、漏れの後の初心者のために貼っときます。
http://dolphin.c.u-tokyo.ac.jp/〜nisimu6/comp/clos/2.3.html
http://www.radonc.washington.edu/medinfo/meded531/ f2002/method-combination.pdf
0433デフォルトの名無しさんNGNG
>>429
そもそもこの三つの項目もオブジェクト指向一般論としてふさわしいかについても
疑問を呈する余地はあるんじゃない? だいたい、これを言い出したのは C++ の
ストラウストラップだから、429 は自身の矛盾に気づいてない。
0434デフォルトの名無しさんNGNG
>>427
まぁ勘弁してくれよ。なるべく質問に答えるとか親切丁寧を目指してがんがってるんだって。

>>428
そうだよな〜初心者だけじゃなぁ。Scheme やった後 CL に来ても本人がそう思えば
CL 初心者だしな。
0435デフォルトの名無しさんNGNG
>>433
>そもそもこの三つの項目もオブジェクト指向一般論としてふさわしいかについても

schemer's way から辿れるやつね。

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

俺的 OO の要件はメッセージパッシングが出来るかどうかのみだなぁ。CLOS よりも
SICP に出てくる様なのが好き。
0436デフォルトの名無しさんNGNG
>>431
> 継承、ポリモルフィズムもないぞ。
継承は、defstructの:includeオプションで指定できるのでは?
ポリモーフィズムもジェネリック関数でできませんか?

> クラスには全部あるけど。
カプセル化って言語仕様で直接サポートされていますか?
0437デフォルトの名無しさんNGNG
>>433

>疑問を呈する余地はあるんじゃない?
もちろん余地はあるし、ないなんて言った覚えはない。疑問があるなら余地云々を言うんじゃなくてここに書けば?

>だいたい、これを言い出したのは C++ のストラウストラップだから、429 は自身の矛盾に気づいてない。
誰がこの文面を書いたかはこの議論にまったく関係ない。文面の内容だけが関係ある。
よって矛盾はない。

0438デフォルトの名無しさんNGNG
>>436
一応
http://e-words.jp/w/E382ABE38397E382BBE383ABE58C96.html
の定義に従って話すなら、サポートされてるんじゃないの?
0439デフォルトの名無しさんNGNG
ところでtypecaseってポリモルフィズムなのか?
何がカプセル化,継承,ポリモルフィズムなのかも人によって理解が違うし、考え出すと分からなくなってくるな。
0440デフォルトの名無しさんNGNG
>>439
>人によって理解が違うし、考え出すと分からなくなってくるな。

人によって違うが正解なんじゃないかな(だから言葉の定義に関する議論は不毛な
議論になりがち)。
多態ってオブジェクト指向だけじゃなく抽象データ型でも使われているし。
0441デフォルトの名無しさんNGNG
>>438
CLOSオブジェクトでカプセル化がサポートされているとした場合、
Structでもサポートされていると言えるような気がします。

俺の理解ではクラスのメンバフィールドに誰もが読み書きできる状態は、
カプセル化がサポートされているとは言えないと思っていました。

ジェネリックファンクションの名前を工夫して、実際には存在しない
メンバがあたかも存在するように演出することはできますよね。
(defmethod person-age ((person person))
(- (this-year) (person-year-of-birth person)))
みたいに。
OOを勉強しなおそうかな…
0442デフォルトの名無しさんNGNG
>>436
>継承は、defstructの:includeオプションで指定できるのでは?
:includeで継承に近いことはできると思うけど、親構造体のタイプと子構造体のタイプを
(defstruct a (z nil) (x nil))
(defstruct (b (:include a)) (c nil))
とした時にbは、aを引き数にとる総称関数に呼ばれないような。

あ、でも、これが「継承」の必須条件かどうかってのも議論になるかな。
0443デフォルトの名無しさんNGNG
いっそのことこのスレ本スレにするかw
0444デフォルトの名無しさんNGNG
>>435
抽象データ型の発展としてのオブジェクト指向(Cook あるいは、クラス指向)か、
メッセージパッシングメタファのオブジェクト指向(Kay、Ingalls、Goldberg のメッセージ指向)かは
同じ「オブジェクト指向」でも(排他ではなく)分けて考える習慣をつけておくほうがよいよ。

ttp://www.cs.utexas.edu/users/wcook/papers/OOPvsADT/CookOOPvsADT90.pdf
ttp://www.metaobject.com/papers/Smallhistory.pdf の p20 あたり
0445デフォルトの名無しさんNGNG
(defclass abcd ()
;public
(a b
;private
c d))

でもいいようなw
これだとCの構造体とかもカプセル化になっちまうな
0446デフォルトの名無しさんNGNG
>>442
> とした時にbは、aを引き数にとる総称関数に呼ばれないような。

呼ばれている気がするけど外してる?
(progn
  (defstruct parent
    (foo))
  (defstruct (child (:include parent))
    (bar))
  (defmethod my-method ((object parent)) (parent-foo object))
  (setq child (make-child :foo 'foo :bar 'bar))
  (my-method child))
=> FOO
0447デフォルトの名無しさんNGNG
>>444
あくまでも俺的 OO の定義ですよん。外部表現では使い分けてます。
0448デフォルトの名無しさんNGNG
>>446
DQNですた、スマソ....
0449デフォルトの名無しさんNGNG
>>435
どんなやつ? SICP にそんな魅力的な OO システム出てきたっけ?
漏れも Scheme 勉強したてのころはいちいち感動してたけど、正直
CLOS はイイと思う。
0450デフォルトの名無しさんNGNG
まあ、関数が内部にあるとか外部にあるとか、対して重要なことじゃあないな。
0451デフォルトの名無しさんNGNG
>>449
>SICP にそんな魅力的な OO システム出てきたっけ?

魅力的って書かれると言い辛いですが、3 章に出てきたみたいなプリミティブなのを
実装出来る自由があれば私には十分です。
0452デフォルトの名無しさんNGNG
>>451
それで満足する香具師ってどっちかというと Schemer の中でも少数派じゃないか?
大抵の Scheme 処理系はオブジェクト指向向けに拡張しちゃってるし……。まぁいろ
いろあるのは良いところだ。たしかにシンプルで良いとは思う。昔 CL でもインスタ
ンスベースに走った連中が居たしなぁ。
0453デフォルトの名無しさんNGNG
今、以下のように、倍精度浮動小数点数を 16 進文字列にしたり、
16 進文字列を倍精度浮動小数点数にしたりするような2通りの関数を作りたいと思ってるのですが、
Lisp でどのように作っていいのかがわかりません。
ヒントだけでも教えていただけないでしょうか?

(convert-hex-double #x40091eb851eb851f)
=> 3.14d0         (little endian で)

(convert-double-hex 3.14d0)
=> #x40091eb851eb851f  (little endian で)

------------
同じことを C では出来ているのですが、どうしても Lisp で実装したいのです。
ちなみに、C で little endian での convert-hex-double は以下のように実装できます。
1.8バイト分の unsigned char 配列を用意。
2.16 文字ある 16 進表記文字列を後ろから 2 文字づつとっていって、
  その2文字を 16 進数と見立てて unsigned int に変換。
  そのまま1.での unsigned char 配列に、前から詰めていく。
3.その配列を (double) にてキャスト
0454デフォルトの名無しさんNGNG
あ、すみません。↑の 「unsigned int に変換」は間違いで、
「unsigned char」に変換でした。
0455デフォルトの名無しさんNGNG
Cの関数を組み込めばいいんでないの?
0456デフォルトの名無しさんNGNG
CMUCL でよければよろずやさんとこの pack/unpack が参考になるんでない?
漏れは試してないんで動くかどうか知らんけど。
ttp://www.geocities.co.jp/SiliconValley-SanJose/7474/cmuclMemo.html#0024
0457453NGNG
有り難うございます。

>>455 確かにそうですね。別に全部 Lisp で実装する必要もないですし。
自作の C の関数についてリンクの仕方を勉強しないと。。

>>456 ちょっと難しそうです。。
いろいろ調べてはいるのですが、
倍精度実数の変数の中身について、
直接にビットパターンをイジれる方法が見つからないっす。。
8 バイトの配列を 8 バイトの double に変換するとか、
そういった C に洗脳された頭を変更する必要があるのでしょうけど。。
0458デフォルトの名無しさんNGNG
おれは詳しく知らんが、convert-double-hex のほうは format あたりで何と
かならんの?
0459デフォルトの名無しさんNGNG
>>453
とりあえず片方だけ。

(defun convert-hex-double (integer)
(let ((sign (logand (ash integer -63) 1))
(exponent (- (logand (ash integer -52) #xffff) 1023))
(mantissa (logior #x10000000000000 (logand integer #xfffffffffffff))))
(* (if (zerop sign) mantissa (- mantissa)) (float (expt 2 (- exponent 52)) 0d0))))
0460デフォルトの名無しさんNGNG
>>459
忘れてた。仮数部が0のときは特別扱いしてくれ。
それから、逆方向はinteger-decode-floatで整数にバラしてから
くっ付ければできるはず。
0461デフォルトの名無しさんNGNG
>>453
自分で言ってること判ってる?
doubleの中身の作りは環境によって違うから、Cの様に
無理矢理キャストする方法は他の環境では使えないし、
何に使うのか見えないのでここでは答え様がないよ。

↓みたいな環境依存なのしかないんじゃないかな。
ttp://www.geocities.co.jp/SiliconValley-SanJose/7474/download/pack.lisp.txt
0462デフォルトの名無しさんNGNG
ちょっと元質問の解答としてはズレてますが FFI (CLISP/CMUCL/UFFI)を使った例です。
いかがでしょう?

http://cgi.at.infoseek.co.jp/lambda_list/cgi-bin/lambda.cgi?name=Examples
0463デフォルトの名無しさんNGNG
>>462
それじゃ 453 の望みとは違うと思われ。たしかにそれでも
(format nil "#x~X" (double->bits 3.14d0)) => #x40091eb851eb851f
とかできるけど、そもそも C ではそれは出来てるわけだし。
0464453NGNG
有り難うございます。
>>458 いろいろやってみたのですが、format を騙すような感じで
なんとかするっていうのは、無理っぽいです。

>>459 正攻法ですね。有り難うございます。上手くいきました。
>>460 今、integer-decode-float を使って逆変換してるのですが、簡単でないです。
どうも仮数部,、指数部、符号をそれぞれ 53, 10, 1 ビットづつにしているようなのですが。。
(integer-decode-float 3.14d0) は、
2567051787601183, 1, 1 となって欲しいところなのですが、
7070651414971679, -51, 1 となってしまいます。。なんか勘違いしてるのかな。。

>>461 そうですね C での話は完全に忘れる事にしました。
正攻法で攻めるのが正しいみたいです。
そのサイトは逆変換が出来てから落ち着いて勉強してみます。

>>462 できました。C ライブラリのリンクの仕方がおおまかに分かりました。
とっても助かりました。。
0465453NGNG
>>463 変換自身を主目的にしてるのではなくて、
lisp のプログラムの中で変換作業をできれば、一応は仕事上それでいいんです。
でも、ついでにいろいろ勉強できるともっと嬉しいです。
0466453NGNG
今、仕事でカスタムプロセッサー設計に対する検証をしてるのですが、
あるプログラムについてプロセッサーシミュレーターにかけて計算させた後、
メモリ上に残った生のデータを吸い上げてそのプログラムの期待値と実際の計算値とが
一致しているか?の比較をしています。
その時にメモリ上のデータは設計者の都合により 16 進表記のみの取得が可能で、
上のプログラムの出番になります。
決まった番地のデーターをただ吸い上げてデータを見るのは C のプログラムでいいのですが、
何回も何回もインタラクティブに行う必要があり、時間も少し余ってるし、
勉強中の lisp でやっちゃえ〜。って思ったわけです。。

0467デフォルトの名無しさんNGNG
マターリいいスレだ。-51 とかは scale-float で significand を戻すときに 53
ビット補正しなきゃいけないからだよ。HyperSpec の scale-float んとこ
に載ってる例を参照の事。
0468デフォルトの名無しさんNGNG
S 式を読み易くする為、[] を使う事ってありますか?
リストや lambda, if, cond, begin 辺りでネストが多くなるとコードが追い辛くなる
ので、[] で括るのはありかなと思うのですが。
0469デフォルトの名無しさんNGNG
普通インデントのパターンで構造を把握するんじゃない?
0470デフォルトの名無しさんNGNG
emacsとかエディタの補助が無い時は使うよ
0471デフォルトの名無しさんNGNG
まさか等幅でないフォントで lisp コードを見てる人なんていないよね?

>> 470
S 式単位で移動できないエディタでは書くのがつらいです.
それでも書かなければならないこともあるんですね.
0472デフォルトの名無しさんNGNG
flet とかで分割すればいいんじゃないとか思いつつ。
↓とかだとちょっとなぁ…
(defun foo (let ((a 1) (b 1) (c 1)) (+ a b c)))
(defun foo (let [(a 1) (b 1) (c 1)] (+ a b c)))
(defun foo [let ((a 1) (b 1) (c 1)) (+ a b c)])
[defun foo (let ((a 1) (b 1) (c 1)) (+ a b c))]
コードが追い辛くなる例と [] で括ってウマーな例を
示してくれれば改宗するかもしれないけど。

;; それとも ] は [ に対応するまで閉じちゃうという
;; スーパー括弧の話?あれは不評だったような
0473デフォルトの名無しさんNGNG
(let ((a 1) (b 1) (c 1)) (+ a b c))
において、((a 1) (b 1) (c 1))の部分の背景色が微妙に薄かったら見やすいかも。
あ〜、Emacsで実験してみたくなった。
0474デフォルトの名無しさんNGNG
正直インデントだけでいい。
0475デフォルトの名無しさんNGNG
色もいらないの?
0476デフォルトの名無しさんNGNG
定期的にこの話題が出てくるな
これは、宿命だな?
0477デフォルトの名無しさんNGNG
>>473
よさそう。
0478デフォルトの名無しさんNGNG
>>475
いらない。
0479デフォルトの名無しさんNGNG
初心者には無駄に括弧だらけに見えるものです。括弧の意味を考えるのも良い勉強だ。
括弧が嫌いな内に拡張 loop を覚えちゃうのも一つの手だな。昔なら拡張 loop は
無理に覚えなくてもいいと言い切れたが Edi Weitz 氏とかがバリバリ使ってるからなぁ……。
0480デフォルトの名無しさんNGNG
括弧で区切って見ることもある。
loopは括弧が少なすぎる。
0481デフォルトの名無しさんNGNG
(defclass nullpo ()
     ((´∀`  :accessor (´∀` )
           :initform >>1
           :initarg ´∀` )))
0482デフォルトの名無しさんNGNG
--以下、個人的な嗜好--

loop大っ嫌い。氏ね。

--以上終了--
0483デフォルトの名無しさんNGNG
再会
0484デフォルトの名無しさんNGNG
>>482
cl-ppcre に喧嘩を売ってますか?まぁ使わないのは勝手ですがね
0485デフォルトの名無しさんNGNG
本スレにカエレ!

そう叫びたいのは漏れだけですか・・・
0486デフォルトの名無しさんNGNG
>>484
ん? cl-ppcre使うときにloopを使う必要あるの?

>>485
誰に言ってるんだ?
0487デフォルトの名無しさんNGNG
わかりますわかります
LOOPの存在はLISPを冒涜しています
0488デフォルトの名無しさんNGNG
で、carとfirst、cdrとrest等はどっち使えばいいんだ?
0489デフォルトの名無しさんNGNG
>>488
結果は同じでも、意味が違うんじゃない?
notとnullみたいな。

漏れは
再帰処理するときはcar,cdrで
純粋に1,2,3...番目の要素を取り出す時はfirst,second...かな
だから、restの出番はあまりない。
0490デフォルトの名無しさんNGNG
first... restの存在はLISPを冒涜しています
意味も存在価値も全くありません
余計なシンボル増やしてメモリ圧迫するだけです
0491デフォルトの名無しさんNGNG
head & tail
0492デフォルトの名無しさんNGNG
次の問題は?
0493デフォルトの名無しさんNGNG
>>490
シンボルって全部メモリ上にロードされているんですか?
0494デフォルトの名無しさんNGNG
私の持っている10年前に出版されたCommonLispの入門書には、

car,first、cdr,restは全く同じもの。
car,cdrはやや時代遅れ。理由の無い限りfirst,restを使ったほうが良い。

と書いてあります。
0495デフォルトの名無しさんNGNG
>>493 仮想記憶のアドレスは割り当てられるかもしれないけど、実際に参照しなければ実メモリは喰わない気がする。

>>494
> car,cdrはやや時代遅れ。理由の無い限りfirst,restを使ったほうが良い。
職場で、car, cdrを使ってコーディングしたら同僚から失笑をかったと言っている人が
いました。深い意味はわからんけど。

俺は慣れでcar, cdrを使うな。firstは second, third,..と一緒の場所でなら使うかも。
cdrより多分、restのほうが分かりやすいとは思う。
0496デフォルトの名無しさんNGNG
>>495
> 仮想記憶のアドレスは割り当てられるかもしれないけど、実際に参照しなければ実メモリは喰わない気がする。
GCでさわられちゃわないのかな?
0497デフォルトの名無しさんNGNG
>>494
対話による〜ってやつでしょ。
car,cdrを使ってる本の方が多いし、異質なんじゃないの。
0498デフォルトの名無しさんNGNG
>car,cdrはやや時代遅れ。理由の無い限りfirst,restを使ったほうが良い。
おいおい、
じゃあfirst,rest使う理由はなんだよ?
それこそ失笑モノだな
first以下はLISP史の汚点の一つだよ
0499デフォルトの名無しさんNGNG
cadrとかcddrなんかはLispにはないの?
0500デフォルトの名無しさんNGNG
普通に考えて、初心者にはfirst,restの方が分かりやすいからじゃないの?
caadrとかcdaarといった類のものも、確かに便利だけど、頭悪そうにも見えるし。
0501デフォルトの名無しさんNGNG
なんだとー!
0502デフォルトの名無しさんNGNG
ANSI CL 以降の入門書では first, rest を勧めている本もある。
Winstone の Lisp なんかは first, rest 派じゃなかったかな。
最近だと Paul Graham の本が car, cdr を押しているけどね。
first, second, third, ....
car, cadr, caddr, ....
nth 0, nth 1, nth 2, ....
あたりは全部覚えて置いたほうが良いんじゃないの。
car 派でも first 派でもあんまり狂信的だと、どっちも有害。
心は広くもちましょう。
0503デフォルトの名無しさんNGNG
car と cdr がそれぞれ first と rest に意味的に一致するとは限らない。
0504デフォルトの名無しさんNGNG
>>503
意味はプログラマの中にあるのでは?
0505デフォルトの名無しさんNGNG
503> 俺たちはとんでもない思い違いをしていたようだ…
HyperSpec の記述、
(first list) == (car list)
Notes:
first is functionally equivalent to car,
second is functionally equivalent to cadr,
third is functionally equivalent to caddr,
and fourth is functionally equivalent to cadddr.
は car, cdr と first, rest の意味的一致を示すものではなかったんだ!
その他> な、なんだってー(以下略
どーゆうことなんだ? >>503
0506デフォルトの名無しさんNGNG
おれは

コンスの左側 => car, 右側 => cdr
リストの 1 番目 => first, 2 番目 => second, ..., リストの 1 番目以外 => rest

と使い分けている。統一せよと言っている人は教条的だな。
あと first, rest はインデントがそろわないのが気にいらない。

(defun copy-list (lst)
(if (null lst) lst
(cons (car lst)
(cdr lst))))

(defun copy-list (lst)
(if (null lst) lst
(cons (first lst)
(rest lst)))) ; 気持ち悪い
0507494NGNG
>>497
そうです。
最近古本で買ったんですけど、それなりに分かりやすいので、
ちょっと(ほんとにちょっと)はLispが使えるようになったと思う。

でももうすぐ読み終わりそう。
なんかオススメのLispの本ってありますか?
英語読めないので、日本語の本で。
0508デフォルトの名無しさんNGNG
>>507 日本語だと
1. Paul Graham の ANSI Common Lisp
2. ウィンストンの LISP (I), (II)
あたりかなぁ。ただ、2. は内容は良いんだが、翻訳と誤植がひどい
のでちょっと覚悟がいるかも。CONS が COSN とかなっててもキニシナイ
0509494NGNG
>>508
どうもです。
明日あたり本屋回ってみます。

でもちょっと前に軽く探したんですけど、地方だからかLispの本って
全然置いてないんですよね〜
中身見てから買いたいけど、無かったらアマゾンで買うか。
0510デフォルトの名無しさんNGNG
>>509 確かに少ないですね。見つかったらなんでも即買いでいいほどかも。
他のおすすめ。アマゾンで手に入ります。本屋さんには無いかも。
1.下地貞夫(著)、     「数式処理」基礎情報工学シリーズ、森北出版
2.湯浅太一、荻谷昌己(著)、「Common Lisp 入門」、      岩波書店

1の用に、言語それ自身の本じゃなくて、
主目的が別にある本に分かりすくて有益な Lisp コードが書かれている本って
実は結構ありそう。人工知能分野とか。
0511デフォルトの名無しさんNGNG
こんなときはどっち?

* alist の key.car か,first か.
* では alist から key を取った残りは?

残りだから rest でしょうか?
しかし dotted pair では残りとは言えません.
0512デフォルトの名無しさんNGNG
Paul Grahamの"ANSI Common Lisp"の訳本はリファレンスが訳されてないからかなり不便になってるな。
0513デフォルトの名無しさんNGNG
>>508
あれって(plus 4 5)とか書いてあったりして隔世の感があるよな。

0514デフォルトの名無しさんNGNG
リファレンス訳してないんだ。価値半減。
0515デフォルトの名無しさんNGNG
Paul Grahamの"ANSI Common Lisp"の訳本にのっている問題をここで解いていくのはどう?
0516デフォルトの名無しさんNGNG
悪いとは言わんが、ずっと前から本スレで散発的にやってるので
まずはその過去ログ嫁。
0517デフォルトの名無しさんNGNG
そのうちうpするよ、たぶん。
0518デフォルトの名無しさんNGNG
>>511
なんで?(key . value) で value は「残り」じゃそんなにまずいの?
まぁ、そう思う 511 は間違いなく car/cdr 派だから car/cdr を使ったほうが
いいんじゃないかな。

>>513
そんなのあったっけ?今手元にないんだが、クロージャ、ジェネレータ、
マーク&スウィープ GC、CLOS、遷移木のコンパイルと一通りそろった
入門書だった記憶があるが。とにかく訳と誤植がひどかった思い出がある。
0519デフォルトの名無しさんNGNG
>>518
alist の場合は普通「keyとvalueのペア」として扱うだろうから、「残り」じゃ変でしょ
0520デフォルトの名無しさんNGNG
2つの組から、一つとったものを「残り」と捕らえるのがそんなに変か?
俺は残り云々よりどうしても cons セルの car cdr が浮かぶので cdr
使うけどな。別に rest 使う奴にオマエは変だ! cdr にしろ!と言うほど
強いこだわりは無い。
0521デフォルトの名無しさんNGNG
二つしかなくて、それぞれ同等なのに、 first と rest に分けるのは変。
first は一つで、 rest は不特定多数っぽいもん。

他人がどれ使っててもいいっていうのは同意だけど。
0522デフォルトの名無しさんNGNG
CommonLispが出来ると何かメリットあるの?
就職に有利になるとか?
0523デフォルトの名無しさんNGNG
>>522 じわじわ効いてくる感じ.

ところで質問です.CLHS の position 関数のところにこんな記述が.

Notes:
The :test-not argument is deprecated.
The function position-if-not is deprecated.

これは,not で使うなら述語に含めて下さいという意味ですか?
CLHS は関数の説明に Application note があったらいいなぁ.
:start に nil が来たらいけないくせに,見つからないときは
nil しか返せない.(or (position ...) (length str)) じゃあなぁ...

do ループはいまいち使いずらいし,labels をループに使うのは
気の利かない処理系で慘めになりますYO!
0524デフォルトの名無しさんNGNG
>>523
> これは,not で使うなら述語に含めて下さいという意味ですか?

うん。
たとえば、:test-not #'foo ではなく :test (complement #'foo) にしろってことです。
0525デフォルトの名無しさんNGNG
>>522
はっきり言って就職の役に立つ事はほとんどありません.
面接官が Lisp == 時代送れ と思い込んでる可能性もありますし.
就職のためになる言語を学びたいなら C++/Java あたりをオススメしまつ.
0526デフォルトの名無しさんNGNG
うちの会社ならおれが面接するので Lisp と書いておくとちょっと有利になる。
Lisp というより関数型言語の知識があると役に立つ場面がある。
0527デフォルトの名無しさんNGNG
Lispできると言語ヲタのイメージがある
0528デフォルトの名無しさんNGNG
>>526
いい会社だな。漏れなんて
「学生時代は何で開発を?」
「主に Common Lisp 使ってました」
「ウチはオブジェクト指向を重視してるんですよ?」←いきなり表情が険しくなる
「え、いや、その……申し訳ありません」
というのを経験して以来、Lisp の名を出さないように気をつけていた。
>>527 みたいなイメージもありそうだしな。実名じゃ Lisp 好きなんて言えねー
0529デフォルトの名無しさんNGNG
>>528
逆に、そういう会社に間違って入らないための指針にもなるなw
0530デフォルトの名無しさんNGNG
久しぶりに問題でも出してみるか。

[問題]
階乗 x^n を普通に計算すると
(defun my-expt (x n) (if (= n 0) 1 (* x (my-expt x (1- n)))))
となりこの計算回数は n に比例する。これを工夫して log(n) の
オーダーの計算回数で計算するように修正せよ。
また n が 10000 程度のときどれくらい計算回数に差がでるだろうか?
0531デフォルトの名無しさんNGNG
(defun my-expt (x n) (hoge #'* x n))
なhogeを作った方が使いまわしできるな。
0532デフォルトの名無しさんNGNG
(defun my-expt (b n)
(labels ((square (x) (* x x)))
(cond ((zerop n) 1)
((evenp n) (square (my-expt b (/ n 2))))
(t (* b (my-expt b (- n 1)))))))
0533デフォルトの名無しさんNGNG
>>528
>「ウチはオブジェクト指向を重視してるんですよ?」←いきなり表情が険しくなる
ってところで、CLOS を持ち出したりすると、
どうせその面接官は知らんだろうから自尊心が傷つけられちゃって、
さらに心証を悪くすることになるんだろうな。
0534デフォルトの名無しさんNGNG
>>530 階乗は累乗のまちがいだよね。
0535デフォルトの名無しさんNGNG
>>530
> また n が 10000 程度のときどれくらい計算回数に差がでるだろうか?
532の場合。
10000回 vs (log 10000 2) * m = 13.29 * m回
0536デフォルトの名無しさんNGNG
>>528
>「ウチはオブジェクト指向を重視してるんですよ?」←いきなり表情が険しくなる
笑った。わけわかんない言語で変なクセがついているのを警戒しているのかな?

>>527
>Lispできると言語ヲタのイメージがある
ほめことばだよね。
0537デフォルトの名無しさんNGNG
>「ウチはオブジェクト指向を重視してるんですよ?」←いきなり表情が険しくなる
ここでキレて

諸君 私はLispが好きだ。
括弧が好きだ。リストが好きだ。
再帰が好きだ。lambdaが好きだ。高階関数が好きだ。
パッケージが好きだ。クロージャが好きだ。マクロが好きだ。
...

と演説カマしてみたらどうなるだろう。
0538デフォルトの名無しさんNGNG
その演説につきあって、なぜ、...が好きなのか丁寧に訊いてきたらみどころあるね。
0539デフォルトの名無しさんNGNG
無職なんだけどlisp必要でしょか?
0540デフォルトの名無しさんNGNG
必要、不必要を判断するのは、状況をかなり限定しなくては不可能でしょう。
無職という点を生かしてlispにはまってみるのも面白いかも。
0541デフォルトの名無しさんNGNG
>「ウチはオブジェクト指向を重視してるんですよ?」
それは、オブジェクト指向といいたいだけなので
素直に「うちは、C++とJavaしか使いません」と面接官いえないんでしょ
0542デフォルトの名無しさんNGNG
>>534
寝る前に出題したんで間違えたスマソ…
0543デフォルトの名無しさんNGNG
顧問栗鼠( ´,_ゝ`)プッ
0544デフォルトの名無しさんNGNG
うーむつまらない問題を出してしまったかな。無理矢理別解。

(defun my-expt (x n)
(do* ((n n (ash n -1))
(r 1 (if (= (logand n 1) 1) (* r x) r))
(x (* x x) (* x x)))
((= n 0) r)))
0545デフォルトの名無しさんNGNG
無職だからこそlisp
0546デフォルトの名無しさんNGNG
二進展開するときって Cだと &1 とか >>1 とか使っていい感じになって
こういう計算はコンピュータに向いてるなあと感じるんですけど、
CommonLisp とか Scheme とかだとそれがあまり感じられないのですが
当り前の様に最適化されているのでしょうか。
0547デフォルトの名無しさんNGNG
ash, logandはintegerを引数として取るので、
* fixnum, bignumの型チェックがある。
* fixnumと確定したあとも、タグビットの操作がある。
したがって、型宣言、インライン宣言するなどコンパイラの手助けをしなければ、
Cに処理速度で負けることはある。

逆にCと同じだけの型宣言などをすれば、理論上は同じ処理速度を得られる
可能性はある。あとはコンパイラの出来しだい。

別の観点から考えると、普通に書いた関数でも、
(my-expt 2 100)
=> 1267650600228229401496703205376
と正しい結果が得られて、コーディング中にオーバーフローの心配は消滅する。
0548デフォルトの名無しさんNGNG
つまり、CとCommonLisp, Schemeでは、最適化のポイントが違うんだよね。
Cは機械寄り、Lisp系は抽象概念寄り。
0549デフォルトの名無しさんNGNG
>>531
(defun hoge (f x n z)
(cond ((zerop n) z)
((evenp n)
(let ((y (hoge f x (/ n 2) z)))
(funcall f y y)))
(t (funcall f x (hoge f x (1- n) z)))))

(defun my-expt (x n)
(hoge #'* x n 1))

(defun my-mult (x y)
(if (< x y) (hoge #'+ y x 0)
(hoge #'+ x y 0)))

他の使いまわし方が思いつかん。
0550デフォルトの名無しさんNGNG
>>533
面接官に Lisp って言うより、CLOS と言っておいて、

「CLOS とはどういったモノですか?」
「動的オブジェクト指向言語です」

と言えば何かすごそうに聞こえるよ。(Franz の手法)
0551デフォルトの名無しさんNGNG
clocc のインストールが マンドクサ。。。('A`)
load とか require だけじゃ高度なライブラリは作れないのでしょうか.

目下,google で「AA マンドクサ」を検索すると本スレ part9 が...
0552デフォルトの名無しさんNGNG
>>549
(defun hoge (f x n z)
(cond ((zerop n) z)
((evenp n) (hoge f (funcall f x x) (/ n 2) z))
(t (hoge f x (1- n) (funcall f x z)))))
0553デフォルトの名無しさんNGNG
>>551
マニュアルが素早く斜め読み出来る英語圏の人にとっては何でもないのかな。
それとも、やっぱり苦戦するのかな。

とりあえず、sbclには最初からasdfがインストールされてるので漏れは最近(cmuclから)
こっちに浮気中。
0554デフォルトの名無しさんNGNG
(t (hoge f (funcall f x x) (/ (1- n) 2) (funcall f x z)))))
0555デフォルトの名無しさんNGNG
>>554
そっちの方が速いとは限らない。
0556551NGNG
>>553
素早く斜め読みしてみました.
* Using GNU Make ... と
* Lisp-only が目に着きました.
おお! Lisp コードだけでもインストールできるじゃないか.
英語に馴れたフリをすることで気付けました.ありがとうございます.

しかし,
(load "/home/foo/.../clocc/clocc")
=>
...
*** - EVAL: the function WITHOUT-PACKAGE-LOCK is undefined
...

うちの Debian woody のパッケージ, clisp 2.27 は古いと仰せられました.
処理系には依存しないが,ディストリビュージョンの
パッケージには依存するという盲点です.

古い clocc を探してみるも,clocc.sourceforge.net -> Project home には
よく分からない 5 つのパッケージが.そのうちの CLX を
落としてきましたが,,,なんてインストールが簡単なんだ!
これで cllib をバリバリ使えるんですか?ちょっといろいろやってみます.
0557デフォルトの名無しさんNGNG
CMUCLでインストールしたときの(シェルオンリーの)メモ。

$ export LISPTYPE=cmucl
$ cd /path/to/clocc
$ make clocc-top

この後 clocc/src/以下のディレクトリ(port/とかcllib/とか)の
使いたいライブラリのある場所に行って

$ make system

とやれば、ビルド開始。

で、cmuclの初期設定ファイルに

$ cat >>~/.cmucl-init.lisp
(setf *clocc-root* "/path/to/clocc/")
(load (concatenate 'string *clocc-root* "clocc"))

;; ↓ロードしたいものを御自由に指定してください。
(load (translate-logical-pathname "clocc:src;cllib;base"))
(load (translate-logical-pathname "clocc:src;port;sys"))
Ctl-D

#'save-lispなどでcoreに含めてしまうのも良し。
0558デフォルトの名無しさんNGNG
>>552
なるほど、おれの頭には
x^n == (x^(n/2))^2
しかなかったけど、こっちでもいいのか。
x^n == (x^2)^(n/2)

>>544 そのアルゴリズムって岩波の「基本的算法」かなんかで見た気がするな。
0559デフォルトの名無しさんNGNG
Commonlispで書かれたZopeみたいなアプリケーションサーバーがあったら
最強じゃない?
0560デフォルトの名無しさんNGNG
ZopeをCommonLispから使える様にしたらどうか。
Zopeの何も判ってない奴の意見だが。
0561デフォルトの名無しさんNGNG
CommonLispからPythonのコードを利用できるようにすればいいのか・・・。
Lython[ttp://slashdot.jp/article.pl?sid=04/02/15/1528254]と逆のアプローチで。
0562デフォルトの名無しさんNGNG
python とか ruby にある toeuc みたいなやつはありますか?
無いと非常に困ります.
0563デフォルトの名無しさんNGNG
無いと困るなら作れ
0564562NGNG
>>563
shell に nkf コマンドを渡すからイラネーヨ w
しかし clisp で ext:shell するとプログラムの終了ステータスしか返されず,
出力は標準出力に垂れ流してしまう.
一時的なファイルに入れておけと?
0565デフォルトの名無しさんNGNG
>>559
ZopeくらいのことはCL-HTTPで十分だったりしない?
0566デフォルトの名無しさんNGNG
Allegro Webactions
0567デフォルトの名無しさんNGNG
>>565
> ZopeくらいのことはCL-HTTPで十分だったりしない?
CL-HTTPはウェブサーバで、Zopeはウェブサーバにもう一層、アプリケーション層
の仕組みが加わって、いるのでは? ユーザ認証から始まって、Zopeオブジェクト
をデータベースに保存できるとか、色々便利そうな機能があるのではないのかな、
Content management systemとしての機能もあるかな?

>>564 GNU CLISPなら、普通にEUC-JPを扱えないのかな?
詳しいことわすれたけど、CLISPでなら日本語の文字コード変換フィルタ
プログラムって:external-encoding(だっけ?)を読み書きのときに指定
するだけなのでは?
0568デフォルトの名無しさんNGNG
> CL-HTTPはウェブサーバで、はたして、そうかな。ページだと思ってみていたものが、実はCLOSオブジェクトだったということもあるのでは、ないかな。
0569デフォルトの名無しさんNGNG
>> 564
clisp なら convert-string-from-bytes と convert-string-to-bytes で変換かな
0570デフォルトの名無しさんNGNG
CLISPはlibiconvのフロントエンドとして重宝するよね。
0571562NGNG
>>567, >>569
わー.すみません.内心,最初から諦めていたのか
impnotes.html を読んでいませんでした.
すごいです.欲しかったものがたくさんありました.

ただ,URL エンコードされたものについて色々やってみましたが,
iso-2022-jp の場合は「% に続く 2 文字を整数にしてベクトルへ格納」という
やり方ではできないようです.$ が入っていたので (w3m にて).

>>570 活用しているんですね.いいなぁ.
0572デフォルトの名無しさんNGNG
EclipseでLISPの開発ってできないかなぁ。
使い勝手のいいUDEでLISPが開発できればいいのに。
0573デフォルトの名無しさんNGNG
製作中のプラグインがいくつかありますが、現状ではハイライトができる
程度ですね。まぁ、Eclipse を自分でいじれるクラスの人なら好きなように
できるでしょう。でも主な Lisper は Lisp ベースのエディタ(Emacs とか)
使ってる人が大多数なので…。

ちなみにどの辺が使い勝手が良いですか? >Eclipse
ソースレベルデバッガとかリファクタリング周りは羨ましいけど
結局 Lisp の開発だと Emacs の方が快適なんで Eclipse は Java でしか
使ってないんですが。
0574デフォルトの名無しさんNGNG
ECLIPSEが使い勝手がいいかどうかは漏れもJAVAでしか使ったこと
がないから知らんが、一般に普及しているECLIPSEでLISP開発が
できたら認知度のUPにつながるかも知れない。

>573
リファクタリングは便利。
packageの移動字に名前を自動で参照しなおしてくれるのもいい。
0575デフォルトの名無しさんNGNG
じゃあ誰か作ってくれ
て、EllipseのプラグインってもしかしてJava?
・・Javaわかんねえよなおまいら
つーかEllipse入れるってことはJavaランタイムも入れなきゃだめか
0576デフォルトの名無しさんNGNG
>>573 が
> 製作中のプラグインがいくつかありますが、現状ではハイライトができる
> 程度ですね。
と書いているのだが…。
0577デフォルトの名無しさんNGNG
で、Java入れたくねえとか言い出すんだろ?
わかってるって!
0578デフォルトの名無しさんNGNG
なんか他のネタキボンヌ。
0579デフォルトの名無しさんNGNG
Java入れなくねえ
0580デフォルトの名無しさんNGNG
LispでEclipseプラグインを開発できるような、Eclipseプラグインを
つくればいいんじゃないのばかども。
0581デフォルトの名無しさんNGNG
Common Lispの開発環境はEmacsで作るのが面白そう。
汎用IDE開発環境として十分な機能がそろっているし。
最近はEmacsも画像を扱えるようになったので、
見ためもEclipseにあまり負けていません。
http://ecb.sourceforge.net/screenshots/1.png
http://ecb.sourceforge.net/screenshots/index.html
この絵にあるようなツリーコンポーネントのコードって独立して
他のパッケージから使えるのかな。ETK (Emacs Took Kit)とかいって
だれかツリービュー、ボタンなんか作らねーかな…
(テキストベースのツールキットはすでにあるけど)
emacs + CL ワショーイ!
0582デフォルトの名無しさんNGNG
s/Took/Tool/ ハァ… 疲れてるな。
0583デフォルトの名無しさんNGNG
CommonLisp規格は、なぜアメリカ(ANSI)どまりで、ISOの国際規格にならなかったのですか?
0584デフォルトの名無しさんNGNG
別に誰も困らなかったから。

;; スレ違い気味だがそういや ISLISP ってのがありましたなぁ
0585デフォルトの名無しさんNGNG
ヨーロッパの人達はCommonLispに反対してるとか。ドイツは別として。
0586デフォルトの名無しさんNGNG
ここら辺の話ですかね。
http://www.itscj.ipsj.or.jp/topics/tp34.html
0587デフォルトの名無しさんNGNG
まぁ、なんだかんだいっても ANSI CL が出来ちゃったからな。ISLISP の処理系は
OpenLisp と国産のが2つくらい?どれも普及するようなもんじゃないよなぁ…。
CL よりコンパクトっても CL より高性能の処理系がなきゃぁ使う気がおきないよ。
仕様がコンパクトなだけなら別に Scheme でもいいし。
0588デフォルトの名無しさんNGNG
やっぱ価値観としては高性能だよね
あとCLの場合は互換性かな
実行ファイルも作れるとなおいいんだけど
0589デフォルトの名無しさんNGNG
>>586 情報アリガト。
>>587 CL より高性能の処理系がなきゃぁ使う気がおきないよ。
俺がCLが好きなのはプログラミング上で問題になりそうなことの解決策が
仕様としてすでに用意してあることなんだよね。その解決策がSchemeが求めるような
たったひとつの冴えたやりかたではないにしても。

卑近な例では、キーワードパラメータとか、コンパイラマクロとか、色々ね。

ここらへんは、規格制定時に各Lisp陣営から知恵をあつめた成果だと思うけど。
0590デフォルトの名無しさんNGNG
いきなりな話ですみません。

最近Lisp/Schemeの面白さに目覚め、できればこれで飯食って行きたいと本気で考えてるんですが、
どの会社の業務内容を見ても使用言語はC/C++かJava、良くてPerlとしか書いてありません。
富士通やNTTでは研究が行われていた(それも昔の話?)ようですが、
現在のところどうなんでしょう?
もちろん言語は手段の一つに過ぎないことはわかってるのですが、
どうせ仕事するなら好きな言語でとどうしても考えてしまいます。

俺は仕事でLisp/Scheme使ってるよって方いますか?

0591デフォルトの名無しさんNGNG
使ってるという話は良く聞くけど、具体的にどこで使ってるのかは知らんw
誰か教えて。
0592デフォルトの名無しさんNGNG
個人的なツールとして業務で使ってる人はいるだろうけど、
案件として、lisp/schemeな仕事って殆どないんでない?

仕事にしたいなら、ポールグレアムさんや川合史朗さんみたく自分で会社作っちゃうか、
大学とかの研究室に入るのが多分一番速いと思うがどうだろう?

参考までに(ACLとschemeな例だけど)
ttp://jp.franz.com/base/success_main.html
ttp://www.shiro.dreamhost.com/scheme/experience-j.html
0593デフォルトの名無しさんNGNG
とまべちの会社に入れば?
あとは言語処理系扱ってる会社なら可能性あるかも。
0594デフォルトの名無しさんNGNG
高機能かどうかは実装依存
規格が約束するのは高機能
0595デフォルトの名無しさんNGNG
まちがえた
正: 高性能かどうかは実装依存
0596デフォルトの名無しさんNGNG
でも、規格が、その時点での技術を使って高性能な実装を許すかという事はあるよね。
Cの例でいうと、変数へのポインタ経由での自由な参照(aliasing)をゆるしている仕様
のせいで、コンパイラが、なかなかFortranに勝てる最適化ができないという課題が
あったよね。

この点は、C99規格で対処したような気がしたけど。

CLなら、CLOSの実装かな…
0597デフォルトの名無しさんNGNG
規格がシンプルでも実装がでてこないものもあるからな。ISLISP とか。
そうゆう意味では CL は比較的恵まれている。CLOS もリファレンス実装
だった PCL にもメソッドキャッシュがあったりしてそこそこがんがって
たよね。
0598デフォルトの名無しさんNGNG
というか、PCLによってloopsの仕様が心配されていた程遅くならないことが分かって、
loopsよりになったんだよな。

bit別冊 Common Lisp オブジェクトシステム 共立出版 (絶版)
にそこらへんの事情が説明されてた。
0599デフォルトの名無しさんNGNG
>>598 へぇx3
loopsとかflavorsとか聞くけど、実際はどんな感じのモノだったのかな。
昔話キボウ!
0600デフォルトの名無しさんNGNG
初心者スレじゃなくなってきたー
0601デフォルトの名無しさんNGNG
初心者スレじゃない攻撃! ヒーッ!
0602デフォルトの名無しさんNGNG
だからこのスレは本スレと議論を(意味もなく)分散させてるだけなんだってばw
0603名無しさん@EmacsNGNG
>>591
>>592
>>593
ありがとうございます。
実は既に大学の研究室に在籍してます。動画像や音声の実時間処理が
中心なのでほとんどCを使わなければいけない感じですけど。
Lispは研究とは関係なく、ほとんど趣味でやってます。
いじってるだけで楽しいのでよっぽど向いてるのかもしれません。
(Lisp関連の論文なんかも落として読んでいるんですが、
直接研究に繋がらないのがツラいです。)

そもそもLispに興味を持ったきっかけはEmacsとSawfishなんですけど、
完璧にハマったのがポール&川合さんのサイトが原因です。
起業も・・・してみたいんですけど、どうしてもノウハウが。
いくつか会社説明会をまわってるんですが、
企業によっては問題を解決するのにエンジニア側が好きな言語を選択できる
場合もあるそうなので(サーバサイドのシステムなんかはそうらしいです)、
そこらへんを中心に探していくしかないですかね。

あと前から気になってたんですが、とまべちさんってどういう方なんでしょうか?
Lispacheなんかで有名ですが、洗脳とか催眠とかアブナそうな
キーワードが・・・。
0604デフォルトの名無しさんNGNG
じゃあ、問題でも出してみるか。
初心者以外の人が解答を書く場合、別のところに書いてリンク貼ってね。

[問題] member, assoc を実装せよ。なお、:test キーワードのみサポートすればよい。
0605デフォルトの名無しさんNGNG
>>603
おれの知ってる範囲で、最近日本で Lisp 使って仕事してるとこってここくら
いしか知らない。
ttp://cl-www.msi.co.jp/solutions/knowledge/
毎月 CL のセミナーやってるからそのときに来て話を聞いてみたら?
0606デフォルトの名無しさんNGNG
>>602
CL 中心という事と初心者向けという事で目的が違うじゃん。住人が
かぶってるんだからしょうがないだろ。いちいち指摘しなくてもいいんじゃネーノ。
0607デフォルトの名無しさんNGNG
LISPで実行ファイル作れるコンパイラってあります?
XXX.exeに憧れる・・・。
0608デフォルトの名無しさんNGNG
cmucl on linux ならこことか
http://www.cons.org/cmucl/doc/executable-print.html

つーかそんなことするまでもなくシェルスクリプトの要領で書けば(Winならバッチファイル?)解決...
0609名無しさん@EmacsNGNG
>>608
前から気になってたんですが、シェルスクリプト風に書く場合
1行目って、gclなら
#!/usr/bin/gcl.exe -f

clispなら
#!/usr/bin/clisp

でできるんですけど、cmuclの場合はどうしたらいいんでしょうか?
0610デフォルトの名無しさんNGNG
CLISP使ってるんですけど・・・その「バッチファイル」とわ
一体なんですか?
どうやって使うんですか?
0611デフォルトの名無しさんNGNG
>>609
#!/bin/bash
lisp <<EOF
(format t "Hello,world!")
EOF

みたいな感じで良いのでは。
















# #!/usr/bin/lispが使えないことに気付いて必死のフォローw
0612名無しさん@EmacsNGNG
>>610
「バッチファイル」ってUNIXでいうところのシェルスクリプトのことです。
やって欲しい処理をDOSコマンドで書いておくと、上から順番に実行してくれると。
0613名無しさん@EmacsNGNG
>>611
ttp://www.geocities.co.jp/SiliconValley-SanJose/7474/ScriptingWithLisp.html

ここに一応cmuclのスクリプティングのやり方があったんですけど、
ちょっとややこしいというか、もうちょっと他の処理系みたいに
簡単にいきたい・・・
0614デフォルトの名無しさんNGNG
>>613
たぶん cmucl の使い方を間違えていると思われ。スクリプト実行する
たびに起動するには cmucl はでかすぎる。そーゆう用途なら CLISP で
やったほうがいいと思うよ。
0615デフォルトの名無しさんNGNG
>612

例文を〜〜・・・
立ち上げまではうまくいけたけど、それ以降がわからない・・・。
0616デフォルトの名無しさんNGNG
>>615
えっとバッチファイルのほうですか?
それともclispのスクリプトのほう?

clispのスクリプトであれば、上のほうにあるように
------------------------------
#!/usr/bin/clisp

;;↓なんか適当にLispプログラム書いて下さい
(defun ave (args)
(float
(/
(apply #'+ args)
(length args))))

(let ((numlist '(342 123 646 6464 4 423)))
(format t "average = ~A~%" (ave numlist)))
------------------------------
こんな感じで書いて、適当な名前(ここでは"hoge"にしときます)で保存して
実行権限付けて、あとはターミナル上で
% ./hoge
ってやれば
average = 1333.6666
こんな風に結果が得られます。

ってこんな感じでいいんでしょうか?
0617デフォルトの名無しさんNGNG
>>604
>[問題] member, assoc を実装せよ。なお、:test キーワードのみサポートすればよい。
Loopを使う人は少なそうなので、あえてLoopを使ってassocを実装してみました。
destructuring機能も使ってみました。loopだからっていじめないでね。








(defun my-assoc (item alist &key (test #'eql))
  (loop for entry in alist
        for (key . value) = entry
        when (funcall test item key)
          return entry))
0618デフォルトの名無しさんNGNG
と思ったら、valueで受ける必要はなかったので、destructuringもあんまり意味無いな。
return valueだと思って書き始めたのが敗因です。






(defun my-assoc (item alist &key (test #'eql))
  (loop for entry in alist
        when (funcall test item (first entry))
          return entry))
0619デフォルトの名無しさんNGNG
memberにはmaplを使って、assocはmember + key指定。

(defun my-member (item list &key (key #'identity) (test #'eql))
  (block nil
    (mapl #'(lambda (list)
              (when (funcall test item (funcall key (car list)))
                (return list)))
          list)
    nil))
(defun my-assoc (item alist &key (test #'eql))
  (car (my-member item alist :key #'car :test test)))


(defun my-member (item list &key (key #'identity) (test #'eql))
  (block nil
    (mapl #'(lambda (list)
              (when (funcall test item (funcall key (car list)))
                (return list)))
          list)
    nil))
(defun my-assoc (item alist &key (test #'eql))
  (car (my-member item alist :key #'car :test test)))
0620デフォルトの名無しさんNGNG
ニ、ニ、ニカイ、コピペシテシマッタ。
0621デフォルトの名無しさんNGNG
落ち着け
0622デフォルトの名無しさんNGNG
(defun my-assoc (item alist &key (test #'eql))
(declare (inline remove))
(check-type alist list)
(car (remove item alist :test-not test :key #'car)))
0623デフォルトの名無しさんNGNG
>>616 clispでいわゆるgetoptみたいに、コマンドライン引数のスイッチ処理を
するための関数はありますか? どこかで見たような気がするのですが忘れてしまいました。
0624デフォルトの名無しさんNGNG
GNU CLISP では試したことないですが http://www.cliki.net/getopt なんかどうでしょう。
0625デフォルトの名無しさんNGNG
>>624 調べずに聞いてごめんなさい。cl-getoptというパッケージがdebianに
用意されていました。教えていただいたのと同じものだと思います。
clispでも使えるようです。

さぁ、これでスクリプティングにclispを使わない理由が無くなってきたな>俺
0626デフォルトの名無しさんNGNG
>>616

をを、その方法で出来るのですか。
ちなみにWINDOUWSでできますか?
0627デフォルトの名無しさんNGNG
できるわけねーだろ>626
cygwin上でしか動かないだろうな。

それとさ、UNIX厨は黙れよ。
最初に.exeって書いてあるんだからWindowsの話だろ。
0628デフォルトの名無しさんNGNG
きびしい御言葉...
俺のイタコのバアちゃんに聞いたら、LispWorks, Allegro CLなど有料の処理系ではWindowsでexe吐かせることができると思うと
言ってました。
0629デフォルトの名無しさんNGNG
売り物はむしろできて当然でいて欲しい・・
0630デフォルトの名無しさんNGNG
exe って言っても処理系丸ごとラッピングしてるだけじゃないの?
0631デフォルトの名無しさんNGNG
ソースをリソースとして持ってるだけっだったりして
0632デフォルトの名無しさんNGNG
それでもいいよ
できないよりはいい
0633デフォルトの名無しさんNGNG
>>630
> exe って言っても処理系丸ごとラッピングしてるだけじゃないの?
現在のコンピューティング一般の傾向として、「それで何がいけないの?」という意見も
ありえる。exeがデカくなりすぎるという批判かな? 組み込み用途などを除いて、デカさ
は今どき、みんなスルーする話題なのでは?

たぶんExe + Common Lispランタイムdllという構成でだいたい満足できるのではないかな.

配布ファイルのデカさの解決策として、Common Lisp界隈では、tree shakingという技術が
発達しています。つまり、配布用の実行ファイルという木にケリを入れて、いらなそうな機能
という葉をふるい落すというイメージです。実際のところは知らんけど、デバッガ、コンパイラ、
など普通にいらなそうな機能からはじまって、CLOSとかもうまくやれば、理論上はまるごと削れる
よね。

ただそれでも、「やっぱり空のmain()の方が小さいよ」とかいう事を言う人もいるでしょう。
0634デフォルトの名無しさんNGNG
以前 Lisp のイメージ + 処理系という方式は Windows ユーザーには受けないよねっ
て話がでていたがまさしくその通りだな……。Lisp の動的さを生かすためにはフル
機能をユーザーに解放していて欲しいわけで機能削ってまで実行ファイル単体にまと
めるのもなー。まぁ商用の LispWorks や Corman はできるわけだが。

>>633
処理系丸ごとラッピングとかで配布されると使い回しに問題が。できればソースが欲
しい。Lisp 使ってる人は大抵自分のイメージファイルがあるわけで、プログラムを
取り込んで使いたいって人が多いんじゃないかな。
0635デフォルトの名無しさんNGNG
「read-eval-print loop」という言葉に代表される
Common Lispのインタラクティブな環境としての特性と,
int main(int argc, char *argv[]) を特別扱いするC系コンパイラの特性とは,
まったく反対な気がする.
C系コンパイラは,そもそもが実行ファイル組み立て装置なわけで.
それに対しCommon Lispの(ネイティブ)コンパイルは,最適化のための手段でしかないのでは.
むしろPHPとか鯖サイドJavaとかに近い.
Allegroとかのスタンドアロンアプリ生成機能は,ぶっちゃけLispらしくないと思うけど,
みんなもそう思わない?
アプリに組み込んだらどうなる,とかまた別の話になっちゃうけど.
0636デフォルトの名無しさんNGNG
できないより できたほうがうれしい
0637デフォルトの名無しさんNGNG
実行ファイル組み立て装置な Lisp 処理系欲すぃ。
0638デフォルトの名無しさんNGNG
>>634
> 処理系丸ごとラッピングとかで配布されると使い回しに問題が。できればソースが欲しい。
ん? ソースを配布するかは、技術的に難しいとか簡単とかの問題ではなくて、単に配るか
配らないかという問題だよね?

> Lisp 使ってる人は大抵自分のイメージファイルがあるわけで、プログラムを
> 取り込んで使いたいって人が多いんじゃないかな。
それは、Lispを使う上では常識だけど、今は、exeが欲しいという人がいたので
あえて書いたんでしょう、たぶん。

>>635
つまり、Lispは、「OS」というと語弊があるから、「(開発)環境」なんだよね。
そんで、普通のLisp処理系には、Cの開発環境でいうところの C compiler +
C interpreter + Debugger + ...
という機能がつまっていると。 あと、make、profilerなんかもCの開発環境よりも
はるかに、継目が目立たないように統合できると。

> Allegroとかのスタンドアロンアプリ生成機能は,ぶっちゃけLispらしくないと思うけど,
> みんなもそう思わない?
アプリケーションのユーザーにrepループが開放されていないのなら、実質、どんな言語で
書かれていようが気にならないのでは?

>> 637
> 実行ファイル組み立て装置な Lisp 処理系欲すぃ。
どういう意味で言っているのか、いまいち理解できているかわからんけど、
ECL(Embeddable Common-Lisp)を見てみる事を、お薦めします。
0639デフォルトの名無しさんNGNG
つまり、Lispで書いたアプリケーションのマクロ言語としてLispが使えるようにしないのは損だね。
だから、LispでWeb browserを書いたら、JavaScriptはサポートしなきゃならないけど、おまけで、
Lispも使えるようにする人が多いでしょう、多分。

これが、Cだと普通、アプリのマクロ言語としてC言語をサポートをするのはまれだよね。
0640デフォルトの名無しさんNGNG
>>634
>機能削ってまで実行ファイル単体にまとめるのもなー
exeにするってことは既に用途が決まってるわけで、
いらない機能なら削る事は特に問題ない。
必要になるなら別バージョンのexeを作ればいいし、
なんでもかんでも動的にしとけばいいってものでもない。

それよりアプリケーション側で下手にeval開放するとなると
セキュリティとかの問題が出てくるわけだが。
0641デフォルトの名無しさんNGNG
>>639
>これが、Cだと普通、アプリのマクロ言語としてC言語をサポートをするのはまれだよね。

アドインモジュールのABIがCコンパイラに依存してる(まあ当たり前だけど)のは
ある意味Cをサポートしてるのと同じじゃないかな。
0642634NGNG
>>638
いやコンパイル済みのやつは互換性を保つのが難しいくらいの意味っす。
普通はプラットフォーム間の移動もムリポだし。CLISP なんかはがんばってるけどね。

>>640
Windows な初心者なら アプリケーションを配布する == EXE を配布 だと思っている
可能性もあるのかと思ってさ。たしかに「要らない機能」が明確なそうかもしれない。

でもユーザーによる拡張を認める場合はフル機能が要るわけだしさー。Windows 界隈
でも「プラグインで拡張可能」とか拡張性は売りになる場合が多いみたいだし。

eval 云々は解放しなければいいだけだと思われ。そーゆう用途ならカスタマイズし
た機能制限インタプリタ or コンパイラを作るのが普通じゃないの?
0643デフォルトの名無しさんNGNG
>>642
なにを前提に「普通」と言ってるのかがわからないが。
拡張にもいろいろあるわけだし。
DLLを作成する様なプラグイン形式なら
LISPインターフェースを残す必要すらない。
0644デフォルトの名無しさんNGNG
拡張云々は >>640 前半へのレスで
「(セキュリティを気にしつつ eval が要るような場合は)
制限付きインタプリタやコンパイラを作るのが普通じゃないの?」
というのは >>640 後半の
> それよりアプリケーション側で下手にeval開放するとなると
> セキュリティとかの問題が出てくるわけだが。
への返事っす。
0645デフォルトの名無しさんNGNG
プログラマに配るのならいいけど、そうでない人に使ってもらう場合は、
Windowsでアプリケーションを配布する、といえば配布物のみで大体動く必要あり

perl や ruby 用のスクリプトをソース配布するのと変わらん
そりゃ、Windowsでも実行環境ある人はあるけどさーってこと
0646デフォルトの名無しさんNGNG
VBやC#やらと同様、ランタイムも一緒に配ればいいのよ。
setupでついでにインストールしちゃえばエンドユーザーは意識しないっしょ。
0647デフォルトの名無しさんNGNG
>>645
Windows の話だと、
- 商用:ACL, LispWorks, Corman は exe 出力可能
- フリー: CLISP なら処理系ごと配布可能
ただし ACL はランタイムライセンスが高価なのでダメポ。
でも Windows 用 CLISP は GDI インターフェースもまだ無いし、
実質 GUI が使えないので受けないだろうね。
0648デフォルトの名無しさんNGNG
CommonLispの実行環境は今のところxyzzyしかないのですが,
これでCGIを描くこと出来ますか?
0649デフォルトの名無しさんNGNG
遠い書き込みにレスつけてみる。

優秀な研究者であることに間違いはないと思うよ。
ただ企業家(起業家でもいい)としての能力/適正/本気度は疑問。
っていうより例の会社の状況見ればどんなもんかは想像つくと思うけど。
興味があるなら自分で確認してみるのが一番じゃない?
0650デフォルトの名無しさんNGNG
ですが、書くことは可能ですが、はっきりいってオススメはしません。
CGI はエディタの拡張としては方向性が違いすぎます。リクエスト毎に
起動するには xyzzy でも十分軽いとは言えないでしょうし、Web サーバー
からのリクエストを xyzzy に渡すプログラムを書くのも初心者にはハードル
が高いような気がします。

Lisp 慣れしていないならライブラリの充実度からいって
Perl や Python や Ruby を使ったほうが CGI には向いている
のではないでしょうか。それでも Lisp に興味があるならこの手の
用途には GNU CLISP がオススメです。というか Windows だと
実質的にこれしか選択肢がありません。
0651デフォルトの名無しさんNGNG
schemeだけどgaucheならWinでCGIできるよ
0652デフォルトの名無しさんNGNG
Cygwin が必要なんじゃなかったっけ?普通の Windows ユーザーには
CLISP 以上に敷居が高そうだけど…。
0653デフォルトの名無しさんNGNG
「Lisp系でCGIをWindowsでやりたい人」という括りで考えたとき、
CLISPよりGaucheのほうが有利な点ってどんなところかな?
日本語処理という点では、WindowsでもCLISPのiconvライブラリへのインターフェイス
が生きているとしたら、ほぼ同じようなもんだよね。

俺のロートルマシンでもCLISPは起動が速いし(一瞬)。

ライブラリ的なものの数とかかな?
0654デフォルトの名無しさんNGNG
日本語正規表現とか?
0655デフォルトの名無しさんNGNG
CLISPは、文字の内部表現がUnicode(たぶん)で、組み込みの正規表現ライブラリがあるし、
Perl互換のCL-PPCREもあるしね(たぶん文字型に作用するという抽象化された書き方だから、
Unicodeもサポートされていると思う。)...

ただキャラクタクラス指定で使う順番がUnicodeだろうから[亜-熙]で漢字一文字ねという
わけにはいかないかもしれんけど。

CLISP、Gaucheの両方とも、S式によって表現したHTMLファイルみたいなライブラリはあるよね。
0656デフォルトの名無しさんNGNG
CGIライブラリって、どっちもある?
0657デフォルトの名無しさんNGNG
>>655
CLISP + CL-PPCRE は激しく遅いというのを以前見かけたような…。
PCRE モジュールを使うほうが良いような気もするが、Windows だと
モジュールの作成もマンドクサなのかな?Win ではコンパイラが無いのが
普通だと聞くので Windows 向け標準配布物に PCRE があるかどうかだな。

まぁぶっちゃけ Cygwin が平気なら Gauche のほうが CGI に向いて
そうだが。CLISP で Web 系のプログラム作ってる人って居るの?
0658デフォルトの名無しさんNGNG
>>657
> CLISP + CL-PPCRE は激しく遅いというのを以前見かけたような…。
CLISP + 組み込み済みの正規表現ライブラリ VS CLISP + CL-PPCRE
では、あまり動作速度は変わらないとCL-PPCREの作者さんが言っていました。

> Win ではコンパイラが無いのが
> 普通だと聞くので Windows 向け標準配布物に PCRE があるかどうかだな。
え? とりあえず、CLISPの話だと想定します。CLISPのバイトコードコンパイラは
OSを問わずに動きます。現在、CLISPにネイティブコードコンパイラは存在しません。

> Cygwin が平気なら Gauche のほうが CGI に向いて
> そうだが。CLISP で Web 系のプログラム作ってる人って居るの?
具体的に、Gaucheの方が向いている点をあげてみていただけますか?

CLISPでウェブログツールを開発して、配っている日本人の方(か日本語が堪能な人)が
いらっしゃいます。
http://lambda.s55.xrea.com/
0659デフォルトの名無しさんNGNG
実際 CLISP + CL-PPCRE の ppcre:regex-replace-all とか遅いけど。漏れの言って
るコンパイラってのは C コンパイラで PCRE ってのはCLISP に附属のモジュールの
話。こっちなら速度的には十分のハズなんだがWindows ユーザーにコンパイルしてねっ
て言うのもねぇ。標準で付いてないと辛いよねって話。

> 具体的に、Gaucheの方が向いている点をあげてみていただけますか?
Builtin な正規表現とか標準ライブラリ rfc.uri, text.html-lite, www.cgi とか
0660デフォルトの名無しさんNGNG
>>659
レスありがとうございます。

> 実際 CLISP + CL-PPCRE の ppcre:regex-replace-all とか遅いけど。
なるほど。あとは、実用上それがどのくらい問題かですね。

> Builtin な正規表現とか標準ライブラリ rfc.uri, text.html-lite, www.cgi とか
web関連のライブラリが標準で付いているということですか。
clispでも探せばありそうな気もしますが、統一感には欠けますね。
0661デフォルトの名無しさんNGNG
めちゃ盛り上がってるなぁ。

ところで、「バッチファイル」でCLISPを動かすには
どうすれば・・・調べたがわからない。
つーか、「コマンドライン」て何なんだろう?
さすがにWIN+CLISP一週間ではきついよ・・・。
かえるか。
0662デフォルトの名無しさんNGNG
http://yougo.ascii24.com/gh/61/006110.html
0663デフォルトの名無しさんNGNG
以前Lispの勉強がてらclispでCGIを書いてみたことがあったんですが
うまく行きませんでした。

まずhtmlを生成するプログラムを書き、
(format t "Content-type: text/html; charset=EUC-JP~%~%")
を頭につけてコマンドライン上で実行してみたところ、
きちんと標準出力に結果がはきだされました。

で、いざサーバ上に置いてアクセスすると、何故かサーバエラーが起こってしまいます。
いろいろ原因を調べたところ、どうやら日本語を使うとエラーが出るようです。
Webサーバのエラーログを見たら
"invalid byte #x94 in CHARSET:ASCII conversion"
となっていました(#x94の部分は使った日本語の文字によって違う結果になりました)。

clispのFAQ("ttp://clisp.cons.org/faq.html#enc-err")に同様
の質問があったのですが、スクリプト単体では正常に動いているので
微妙に違うような気がします。
CGIって標準出力にはきだされた文字列をそのままブラウザに渡すだけじゃないんでしょうか?

あきらめて処理系だけgclに切り替えたらうまくいったんですが、
個人的にclispのほうが好きなので未だに解決方法を模索中です…
0664デフォルトの名無しさんNGNG
>> 658
このサイトはよろずやの人かな。
Lisp Resource KitとかはKNOPPIX通り越してMovitzベースに移行するとかイケる
ところまで逝っちゃって欲しい。面白そうだし。

それはそうとどなたかCMUCL+SLIMEで開発していてデバッグしているところの過程を
ムービーみたいのでデモしているのとか持ってないですか(ttyrecみたいな感じで)。
上級LISPERの作業過程を見て勉強したいと思っても、周囲にLISPで遊んでいる奴すら
いないから、自分のやり方がいいのか悪いのかも判断できないんですよね・・・
0665デフォルトの名無しさんNGNG
>>663
BOM?
0666デフォルトの名無しさんNGNG
>>664
> それはそうとどなたかCMUCL+SLIMEで開発していてデバッグしているところの過程を
> ムービーみたいのでデモしているのとか持ってないですか(ttyrecみたいな感じで)。
賛成。上級Lisperじゃなくてもいいから、俺はSLIMEのデモとしても見てみたい。

>>663
> "invalid byte #x94 in CHARSET:ASCII conversion"
> となっていました(#x94の部分は使った日本語の文字によって違う結果になりました)。
これは、CLISPが吐いているエラーメッセージですよね。そんで、出力用のエンコーディング指定
がASCIIなのに、日本語文字を構成する8bit目が立った1バイトを渡されて怒っていると、たぶん、
LANGやLC_ALLなどの環境変数が、スクリプト単体で実行している時と、サーバから起動されている
ときと違うのではないでしょうか。あくまで、これは俺の憶測です。
LANG=ja_JP.eucJPなどという環境設定をしてからWebサーバを立ち上げるか、
CLISPのスクリプト内で、出力ストリームのエンコーディングを明示的に、eucJPにするとかどうで
しょう...
0667デフォルトの名無しさんNGNG
>>663
>>666
たぶん、出力時に問題になっているのではなくて、スクリプトファイルを読み込むとき
にスクリプトに含まれる日本語が問題になっていると思う。サーバがLANG=Cやen_US.ASCII
など7bitの文字指定で、シェルがたぶんLANG=en_US.ISO-8859-1など8bitを通す指定なんでしょう。

ウェブサーバをLANG=en_US.ISO-8859-1 apache2などとして起動したほうが良い気がする。
0668デフォルトの名無しさんNGNG
いや、シェルは日本語ロケールを指定してあるか、正しく表示されているんだから。

起動時に細かくロケールを指定したいときは、
http://clisp.cons.org/clisp.html#opt-enc
に書いてあるように、-E オプションがいいかもね。
0669デフォルトの名無しさんNGNG
いまさらlispでつか?プッ
0670デフォルトの名無しさんNGNG
そうでつよ! ピッ
0671デフォルトの名無しさんNGNG
そういうことで!ポッ
0672デフォルトの名無しさんNGNG
>669 は恥ずかしい奴
0673デフォルトの名無しさんNGNG
ぼちぼちLISPだな。
0674デフォルトの名無しさんNGNG
wikiにちょっと書き足してきた。
ttp://www.komaba.utmc.or.jp/~flatline/wiliki.cgi?WiLiKi&l=jp
0675デフォルトの名無しさんNGNG
ただのリンク集になってるなぁ
まとめるとか言い始めた本スレのヤシは何やってるんだ
0676デフォルトの名無しさんNGNG
たぶん本スレのいいだしっぺの人は、「(誰か)まとめてくれ」と言いたかったんでしょう。
ま、俺はリンク集でもいいと思うけど。
0677デフォルトの名無しさんNGNG
さげね、サゲ、SAGE、サゲ、sage
0678デフォルトの名無しさんNGNG
>>666
ttyrec で試しに録画してみました。
emacs -nw だと ALT が効かなくて作業しにくい…
ttp://lambda.s55.xrea.com/files/slime_demo.tar.gz
kterm, xterm あたりなら再生できると思います。
デバッグはネタが考えつかなかったのでとりあえずパス。
- hello-world
- hyperspec-lookup
- 定番のフィボナッチ数列
- time マクロの出力を cl-ppcre を使って加工
です。やっぱ ttyrec だと見た目がイマイチですね。
X 版の Emacs + SLIME だともっとカラフルなんですが。
0679664NGNG
>>678
サンクスコ。いまttyplayが手元にないんで、データだけいただいておいて明日
仕事中に(ぉぃ)拝見させていただきます。
0680デフォルトの名無しさんNGNG
>>678 ありがとう。slimeは、lisp listenerとのやりとりから賢いことをやるみたいですね。
あと、slime起動時のascii animationみたいなのが面白い。こういう視覚効果を集めたemacsパッケージないかな。

俺はまだ、ilispなんですが、ilispって開発が止まっているみたいですよね。これからはSLIMEかな。
0681デフォルトの名無しさんNGNG
(>>678を見ながらいろいろ実験中に...)
CMUCL-18e@FreeBSD でバグって無限に再帰する fib (非末尾再帰)をコンパイ
ル後実行したら Ctrl-C でも kill -9 でも止まってくれなくて困った。マシ
ンがキリキリ言ってるし他のアプリは激遅になるし。

最後 core 吐いて死んだ。コンパイルしていないものは Ctrl-C で止まった。
何で止まってくれないの?うちだけ?

;; SBCL では CONTROL-STACK-EXHAUSTED で一瞬で止まった。
0682デフォルトの名無しさんNGNG
CMUCL-18e@Linuxでは、(defun f () (f))でコンパイル後、
3A: L0: JMP L0
と末尾再帰が無限ループになるため、実行しても何もおこりません。Ctrl-Cで普通に停止。

(defun f () (f) (print "Never reach here"))は、コンパイル後、実行したら
セグメンテーション違反でcmuclが殺されました。
0683デフォルトの名無しさんNGNG
>>681
試してみますのでコードみせてください。
うちでは >>682 の両方とも普通に停止できるみたいです。
環境: FreeBSD 5.2.1 + CMUCL CVS 2003-12-03
0684デフォルトの名無しさんNGNG
Linux 2.6.0 + CMUCL 18e
(defun f ()
(declare (optimize safety (speed 0)))
(f) (print "Never reach here"))
コンパイルせずに(f)をしたらしばらくしてcmuclが「強制終了」で終了。
コンパイルして(f)をしたらしばらくしてcmuclが「セグメンテーション違反です」で終了。
スタックを見張るスイッチか何かがありそうな気がする。

sbclは両方とも、以下のメッセージでデバッガに入った。宣言は関係なし。
debugger invoked on a SB-KERNEL::CONTROL-STACK-EXHAUSTED in thread 1986:
0685681NGNG
>>683
(defun fib (x)
(if (<= x 1) 1
;;(+ (fib (- x 1)) (fib (- x 2)))))
(+ (fib (+ x 1)) (fib (+ x 2)))))

そのマシンは家にあるもので今手元にないため再現するか確かめて
はいないのですが、上のようなコードだったように記憶しています。

>>682 さんの 2つ目のコードで大丈夫なら上のコードも多分問題は
ないように思うのですが。ということはうちの環境に問題ありそう
ですね。

環境について補足。
FreeBSD-4.9 STABLE + (portsの) CMUCL-18e

それと (defun f () (f)) のような末尾再帰版はうちでも Ctrl-C
で普通に止まりました。

;; うちのプロバイダはアクセス規制になっていたので結果の報告
;; など遅くなるかもしれません。

0686デフォルトの名無しさんNGNG
0687デフォルトの名無しさんNGNG
>>685
coredump 中は ^C や kill が効かないけど、それじゃない?
FreeBSD 4.x のデフォルトでは resource limit の datasize がかなり大きい
ので、オンメモリで動かせる程度に制限してやればいいかと。
0688デフォルトの名無しさんNGNG
キセイチュウ
0689681NGNG
>>687
ビンゴでした。
% limit coredumpsize 0
等して core のサイズを適当に制限すればよいようです。マシンが重くなるの
は 1G(!) の core を dump 中だったからのようです。

皆様ありがとうございました。


% ll lisp.core
-rw------- 1 name name 1329483776 Mar 11 19:55 lisp.core
% ll -h lisp.core
-rw------- 1 name name 1G Mar 11 19:55 lisp.core
0690デフォルトの名無しさんNGNG
>>684
19a には x86/sparc くらい限定ですが Stack overflow checking や Heap Overflow checking
が入ります。SBCL にはそーゆうのが既に入ってるのかな。
- (defun f () (f))
- (defun f2 () (f) (print "..."))
- バグ入り fib 無限ループ
を止める(stack check で止まる)シーンを slime_demo.tar.gz に追加しました。
独自ビルドの CVS 版なんで *features* も表示してます。以下 release-19a.txt の
Feature enhancements から抜粋。
- Stack overflow checking added for FreeBSD/x86, Linux/x86 and
Solaris. Code that makes the control stack overflow (for
example due to unbounded recursion) will lead to a
STORAGE-ERROR being signaled, instead of making CMUCL crash.
...
- Heap overflow checking for x86 and solaris with gencgc. When
the heap is close to overflowing, a heap-overflow condition is
signaled. If an overflow happens again while debugging the
condition, the user is returned to top-level without warning.
Use lisp::*reserved-heap-pages* to set the number of pages to
reserve.
0691デフォルトの名無しさんNGNG
キーワードパラメータがあると、何がいいのですか?
関数呼び出しが遅くなるだけのような気がします。
0692デフォルトの名無しさんNGNG
VBの名前つき引数みたいなもんだよ
0693デフォルトの名無しさんNGNG
そんな説明じゃイヤ! keywordに関して、SchemerはCommon Lisperを羨ましく思いますか?
0694デフォルトの名無しさんNGNG
>>693
schemeだからできないってわけじゃないんだが
0695デフォルトの名無しさんNGNG
>>694 R5RSにはなかったよね?「Cだからできないってわけじゃないんだが」と同レベル?
0696デフォルトの名無しさんNGNG
>>691
呼び出すときに引数を名前で指定できてウマーじゃん。
順序だけより人間に優しいじゃん。性能的にマイナスなのは
そうだけど。その場合も「つかわない」という選択肢も関数
作成者には与えられているので無問題では。
0697デフォルトの名無しさんNGNG
引数に nil nil nil nil t とか連続してたら嫌.
0698デフォルトの名無しさんNGNG
CommonLispってヴィジュアルな環境ないのですか?
VCちっくなものが欲しい・・・
0699デフォルトの名無しさんNGNG
visual
【形】 視覚{しかく}の、視力{しりょく}の、目に見える

slimeだな。
0700デフォルトの名無しさんNGNG
>>698 Allegro Common LispかLispWorksの体験版をみてみましょう。

>>691
foo(
 0,    /* object id */
 NULL, /* docstring */
 10,   /* value     */
 this  /* subject   */
 );
というようにCでは引数が多くなって分かりづらくなると、個々の引数が何を表すのかコメントを
つける事がよくあるけど、各引数に付けるコメントを、言語処理系からただ無視されるだけの
存在から、言語の構成要素にまで昇格させたのがキーワードパラメータです。
(foo :object-id 0 :docstring nil :value 10 :subject this)
0701デフォルトの名無しさんNGNG
>>695 独自拡張で使える奴がある。OO用にCLOSもどき付けてるのは大体そう。

R5RS だと :keyword も シンボルなんで不定長の引数をとるようにして自前で
処理。

0702695NGNG
>>701 ありがとうございます。Cよりはましなサポートがあるんですね。 スレ違いなのでこのへんで消えます…
0703デフォルトの名無しさんNGNG
>>678 の他に作業風景見せてくれる人居ないかなー。
括弧って最後にまとめて閉じるのが普通なの?
C とかでは先に対応する {} を書いちゃってから
中身を書いていってたんだけど。
0704デフォルトの名無しさんNGNG
http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Scheme%3a%a5%b3%a1%bc%a5%c7%a5%a3%a5%f3%a5%b0%a5%b9%a5%bf%a5%a4%a5%eb#H-ncdi3f
0705デフォルトの名無しさんNGNG
とりあえず、置いておきますね。


      , - 、, - 、
   , - 、i'・e・ ヽ,,・ァ, - 、
  4 ・   ゝ - 、i'e・ ヽ、・ァ
  ゝ   i e・  ヽ、 ,,.-''´|
 |`"''-,,_i   ,,.-''´    |
 |    "'''i"    ,,.-'"
 `"''-,,_.  |  ,,.-''"
     "'''--'''"

0706デフォルトの名無しさんNGNG
>>705
おまえ、uzuraか?
捨て子はよくないぞ
0707デフォルトの名無しさんNGNG
先人のお知恵を拝借したく。

CLikiでXMLを検索するといくつかライブラリが見付かるのですが、Lisp&XMLの初心者でも
手っ取り早く扱えるのってどれですか? XML文書は普通どんな感じで処理されるのかとかいまいち
理解できてないのですが、やりたいことはOAI-PMHのクライアントを作ることです。
レスポンスが全部XMLで返ってくるのでこいつの扱い方を修得しなきゃいけないなぁ、と思って
全然真剣に取り組んでなかったXMLについて入門レベルから勉強しているところ。
0708デフォルトの名無しさんNGNG
昔の人に訊いてるんですか?
0709デフォルトの名無しさんNGNG
nil
0710デフォルトの名無しさんNGNG
(昔の人に訊いてるp)
0711デフォルトの名無しさんNGNG
XMLの処理用ライブラリで処理方法による、おおまかな違いといえば、
あるXML elementを認識するたびに、プログラマが登録しておいたコールバック関数を
呼び出して逐次的に処理するというもの。次は、W3CのDOMみたいに、一度、
プログラム言語がサポートしているデータ型のデータ構造としてXML文書をメモリ内に
作ってしまうもの。他にもう1つくらいあったけど忘れた。

XMLとS式との親和性の良さから、DOMみたいに、一度、メモリ内にXML文書の
データ構造を作ると、いろいろ、変形とか処理を加えるのは楽そう。
ただし、XML文書の大きさが百メガとかだと、苦しいこともあるかも。

すでにあるCommon Lisp用XMLライブラリの紹介できるひとプリーズ。
0712デフォルトの名無しさんNGNG
>>710
紅茶。
0713デフォルトの名無しさんNGNG
>>666
>>667
>>668

レス遅れましたが、無事解決しました!
本当にありがとうございました。

原因はやはりサーバ側のロケールにあったようで、
色々調べたあげく、cgiを置いてあるディレクトリの
.htaccessファイルにLANG=ja_JP.eucJPと指定して試したところ
うまくいきました。

-Eオプションも試してみたのですが、*default-file-encoding*が
EUC-JPになっているのにも関わらず、なぜか以前と同じエラーが出てしまいました。


0714デフォルトの名無しさんNGNG
>>713
> .htaccessファイルにLANG=ja_JP.eucJPと指定して試したところ
> うまくいきました。
その手があったか、めでたし、めでたし。

>>711
以下の文書では、5種類くらいあると言っています。
What's Wrong with XML APIs
http://www.artima.com/intv/xmlapis.html
Common LispでXMLライブラリを書く/選ぶときは、参考になるかも。
0715デフォルトの名無しさんNGNG
Practical Common Lisp (public review)
>This page, and the pages linked to by it, contains the work-in-progress
> of Practical Common Lisp which will be published by Apress some time
> this year (2004).
http://www.gigamonkeys.com/book/

最近、Lisp関連の本がまた出版されるようになったと思う。
たしか、Successful Lispも出版されると聞いたし、
Paul GrahamのLispワショーイエッセイ集も発売されるとか。
0716デフォルトの名無しさんNGNG
復活
0717デフォルトの名無しさんNGNG
716 名前:デフォルトの名無しさん[sage] 投稿日:04/03/25(木) 15:25
時代がLispに追いついた

717 名前:デフォルトの名無しさん[sage] 投稿日:04/03/25(木) 16:41
Paul Grahamさんからエッセイ集の推薦文をたのまれたと、
Rubyのまつもとさんの日記にあったな。
0718デフォルトの名無しさんNGNG
718 名前:デフォルトの名無しさん[sage] 投稿日:04/03/25(木) 16:44
>>715 ぜんぶオンラインで読めてしまうところが、時代を感じるな。
0719デフォルトの名無しさんNGNG
みなさん お元気?
0720デフォルトの名無しさんNGNG
schemeじゃなくてCommonLispを使う利点て何よ?
0721デフォルトの名無しさんNGNG
ライブラリが幾分かマシ
0722デフォルトの名無しさんNGNG
本スレじゃなくて初心者スレを使う利点て何よ?
0723デフォルトの名無しさんNGNG
初歩的な質問をしたときの煽りが幾分かマシ
0724デフォルトの名無しさんNGNG
本スレだけだった頃は煽りなんて無かった気がするが
0725デフォルトの名無しさんNGNG
(a b c)を返すcons式を3通り示せ

>(cons 'a '(b c))
(a b c)
>(cons 'a (cons 'b (cons 'c nil)))
(a b c)

もう一つは何ですか?
0726デフォルトの名無しさんNGNG
(cons 'a (cons 'b '(c))) ?
0727デフォルトの名無しさんNGNG
すげー
頭いいね
0728デフォルトの名無しさんNGNG
今SBCLのuser manualを読んでいるのですが、
make-alienしたオブジェクトは、GCで回収されるのでしょうか?
明示的にfree-alienする必要がありますか?
0729デフォルトの名無しさんNGNG
manualに書いてないのか
0730デフォルトの名無しさんNGNG
FFIの章を一通り読んだのですが、はっきり書いてないんですよね。読み落としたのかもしれないのですが。

付属のモジュール(sb-bsd-sockets/malloc.lisp)を見るとfinalizationでfree-alienするmallocという関数が定義してありました。
やはり手動でfreeしないといけないみたいですね。
で、このmalloc関数を使うとGCと同時に解放されるということみたいです。
(in-package :sb-bsd-sockets-internal)なんてケチなこと言わなくていいのに。ぶつぶつ。
0731デフォルトの名無しさんNGNG
Clispをエディタから操作するにはどんなエディタなら可能ですか?
XYZZYみたいにエディタ上からコンパイルしたいのですが。
0732デフォルトの名無しさんNGNG
emacs+ilisp or slime?
0733デフォルトの名無しさんNGNG
emacs + inferior-lisp-mode
C-x RETlisp-macroexpand-sexp
C-x C-elisp-eval-last-sexp
C-c C-vlisp-show-variable-documentation
C-c C-flisp-show-function-documentation
C-c C-dlisp-describe-sym
C-c C-alisp-show-arglist
C-c C-klisp-compile-file
C-c C-llisp-load-file
C-c C-clisp-compile-defun
C-c C-rlisp-eval-region
C-c C-elisp-eval-defun
C-c C-zswitch-to-lisp
0734デフォルトの名無しさんNGNG
proclaimとdeclaimの違いについて教えてください。
前者が関数、後者がマクロで、前者は実行時のみ、後者はコンパイル時にも効果を持つということみたいですが

(eval-when (:execute :compile-toplevel :load-toplevel)
(proclaim '(special *x*)))

が (declaim (special *x*)) と同等と考えていいんでしょうか。

コンパイラにとっては実行時のproclaimは意味なしに思えるのですが合ってますか?
0735デフォルトの名無しさんNGNG
731です。
>>732
SLIMEを調べてみました。使いやすそうな雰囲気ですが
これってLINUXとかしか使えんのでわ?
0736デフォルトの名無しさんNGNG
>>735
ほらよ
http://home.comcast.net/~bc19191/blog/040315.html
0737デフォルトの名無しさんNGNG
>>734
>コンパイラにとっては実行時のproclaimは意味なしに思えるのですが合ってますか?
たぶん合っていると思います。
compile-fileやcompileの処理対象であるコードの中に出てくるproclaimの効力は、
その場では発揮されません。コンパイルされたコードがloadやevalされたときに効果を発揮します。
0738デフォルトの名無しさんNGNG
slime って言ったら、これ既出でしたっけ? マニュアルのドラフトみたいだけど。
ttp://www.bluetail.com/~luke/misc/lisp/slime.pdf
0739デフォルトの名無しさんNGNG
>>738
おい、スレ間違ってるぞい。
0740739NGNG
そうでもなかったか。スマソ。
0741738NGNG
本スレに張ったほうがよかったかな……
と思って久しぶりに見てみたら貼られてますな。3回。
0742デフォルトの名無しさんNGNG
初めて一週間の初心者です。
XLISPでlistの中のatomの数を数えたいんです。
下のようにlistの中のatomだけを抜き出してリストにすることはできました。

(DEFUN F1(L)
(COND((NULL L) NIL)
((LISTP(CAR L))(F1(CDR L)))
(T (CONS (CAR L)(F1(CDR L))))
)
)

このコードを実行すると次のようになります。

(F1 '((A B) C D (E F) G))
(C D G)

後はこれをlengthで数えるだけだと思うのですがそのやり方が分かりません。
それとももしかしてSETQで変数を設定して
Tのところで値を1つずつ足していって数えるのでしょうか?
お分かりの方、どうか教えて下さい。
0743デフォルトの名無しさんNGNG
(+ 1 (length (cdr l)))
0744デフォルトの名無しさんNGNG
ありがとうございます。
ああやって数を数えるんですね。
お答えを基にして修正してみました。

(defun f1(l)
(cond((null l) nil)
((atom(car l))(+ 1 (length(cdr l))))
(t (f1(cdr l)))
)
)

そして実行…

> (f1 '((a b) c d (e f) g))
4

CとDとGの三つなので"3"が返ってくると思ったのですが
なぜ4なのでしょう? うーむ…。
0745デフォルトの名無しさんNGNG
コードが変質してしまっているよ。
>>744は、「最初のatomが出たら残りのリストの長さを返せ」になってしまっているから、こうなる:

(f1 '(a (b 1))) => 1
(f1 '(a (b 1) (c 2))) => 2
(f1 '(a (b 1) (c 2) (d 3))) => 3

>>742のf1を使ってatomの数を数えるのは二通り考えられる。
a. f1の戻り値のリストの長さを数えるf2を作る。
b. f1にそれまで出てきたatomの数を表す引数を増やす。f1を最初に呼ぶときには0を入れることになる(そういうf2を作る)。
0746742NGNG
>>745

ありがとうございます。いろいろ考えた末

(defun f1(l)
(setq ct 0)
(cond((null l) nil)
((atom(car l))(+ 1 (length(cdr l))))
(t (f1(cdr l)))))

…とかやろうと思ったのですが、これ以上浮かびませんでした。
それと今回はf1だけで処理しないといけないのです。
Common LISPの本をめくってみるとこういうのがありました:

> (defun f1(ls)
(cond ((null ls) 0)
((atom ls) 1)
(t (+ (f1 (car ls))
(f1 (cdr ls))))))
f1

これだと低いレベルのリストの中のatomまで全部数えてしまいます。よって

> (f1 '((a b) c d (e f) g))
7

となります。低レベルのリストを無視するにはどうすればよいのでしょうか?
(質問しながら僕もやってみます。)
0747デフォルトの名無しさんNGNG
(defun hoge (l)
(length (delq nil (mapcar #'atom l))))
(hoge '(a b (c d) e))
=> 3
0748デフォルトの名無しさんNGNG
(defun f1(l)
(cond((null l) 0)
((atom(car l))(+ 1 (f1 (cdr l))))
(t (f1(cdr l)))))
0749742NGNG
…と言っていたら三分でできました。(~o~)

> (defun f1(ls)
(cond ((null ls) 0)
((atom ls) 1)
((listp (car ls))(f1 (cdr ls)))
(t (+ (f1 (car ls)) (f1 (cdr ls))))))
F1
> (f1 '((a b) c d (e f) g))
3
> (f1 '((a b) c d (e f) g (h i)))
3
> (f1 '((a b) c d (e f) g (h i) j k))
5
> (f1 '((a b)))
0
> (f1 '(a b))
2
> (f1 '(a))
1
> (f1 '())
0

僕ももっと賢くなりたいです…
ご協力ありがとうございました!!!
0750デフォルトの名無しさんNGNG
>>747
delqって二つ以上を消してくれるの?
0751742NGNG
あ、僕が投稿する前にもうレスをいただいてたんですね。

>>747

すみません、XLISPを使っているもんですからdelqが使えませんでした。
> (defun hoge (l)
(length (delq nil (mapcar #'atom l))))
HOGE
> (hoge '((a b) c d (e f) g))
error: unbound function - DELQ

>>748

僕のヴァージョンよりも短くてかつ同じ動作をしますね。
そちらの方がより正統派っぽいです。
そちらを採用させてください。m(__)m
0752デフォルトの名無しさんNGNG
>>742
今さらかもしれませんが・・・
(defun f5 (l)
(reduce #'(lambda (x y) (if (atom y) (incf x) x)) l :initial-value 0))
0753742NGNG
すみません、XLISPを使っているのでincfが使えませんでした。

> (defun f5 (l)
(reduce #'(lambda (x y) (if (atom y) (incf x) x)) l :initial-value 0))
F5
> (f5 '((a b) c d (e f) g))
error: unbound function - INCF
>

今回はXLISPと指定されているんです。
ここはCommon LISPスレだと知っていたのですが
他にLISPのスレが見つからなかったので質問しました。
ありがとうございました。

>>715

Paul Grahamって誰だろ?と思っていたら先週借りてきた本の著者でした。
ANSI Common Lisp (1996)
そんな有名な人の本だったのか。まだ読んでませんが。
0754デフォルトの名無しさんNGNG
突っ込まれそうなので先に断り書きしておくと、宿題じゃありません。
PAIPのExercise 1.4[m]で小一時間悩んだ挙句に解答を覗き見しても納得がいかないので
どなたかに解説をお願いしたいのですが、お題にあるように`expression'と表現されたら
consは含まないのが定説ですか?
(count-anywhere '(a) '(a ((a) b) a))
とかするとcdr再帰のケツの方で余計なカウントアップが入るので正しい結果が得られないの
ですが。
0755デフォルトの名無しさんNGNG
問題と答えを書いてくれたら解説できると思う。
0756デフォルトの名無しさんNGNG
悪い、間違ってあげちゃったよ
0757デフォルトの名無しさんNGNG
「lisp入門」ってどうなのよ。
0758デフォルトの名無しさんNGNG
入門って書いてあるんだから、
入門に向いてるんじゃないかな。
0759754NGNG
PAIP pp.31 Exercise 1.4[m] Write a function that counts the number of
times an expression occurs anywhere within another expression.
Example: (count-anywhere 'a '(a ((a) b) a)) => 3

Answer 1.4
(defun count-anywhere (item tree)
"Count the times item appears anywhere within tree."
(cond ((eql item tree) 1)
((atom tree) 0)
(t (+ (count-anywhere item (first tree))
(count-anywhere item (rest tree))))))

typoしてないといいんですが。itemにリストが渡されたとき正しい結果にならないのではと
考え中。まだ自分で納得行く解答を導き出せてませんです。ハイ。
0760デフォルトの名無しさんNGNG
treeとして見てるんだから、それでいいんじゃないの?
0761デフォルトの名無しさんNGNG
>>754
>consは含まないのが定説ですか?
結論から言うと定説なんてない。
真実は書いた著者にしかわからないだろ。
0762754NGNG
> 755, 760, 761
レスどうもです。
それではこの問題はすっ飛ばして(consを考慮しないなら話は簡単)先を急ぐとします。
Chapter 2を読み終わったところなんですが、すごく楽しいです。この本。
0763デフォルトの名無しさんNGNG
あのさ、今更こんな事聞くの恥ずかしいんだけど、括弧()を入力するのに
Shift+8/9で入力するのだるくない?
キーバインド変えたりしてる?
0764デフォルトの名無しさんNGNG
キーバインドは変えてない。もう慣れたけど、言われてみれば、
シフト無しで入力できる[]とかと最初からキー配置の設定が入れ替わって
いれば、少しは、楽だったかも。でもそうすると、小指を使うからそれほど楽じゃないか…
0765デフォルトの名無しさんNGNG
C とかで {} 打つのもダルいんで、Smalltalk とか [] なのは結構良いのかもと
思ったり思わなかったり。まぁ Lisp とは括弧の量が違うけど。
0766デフォルトの名無しさんNGNG
一時期キーバインド変えてたよ。
@ -> (
[ -> )
1ヶ月で戻したが。
0767デフォルトの名無しさんNGNG
ttp://www.abstractscience.freeserve.co.uk/symbolics/photos/IO/
0768デフォルトの名無しさんNGNG
JIS配列のマシンとASCII配列のマシンと行ったり来たりしてると()をタイプするのに89の上だったり90の上だったりで
時々ミスするんだよなぁ(w

なんか変な記号がタイプされてて鬱になる瞬間
0769デフォルトの名無しさんNGNG
CLISPをIEから呼ぶことはできますか?
0770デフォルトの名無しさんNGNG
CL-HTTPのWINDOWS版がダウソできない・・・
0771デフォルトの名無しさんNGNG
やっぱり落とせない。
FTPが応答不能になっている。
・・・・・・・何故に(泣)

lispでHPが作ってみたいのにぃ・・・
0772デフォルトの名無しさんNGNG
>>LISPでHP
cgiをLISPで書くってこと?
LISPが使えるサーバーを自分で立てたの?
0773デフォルトの名無しさんNGNG
きっとLispでhttpサーバとcgiサーバ建てたんだよ。
0774デフォルトの名無しさんNGNG
単純にtomcatのようにクライアントサーバとして使いたいだけなんです。
でも落とせないです。なんでなんだろう。
0775デフォルトの名無しさんNGNG
>>772-773は

>>770にCL-HTTPと書いてあるのを気付いていない罠
0776デフォルトの名無しさんNGNG
FTPに繋げないのは、どうやら接続許可がないかららしい。
では許可を取ればいいわけだ。

どうやってよ・・・・・・・・?
0777デフォルトの名無しさんNGNG
>>776
まず徳を積むことだ。
というわけで恵まれない俺に5万円寄付してくれ。
0778デフォルトの名無しさんNGNG
>>773 そういえばLispachなんてものも…
0779デフォルトの名無しさんNGNG
>>775は>>770に>
lispでHPが作ってみたいのにぃ・・・
と書いてあるのを気付いていない罠
0780デフォルトの名無しさんNGNG
あの、殺伐としているところ申し訳ないのですが、今までWindowsで
xyzzyをつかっていたのですが、Linux上で使いたいと思ったのですが、
KNOPPIXってLISP処理系もってますか?
0781デフォルトの名無しさんNGNG
emacs?それとも釣り?
0782デフォルトの名無しさんNGNG
すいません。いつも学校でvimつかうので思いつきませんでした。
CLISPとかを指したつもりでした。
0783デフォルトの名無しさんNGNG
Lispの開発スタイルについて解説したページはないでしょうか?
コンパイルして、あやしげなところの手前でブレークポイントで止めて、値を見つつステップ実行させて……というのと何だか違いそうなので、
普通Lisperはどのようにしているものなのか知りたいのです。
0784デフォルトの名無しさんNGNG
>>782
KNOPPIXにcmucl, acl, lispworksと入門書(英語)を入れたLisp Resource Kitはどう?
http://www.common-lisp.net/project/lisp-res-kit/

>>783
> あやしげなところの手前でブレークポイントで止めて、値を見つつステップ実行させて
compile, break, step, eval, inspectあたりを使えば、それに近いことができます。
0785デフォルトの名無しさんNGNG
>>783
私は完全にボトムアップですね。
一気に書き下してからデバッガでちまちまやるなんてことは無いです。
S式を一つ書いては実行して、一つ書いては実行して、塊に出来そうなら名前をつけて固めて、の繰り返し。
その作業の間はインデントめちゃくちゃ。
一通り出来上がったらインデントをズバッとキメて完成。
0786デフォルトの名無しさんNGNG
>>783-785
おれもボトムアップだな。関数を書いて関数単位でコンパイルして(Emacsのキー
バインドで)、テストコードを(関数のコメント部分に)書いて、その S 式にカー
ソルをあわせて評価(これも Emacs のキーバインドで)。で、エラーがあれば
デバッガが起動するのでスタックやローカル変数を見て関数を修正、そしてま
た関数をコンパイル... の繰り返し。リスナはあんまり使わずに、ソースコー
ド上でほぼ作業してる。

で、ほとんど完成したあとでバグがみつかった場合に trace や step をたま
に使ったりもする。

あとは、十分テストした後に、プロファイラの結果を見ながら必要に応じて
declare やら the などを埋めこんでく。

あ、作業中もインデントは常にちゃんとしてる、インデントしてないとコード
読めない人なので。
0787デフォルトの名無しさんNGNG
岩波コンピュータサイエンスのCommonLISPの本の付録にデバッグの
例が出てたよ。
自分はまだblockあたりでうろうろしてるから読んでもわからない…
0788783NGNG
>>784-787
みなさんありがとうございます。
ボトムアップでちょっとずつ確かめながら書く人が多いようですね。

>>784
> compile, break, step, eval, inspectあたりを使えば、それに近いことができます。

stepやbreakは使ってみたのですが、修行が足りてなくてまだうまく使えません。
SBCLだとstepできないし……。CLISPはバイトコードなインタプリタだからか、stepなどは使いやすかったです。
ブレークポイントはデバッガでかけるよりもソースに(break)を埋め込んで評価し直させるという感じなのでしょうか。

>>786
リスナって何ですか?
ぐぐってみてもよくわからなかったのですが別のポートに開けておく作業用REPLコンソールみたいなものかと思ったのですが。

>>787
ありがとうございます。近くの本屋にあるかな……探してみてみます。
0789デフォルトの名無しさんNGNG
>リスナって何ですか?
listenerと綴って、いわゆるREPループのことです。
0790デフォルトの名無しさんNGNG
>>784
面白そうですね。早速DLしてみます。(ISDNなんで2日がかり)
アレグロが入っているようなんですが、これって新日鉄のなんでしょうか?
0791デフォルトの名無しさんNGNG
そう来たか。確かに日本では新日鉄のバカタレがぼってるけどAllegro CLって
Franz Inc.のもんでしょ。で実際にACL入ってるよ>Lisp Resource Kit.
漏れはいろんなドキュメントがまとめられてるのが嬉しかったな。
0792デフォルトの名無しさんNGNG
http://lambda.s55.xrea.com/files/webapp.lisp.txt

WINDOWS XPじゃ動かないじゃん・・・
0793デフォルトの名無しさんNGNG
>>791
>日本では新日鉄のバカタレがぼってるけど
ぼられてたのか…
いや、地元だし、高炉の制御に人工知能とか使ってるらしいので、
なんとなく安心感のようなものが…(社員じゃありませんよ)
0794デフォルトの名無しさんNGNG
間に立ってマージン取ってるだけだろ。
0795デフォルトの名無しさんNGNG
>>792
うーん、それだけではよくわかりませんが、CLISP 2.33 使ってます?
UTF-8 が〜ってエラーの場合は
lisp.exe -E ISO-8859-1 -M lispinit.mem
みたいに起動時にエンコーディング指定すればなんとかならないでしょうか。
0796デフォルトの名無しさんNGNG
>>788
私は step はほとんど使いませんね。trace やバックトレース時にフレームに残った
情報を参考にデバッグします。私もそうでしたが、C/C++, Java 等から Lisp に入る
人はまず lispy な開発プロセスに慣れるとよいと思います。

一関数はなるべく短く(できれば一画面以内)、長い場合は flet や labels で内部的に
分割して考えるのでデバッグも楽です。とりあえず動かしてからデバッグ、ではなく動く部品
(関数)を組み合わせてプログラムしてゆく感じです。ほとんどの作成単位は小さく、Lisp の
単純な計算モデルの効果もあってステップ実行する必要は(今は)感じません。

;; 昔は step の使えなさに愕然として、 Lisp のデバッガなんて駄目じゃん!と思ってました。
0797デフォルトの名無しさんNGNG
>>796
おれも関数短い。で必然的に関数が多くなってしまって、関数の名前を考
える時間が長い。うまい関数名が思いつかないような関数は、大抵、おか
しな部分があって、再考する必要があるという法則(?)を発見しました。
0798デフォルトの名無しさんNGNG
サンマルコ・リスプ探検隊ってまだあるのかな?
ところで、誰かLISPマシンの事話せるスレとか知らない?
0799デフォルトの名無しさんNGNG
前者は知らん。後者は本スレでいいんじゃない。
0800デフォルトの名無しさんNGNG
Lispマシンをさわったことないので、Lispマシンのすごさを誰か紹介してくれないかなぁ。

step的な機能(emacsのedebug)は、俺の場合、他人が書いたコードを手っ取り早く理解するときに
便利に使っています。まさに、処理の「動き」が目に見えるので、理解が速いです。
0801デフォルトの名無しさんNGNG
>>798
今でもLISPマシンってあるの?
なんかミニコン時代の物のような印象なのだけれど。

>>800
メモリ空間が広いとかバスがどうとか。
青山学院大で作ってたらしい。
今のPCでLISPつかってて実行に支障が出たことってある?
0802デフォルトの名無しさんNGNG
>800
とりあえずTAOのマニュアルでも
http://www.nue.org/nue/nue.html#tao-manual
0803デフォルトの名無しさんNGNG
ピアソンの奴って練習問題の答えどこにもないんですか?
0804デフォルトの名無しさんNGNG
Emacs Lispスレに追いやられそうな気がするけど勇気を出してここでお願いしてみます。
どなたかEmacsのlisp-indent-function (or common-lisp-indent-function)の
解説をしていただけませんか。CMUCL+SLIMEでコード書いてますが、でっちあげたマクロの
インデントを調整したいのです。
0805デフォルトの名無しさんNGNG
(put 'マクロ名 'lisp-indent-function ; or 'common-lisp-indent-function
'設定)
info の (emacs)Lisp Indent を参照。
0806デフォルトの名無しさんNGNG
>> 801
> 今でもLISPマシンってあるの?
> なんかミニコン時代の物のような印象なのだけれど。
現在、開発が進行している売り物としてのマシンは俺の知る限りないと
思います。昔のマシンを販売している人(会社?)はあるみたいです。

> メモリ空間が広いとかバスがどうとか。
> 青山学院大で作ってたらしい。
> 今のPCでLISPつかってて実行に支障が出たことってある?
ハード的なすごさもあるのだろうけど、ソフトウェア開発環境としてのすごさが
知りたいです。Lisp OSの凄さかな。ハードの話で言えば、ちょっと前、昔のLispマシンと
Pentium PCマシンでベンチマークをしたら、Pentiumマシンが勝ったけど(クロックが10^n倍違うはず)、
思った程Lispマシンは遅くなかった(専用ハード恐るべし)という事を話している人が
いました。

スレ違いぎみでごめん。
0807デフォルトの名無しさんNGNG
やさしいLisp入門
http://www.cutt.co.jp/book/4-87783-102-9.html

Lispとありますが、Common Lispの事だそうです。
本スレでも話題になったようですが、感想をどなたか読んだ方、お聞かせ願えませんか?
初心者にすすめて問題ないでしょうか? あと、Paul GrahamのANSI Common Lispとの比較とか。

良い本なら売れればいいな…
0808デフォルトの名無しさんNGNG
Lispだったらメモリで差がでるんじゃない?

素のPentiumはメモリとのやりとりは33MHzかな?
それをCPUでは5倍にしてると166MHzになる。
仮にLispマシンがバス幅を倍にして、10MHzくらいの回路を組んでるとしたら
一見すると16倍の性能差がついてるんだけど、
33:20=1.6倍にしかならないから、あんまり遅くみえないみたいな。
0809デフォルトの名無しさんNGNG
>>807
とりあえずその本の感想。

まず最初に、私は
・Lispに関しては完全にド素人、Lisp=括弧言語という程度の認識
・Prologはいちおーガッコで勉強させられたけど馴染まなかった
・C/C++はメインで使っていて読み書きできる
という人です。

LispというとなまじCのような手続き型言語を知っているとどうも馴染みにくい
という感じだったのですが、そんな私でも一応「Lispとはなんぞや」というのが
分かったような気がします。
Lispとはどういう仕組みで動いているのか、ということが割と丁寧に書いてあるので
「ほー、Lispってこんななんだ」という納得はしました。

ただ、もっともそれでじゃあLispでなんかプログラム書いてみれ、といわれても
さすがにそこまでは…あくまで「Lispとはなんぞや」という程度で
具体的にプログラムが書けるようになるというところまでは難しそうですね。
有名なマクロなる機能に関する説明もまったくありませんし。

まあ、とりあえずLispとはなんぞやという第一歩を踏み出すには悪くない本だと思います。
ただし、あくまでそこまでですね。実際にLisp使って何かやるとなると、
もう一段上の「入門書」が欲しいところかなと思いました。
0810デフォルトの名無しさんNGNG
>>809
立ち読みしかしてないけど
400ページ以上も読んで何も作れないってのは
結構悲しいな。

もっと薄くてよい本があると思った。
俺も対話による〜しか読破してない初心者だけど。
現在グレアムの本を読書中。
0811804NGNG
>805
そこを参照してもわけわからん状態なので助けて欲しいわけで。
plistのlisp-indent-functionにシンボル設定すると引数5個で呼び出されるので
付属のドキュメントは信用してないです。ほんで暇を見ては.elをedebugで追いかけて
いるんですが・・・くじけるな。これは。
0812デフォルトの名無しさんNGNG
>>811
とりあえず、(get '適当な関数かマクロ名 'lisp-indent-function)
とかやって設定引っ張ってくればいいんじゃないかと。
0813デフォルトの名無しさんNGNG
なんかコンピュータ書籍というと共立か岩波くらいしか思いつかないのは頭が固まってるのだろうか。
0814デフォルトの名無しさんNGNG
>798
>サンマルコ・リスプ探検隊

これ?

http://www.personal-media.co.jp/book/other/jinkoutinou.html
http://www.google.co.jp/search?hl=ja&q=%22San+Marco+LISP+Explorer%22
http://www.google.co.jp/search?q=%22san+marco+associates%22
0815デフォルトの名無しさんNGNG
>>811 付属のドキュメントは信用してないです。
lisp-indent-functionは、lisp-mode.elで定義されていて、"(emacs)Lisp Indent"に
説明があると。common-lisp-indent-functionはcl-indent.elで定義されていて、説明はないと。

泥臭いけど、自作マクロと似たようなインデントになる標準マクロを探して、
設定を盗んでくるとか。あんまり力になれないな。
0816804NGNG
>812, 815
レスありがとん。
何だかイバラの道を進もうとしているような予感がしますが動くコードが手元にあるんで
やれるだけ頑張ってみますわ。折角気分がノッてきたときに妙なインデントされてテンポ
乱されるのもういやなんで。

板違いだけどMacOSXのターミナルも気分がノッてくると妙な「もっさり感」が気になって
げんなりするんだよなぁ・・・。デスクトップは非常に綺麗なんで好きなんだけど。
0817デフォルトの名無しさんNGNG
>>816
Terminalスレ@マク板あたりで聞くといいんじゃないかな?
iTermとか使う手も有りかもしれないし。

がんがってくらはい
0818デフォルトの名無しさんNGNG
MacでLispうらやましい。MCLは、MacOSXの最新API(cocoa?)にもう対応したのかな?
0819デフォルトの名無しさんNGNG
>>816
>何だかイバラの道を進もうとしているような予感がしますが動くコードが手元にあるんで
>やれるだけ頑張ってみますわ。
がんばってください。common-lisp-indent-functionの設定法の情報がまとまって、
気が向いたら、どっかで公開してくれればうれしいです。
短ければこことか、長ければ、wiki<http://www.komaba.utmc.or.jp/~flatline/wiliki.cgi>とか。
0820デフォルトの名無しさんNGNG
>>818
CocoaじゃなくてCarbon対応ってことでOSX対応版は出ている。
お値段は相変わらず(w
0821デフォルトの名無しさんNGNG
細かい値段の表示があるだけ、分かりやすい。Franzも表示すればいいのに。ってこれは既出ネタか。
0822デフォルトの名無しさんNGNG
>>814
学校でLISPの本を探していてそんな記述を見つけたのですが。
なんでもLISPの使い方を教えてくれるCAIソフトらしいのですが。

卒研でアソシアトロンをやることに。Cで書かされそうなんですが、
LISPでも書けますかね?教官を説得できる材料がない…
0823デフォルトの名無しさんNGNG
卒論くらいなら「好きだから」で構わんだろ。
0824デフォルトの名無しさんNGNG
教官がLispを読めるかどうかだな。
0825デフォルトの名無しさんNGNG
まがりなりにも卒論で教官がプログラムを読む必要はないだろ。
普通は理論が主でプログラミングは検証手段なんだから、
用があるのは出てきた結果(計算結果であれ、ソフトウェア自体の機能などであれ)だろ。

0826デフォルトの名無しさんNGNG
グレアム本の2章の練習問題にある、リストの中にある a を数える
の再帰verをやってみたんですがこんな感じでよいでしょうか?

(defun numA (lst &optional (rtn 0))
  (if (null lst) rtn
    (progn
      (if (eql 'a (car lst)) (incf rtn))
      (numA (cdr lst) rtn))))

opitin 引数部分は、補助関数にしたほうがいいのかな?
0827デフォルトの名無しさんNGNG
incf いらないよね
(numA (cdr lst) (if (eq 'a (car lst)) (+ rtn 1) rtn))
0828826NGNG
レスどうもです。
確かに、引数代入時に分岐させれば
必要ありませんね!

eq は、アドレスを比較して一致を調べる
ものと認識しているのですが
こういう場合にも使えるのでしょうか?

関数の中で直書きされた a のアドレス??
0829デフォルトの名無しさんNGNG
>eq は、アドレスを比較して一致を調べる
>ものと認識しているのですが
たぶんその認識で問題ないと思います。

>関数の中で直書きされた a のアドレス??
最終的にCPUが認識するのは、そうだけど(シンボルaの実体のアドレス)、
私の場合、コードを理解するときは、Lispの世界内だけで考え、
read後の状態、その次にそれをevalした後の状態という順番で考えます。
つまり、脳内インタプリタを作ってあるんですね。

(eq 'a (car lst))において、aのアドレスは、この式のread時に、
aがすでにinternされて(存在して)いれば、そのアドレスを持って来て、
未internならシンボルaが生成されて、それが使われます。

的外れな説明じゃないと、いいけど…
0830デフォルトの名無しさんNGNG
>>829さんの説明をもう少し冗長に書いてみると。

Lispのプログラムがインタプリタに読み込まれるときは、
まず最初にリテラルのリストに変換される。これをやっている関数は read

次にそのリストを関数やマクロ呼び出しのフォームとして評価する。
これをやってる関数は eval

そして呼び出された関数の返す値を印字する。これは print

このサイクルを REPL (read-eval-print-loop)という。

関数の中に直書きされた a のアドレスというよりは
'(eql 'a (car lst))
というリストの二番目の要素であるシンボルオブジェクトの
アドレスというほうが正しい。

0831デフォルトの名無しさんNGNG
'(eql 'a (car lst))

という表記はかなり変だったけど堪忍して下さい。
0832デフォルトの名無しさんNGNG
LISPってJAVAのように無名クラスってつくれますか?
0833デフォルトの名無しさんNGNG
↑餌
0834デフォルトの名無しさんNGNG
>>832
lispをなめるな。
#'lambda-classでできるわ!!
0835デフォルトの名無しさんNGNG
>>823-825
回答どうもありがとうございます。

なんかN88で書くことになりました…。
あと、LISPのフロッピーを探したらLISP/80しかありませんでした。
どうやら私はこのスレに居てはいけないようです…
0836デフォルトの名無しさんNGNG
>>832 おいしそうな餌だな。
無名クラスという概念はCommon LispのオブジェクトシステムであるCLOSに存在します。
ただ、無名関数のやりとりだけでだいたい用が足りてしまう気もします。

>>835 N88って98に付いてるBASICかな? 98用ならxlispというものがあったような。
0837デフォルトの名無しさんNGNG
まじで、closのanonymous classってどんな作り方するんだっけ?
CLHSのglossaryとclass-nameに記述が少しあるだけで分からん。
0838デフォルトの名無しさんNGNG
>>837
make-instance
0839デフォルトの名無しさんNGNG
無名クラス?
そんなものあったのか・・・。
どうやって作るの?
0840デフォルトの名無しさんNGNG
なんでそんなもん作りたいのかがわからん。動作をカスタマイズしたけりゃ
インスタンス向けに eql でメソッドを定義すりゃいいじゃん。
0841デフォルトの名無しさんNGNG
無名クラスは便利だよ。Javaで実感。
>>840はlambdaの便利さから類推する頭を持っていないのだろうか。
それともlambdaの便利さを理解していないのだろうか。

let+lambda*複数でもいいんだけど、ちょっとプリミティブすぎて。
意味的まとまりを与えられる無名クラスはけっこういい。
0842840NGNG
>>841
だったら例文書いてミロや
0843not 841NGNG
とりあえず、Common LispとJavaの無名クラスは使われ方が違うとおもう。

Common Lispの無名クラスは積極的に使うものではなくて、どちらかというと
そういう物ができてしまうこともあるという話だったような。defclassでは
定義できないし、make-instanceでのクラス定義の方法は処理系依存の部分があり
そうだし。

一度、Common LispだとJavaの無名クラスの機能をどうやって書くかなと考えた
ことがあるんだけど、結果は「同じようなことはCommon Lispなりの書き方で
綺麗にかける」だったと思ったけど、その過程の理屈をすっかり忘れちまったよ。

だれか、Javaの無名クラスを使ったコード片をここに書いてみてくれない?

>>841
> let+lambda*複数でもいいんだけど、ちょっとプリミティブすぎて。
> 意味的まとまりを与えられる無名クラスはけっこういい。
この書き方だと、たしかに抽象度が低いかも。
いわゆる「lambdaでオブジェクト指向の機能」を実装する話ね。
0844デフォルトの名無しさんNGNG
The Essence of OOP using Java, Anonymous Classes
http://www.developer.com/java/other/article.php/3300881
を読んでみた感じでは、

* instanceのmemberに対して設けられたアクセス規制をすりぬけるために使う。
例えば、あんまり関係の無いクラスAとBがあって、外部からのアクセスが規制
されているBのmemberを参照するようなAのメソッドを書きたい場合などに、Bの
定義内にAを継承する無名クラスを定義し、メソッドをその場でoverrideするとか。
CLOSでは、アクセス規制が非常にゆるいのと、slot-valueで全てのslotを
読み書きできてしまうので、あまり問題にならない。

* 特定のinstanceに固有の振舞いをするメソッドを定義したいときに使用。
>>840さんの言うように、Common Lispでは、eql specializerを使ったメソッドを
定義することで対応できる。
(method-for-foo (let ((instance (make-instance 'foo :slot1 slot1-form)))
                  (defmethod bar ((foo (eql instance)))
                    (something-specific-to-instance foo))
                  instance))

let以下をdefinstanceなんてマクロにするとか。
0845デフォルトの名無しさんNGNG
> let以下をdefinstanceなんてマクロにするとか。

それ欲しいでつ。
0846デフォルトの名無しさんNGNG
SLIMEでM-.したとき、defmethodで同名のものが複数あるとエラーになっちゃうんですが、うちだけ?
0847デフォルトの名無しさんNGNG
(defclass CA()())
(setq obj(make-instance 'CA))
(defclass CB(obj)())

こんなふうにインスタンスから型を取り出して継承とかってできますか?
0848デフォルトの名無しさんNGNG
IMHOとApacheをmod_lispで連携させる方法の詳細をレクチャーして欲しい。
mod_webapp使ってるけど妙なエラーが出て安定稼動できない・・・
プラットホームはDebian sidです。PortableAserve+WebActions使った方がいいのかな。
0849デフォルトの名無しさんNGNG
>>848
全然関係ないところですまんけど、
IMHO って in my humble opinion の abbrev 以外に、何かの固有名詞なの?
0850848NGNG
Internet Meta Humble Object at hxxp://alpha.onshored.com/lisp-software/
よろずやさんトコの開発途中のLisp Learning Centerのコード貰ってきて遊んでいるだけど
mod_webappがエラー吐いたり吐かなかったりで挙動不審なのでどうにかならんかなぁ・・・と。

PortableAserve+WebActionsの方が安定して稼働してるんだけど、規模が大きくなるにつれて
面倒になってきた。CLOSのオブジェクトどかどか並べてHTMLをレンダリングさせる方が個人的には
扱いが楽かなと思う。
0851デフォルトの名無しさんNGNG
>>847 できます。
(defmacro defclass-from-objects (name direct-superobjects direct-slots
                                 &rest options)
  `(eval (list* 'defclass ',name
          (mapcar #'class-of ',direct-superobjects)
          ',direct-slots
          ',options)))
本当は、closureが正しく処理されるように、evalを使わずに、ensure-classに展開するようにしたほうがよいでしょう。
ただそれだと、ポータブルに書けるかな?

(defmacro  defclass-from-objects  (name  direct-superobjects  direct-slots
                                                                  &rest  options)
    `(ensure-class
        ',name
        :direct-superclasses  (mapcar  #'class-of  ',direct-superobjects)
        :direct-slots  (list  ,@(canonicalize-defclass-direct-slots  direct-slots))
        ,@(canonicalize-defclass-options  options)))
こんな感じ。
0852848NGNG
個人的メモ(スレ汚しすまん)
Matthew DanishがTue, 7 May 2002 23:50:59 -0400にポストした[Lispweb] IMHO + mod_lispの
内容でIMHOにパッチ当てるとmod_lispで動作し始めた。でもそのスレッドは完結してないからまだ
問題は本質的には解決してないと思われ。
そのためかMacOSXのSafariからだと問題なく動作するけどWin2kProのOperaからだと
ウェブメソッドがほとんど機能しない、と。クライアントMacOSXで開発続けるかな。
0853846NGNG
自己レス。cvs updateしなおしたらできた。
0854デフォルトの名無しさんNGNG
日本語処理しやすくするために日本語も分かち書きにしようよ。
0855デフォルトの名無しさんNGNG
× 日本語処理しやすくするために日本語も分かち書きにしようよ。
○ 日本語処理しやすくするために日本語も S式にしようよ。
0856デフォルトの名無しさんNGNG
うわw それ日本語じゃねえ
斎藤某『声に出して読むS式』
0857デフォルトの名無しさんNGNG
vimが染み付いてるんですが、lispをやっても良いでしょうか?
あと処理系が色々多いんですが、Mac、Win、Unixで共通の
コードで動きますか?処理系に依存する部分がどれくらい
あるのか気になります。
0858デフォルトの名無しさんNGNG
>>857
emacsenでしかlispやっちゃいかん、っていう規則はないからいいんでない?
実際高機能なvi cloneがどの程度のものか知らないけどSLIMEとか慣れれば快適だよ。
Escape+Meta+Alt+Ctrl+Shiftが生理的に受け入れられないってのなら無理に勧めないけど。
Mac,Win,Unixで共通のコードで動くかってのはどこまでシステム寄りのコードを書くかに
依存するから言及は避けとく。CLISPとかAllegroCLのトライアルで実際試してみるのが一番かと。
SBCLもぼちぼちWinで動き出してるらしいけどもちょっと先の話みたい。
0859デフォルトの名無しさんNGNG
>>857
お約束ですが、こんな方もいらっしゃるワケで。

ttp://www.ksky.ne.jp/~sakae/sicp/schemers-vi.html

互換性はひとまず忘れて、各環境で一番良いもの(Mac なら OpenMCL)を
使うのが良いと思います。
0860デフォルトの名無しさんNGNG
Winで書いたコードをUnixで動かしたり、Macで動かしたり
したいので、互換性は譲れませぬ。うーむ残念・・・。
0861デフォルトの名無しさんNGNG
>>860
何を残念がってるのか知らんけど、とりあえずLispWorksでも試してみれば?
Unixって言ってるのが具体的に何なのかわからんのでLinux決め打ちですまんが。

>>859
OpenMCLってそんなにいい?MacOSXではCMUCLかACLしか使ったことないから使用感とか興味あり。
Uncommon Webで遊ぶのに導入しよっかな。
0862デフォルトの名無しさんNGNG
VIMを良く知らないので、EmacsでのLisp開発に用意されている便利な機能を
思い付くままに。
* 括弧の対応を教えてくれる。
* 括弧を基本とした編集、カーソル移動コマンド。
* 自動的なインデント。
* 構文を元にした、コードの色付け。
* CLHS(Common Lisp HyperSpec、つまり規格)のシンボル名での辞書引き。
* Lispと対話的なやりとりができる、listener。
* 現在、書いている関数が取る引数の個数や名前を自動表示。
* 関数名、変数名などシンボル名の補完機能。
...
0863デフォルトの名無しさんNGNG
>>860
> Winで書いたコードをUnixで動かしたり、Macで動かしたり
> したいので、互換性は譲れませぬ。うーむ残念・・・。
具体的にどんなコードを書きたいのかを言わないと、互換性については、言いにくいです。
グラフィックス、数値計算、入門書の練習問題、Web関連、スクリプティング、2chブラウザなど特定のアプリとか。

互換性を考える上での基準は、
・ANSI Common Lisp規格で定められている。
・コミュニティー規格やポータブルな実装がある。(MOP, CLIM, ...)
・特定の処理系が独自にサポートしている。(LispWorksのCAPIや、スレッド機能、...)
・自分でやるしかない。
などかな。
0864デフォルトの名無しさんNGNG
LISPでかかれたゲームって結構多いような。CUIのさめがめとか。
変な医者とか。
0865デフォルトの名無しさんNGNG
vi でも = で括弧のインデントしてくれるのか。知らなかった。
0866デフォルトの名無しさんNGNG
LISPの勉強をしようと思ったら、友人からいまどきS式じゃなくてXMLだろ、
などといわれたのですが、なんでS式の比較対象にXMLがくるのか
わかりません。XMLってセマンティックwebとかじゃないのでしょうか?
0867デフォルトの名無しさんNGNG
>>863 そういう考え方の他に、Windows, Linux(Unix), Macをサポートしている
単一ベンダの処理系をとことんあてにするという考え方もあるね。
3つのOSをサポートしている処理系はLispWorksとAllegro Common Lispかな。
0868デフォルトの名無しさんNGNG
>>866 S式もXMLも木構造を表すためのデータフォーマットと考えることができます。
あなたの友人はそういうレベルでの比較をしたのでしょう。

そういう意味において、S式でプログラムを表現するLispの比較相手を探すとしたら、
XMLでソースファイルを記述する言語が(もしあれば)それにあたるでしょう。

XHTML(HTMLの基盤はSGML)は、Webブラウザで表示するための要素を決めたXMLの
応用例(アプリケーション)の一つです。

プログラミング言語でXMLを扱うときに、XMLのベタテキストから、言語の内部で
扱いやすいデータ構造にまず変換する事が多いです。Lispでは木構造を表すためには
S式をほぼまちがいなく使うことになります。実際、XML<->S式の変換を行うライブラリも
(いくつも)存在すると思います。このとき、LispにはS式を操作するための関数群が豊富に
揃っており、Lispプログラマならそれらに習熟しているため、XMLデータの扱いはLispの
得意分野と言ってもよいでしょう。

セマンティックWebは私が現状を追っていないので、パス。
0869デフォルトの名無しさんNGNG
Lisp方言で書くと XSLT に翻訳してくれるようなトランスレータないですかXSLT 書くのが苦痛で。
0870デフォルトの名無しさんNGNG
LispでXMLを扱うとしたら、DOMとかXSLTとか全部パスできないのかな。XSLTってすでに無視できない存在?
0871デフォルトの名無しさんNGNG
>>866
The Evolution of Language
ttp://homepages.inf.ed.ac.uk/wadler/language.pdf
0872デフォルトの名無しさんNGNG
「Scheme は美しい」とよく言われるのだけど、それが何を指しているのか、
分からなかった。今日、その分からなかった理由に気付いた。

Common LISP を知らなかったからだ。
Scheme の美しさというのは、Common LISP に比べてのことだったんだ。

今、ここの
http://user.ecc.u-tokyo.ac.jp/~g340299/
『on Lisp』を読みはじめたのだけど、Common LISP で書かれた例文を
Scheme で試している。うちには Scheme の処理系しかないもので。

どの例文も Scheme で書くと、素人目にも美しくなる。素晴らしい!
ということで、どうせなら Common LISP, Scheme の両方を学ぶことをおすすめします。

もちろん、Common LISP は Scheme より実用的なわけで、どちらがすぐれているとか
言うつもりはないです。
0873デフォルトの名無しさんNGNG
俺は両方知っているけど、全般的に言って、どちらのほうが美しいとかあんまり感じた事は無いです。
Common Lispのコード例とそれを美しく書いたSchemeのコード例を見せてくれませんか?
煽りじゃないよ。純粋に興味があるだけ。
0874デフォルトの名無しさんNGNG
では 『on Lisp』16ページから

Common Lisp
(defun our-remove-if (fn lst)
  (if (null lst)
    nil
    (if (funcall fn (car lst))
      (our-remove-if fn (cdr lst))
      (cons (car lst) (our-remove-if fn (cdr lst))))))

Scheme
(define (our-remove-if func lst)
  (if (null? lst)
    '()
    (if (func (car lst))
      (our-remove-if func (cdr lst))
      (cons (car lst) (our-remove-if func (cdr lst))))))

・defun と違って、define は、呼び出しの形と実行の形が同じ
・条件式には全て「?」がつくので分かりやすい
・nil より () が分かりやすい

あと、この例には出てこないけど、Scheme だと #' が要らない、などなど。
0875デフォルトの名無しさんNGNG
Common Lisp
(mapcar #’+ '(1 2 3) '(10 100 1000))

Scheme
(map + '(1 2 3) '(10 100 1000))
---------------------------------------
Common Lisp
(sort '(1 4 2 8 5 7) #'<)

Scheme
(sort + '(1 4 2 8 5 7))

・先にも書いたけど、Scheme は #' が要らない
・引数のリストが、Scheme は どちらも関数が cadr に来るよう揃えられている

過去互換性を無視して、文法が首尾一貫するよう再構成したのが Scheme なのだなあ、と。
とりあえず、自分が感じたのは、こんなところです。
0876デフォルトの名無しさんNGNG
ありがとう。
変数と関数の名前空間を分けるか統一するかは、意見がいろいろだね。
分ける側の言い分を一つあげると、Schemeで、変数名としてlistなど
明解な名前が、すでに標準関数の名前に取られてしまっているという
点があるね。

俺は慣れたけど、いちいち(funcall f arg)と書くより(f arg)の方が
美しいとは思う。

>・条件式には全て「?」がつくので分かりやすい
あとは、破壊的な操作名の末尾に!を付けるとかか。
Common Lispにもpやnを付ける慣習はあるけど徹底してはいないかな。

>nil より () が分かりやすい
これは、Common Lispでもnilと()は表記上の違いだけで、同一物です。
0877872NGNG
>>876
ありがとうございます。
funcall について、私は書き忘れてましたね。
nil を廃して () のみにしたのが、Scheme の良い点の一つと思います。
cadddr といった表記の便利さがなければ、 car, cdr も別の名にしたんじゃないかな。

list については、正直、やっぱり Scheme は不便ですねえ。
名前空間の統一は、空間の混雑とも言えるわけで。

著者のポール・グレアム自身は、名前空間が同一の方がいいと考えているようです。

『on Lisp 』 P15
だから「Common Lisp には変数と関数に異なった名前空間がある.」と言える.foo と
いう変数とfoo という関数を両方持つことができ,それらは別々である必要もない.
この状況はややこしく,コードがかなり格好悪くなってしまうことにつながるが,
これはCommon Lisp プログラマが付き合っていかなければならないことだ.
0878デフォルトの名無しさんNGNG
普通なら、関数名は動詞、変数名は名詞なので、同一の名前空間であまり困らないような
気もするけど、listみたいに動詞と名詞の両方としての働きを持つ単語の数は多いのかな。
0879デフォルトの名無しさんNGNG
Common Lispは、関数、変数の他にも、パッケージ名、クラス名などの名前空間もあるよね。
Schemeを拡張していったときに、どこまで同一の名前空間でやっていけるかな。
0880デフォルトの名無しさんNGNG
Scheme と同じ問題を抱えているのが、多くのスクリプト言語です。
特に、JavaScript は
・関数と変数の名前空間が同一
・既存の変数(関数)名を上書き再定義しても、エラーにならない。
・静的スコープのクロージャが使える
など、事情が Scheme に良く似ています。

JavaScript では、Ver2.0 から package が導入されることになっています。
反対の声も多いのですが。

Scheme にはパッケージは導入されるでしょうか?
なんでもありの Guile にもないぐらいだから、やっぱりありえないのかな?
http://www.kt.rim.or.jp/~kbk/guile/guile_toc.html

個人的には、Javaのいちばんありがたい点の一つが パッケージ だったりするので、
正直、非常に迷いますね。
0881デフォルトの名無しさんNGNG
Schemeはモジュールで名前空間を導入する流れじゃないかね。
既に主流のScheme実装は大抵モジュールシステムを備えてるし(互換性ないけど)
R6RSにはモジュールシステムが入るという噂。

あ、ちなみに
CommonLispの「パッケージ」は外部表記からシンボルへのマッピング、
Schemeの「モジュール」はシンボルから値へのマッピング。

CommonLispみたいに名前で検索することが多いと、名前そのものを
パッケージで分けるのが便利。Schemeはなんでも無名オブジェクトだから、
名前が何を指してるかをモジュールで分けるのが便利。
0882デフォルトの名無しさんNGNG
つまり、おまいらは初心者じゃないな?

なんかパッケージとかわからんです。
バインドと代入の違いとか。
おすすめの入門書おすえて
0883デフォルトの名無しさんNGNG
>>872さん、あるいは他の詳しい方にお聞きしたいのですが、

lispをschemeに書き換えるとき、意図的に変数捕捉をさせるマクロは
どう書き変えればいいのでしょうか?

例えば on lispの11.2で紹介されている with-open-file は
ファイルをオープンし、そのハンドルを与えられたシンボルにboudするマクロで

(with-open-file (s "dump" :direction :output)
(princ 99 s))

のように使います。
with-open-fileをschemeで書くとどうなりますか?
0884デフォルトの名無しさんNGNG
Schemeの標準関数だと入力と出力で関数が違うから、一発では書きにくいな。

(define-syntax with-open-file
(syntax-rules
((with-open-file (var filename . options) . body)
(call-with-open-file (lambda (var) . body) . options))))

としておいて、手続きcall-with-open-fileの中でdirectionオプションを
処理をするのが順当かな。

Schemeのsyntax-rulesで出来ないのは、マクロの呼び出し側で陽に与えていない
変数を捕捉するようなマクロね。On Lispのaifとか。
with-open-fileの場合は変数名sが与えられるので問題ない。
0885872NGNG
>>882
遅くなってすみません。
私の方は正真正銘の初心者です。
Web 上で入手できる資料しか読んでいませんし、とても何かを薦める
立場じゃないです。

一応、私のメインはこれ。
「入門Scheme」
http://www4.ocn.ne.jp/~inukai/scheme_primer_j.html

パッケージは、複数の名前空間を共存させる仕組みのことです。
私の本業である Java で知った概念です。

バインドと代入は…、質問の意図がわからないんだけど、
メモリ上に領域を取って、何かの値を収めますよね。
それに具体的な変数名を結びつけるのがバインド。
代入は、これはもっと一般的なプログラミングの概念で、
変数の指す値を、指定した値に変える操作にはいろいろあるけれど、
それらをひっくるめて代入と呼ぶ、と言えばよいのかしら。

>>881
とても興味深い話、ありがとうございました。
0886872NGNG
>>875 自己訂正
Scheme
× (sort + '(1 4 2 8 5 7))
○ (sort < '(1 4 2 8 5 7))
0887デフォルトの名無しさんNGNG
一応 CL スレなので CL をヨイショするぞ。

>・条件式には全て「?」がつくので分かりやすい
>あとは、破壊的な操作名の末尾に!を付けるとかか。
>Common Lispにもpやnを付ける慣習はあるけど徹底してはいないかな。

! とか ? より p や n のほうが発音しやすいというメリットがある。

> 過去互換性を無視して、文法が首尾一貫するよう再構成したのが Scheme なのだなあ、と。

ハカー文化が生き残っているのが Common Lisp だ!ちょっぴり委員会がガチガチにしちゃったけど、
hogehoge-p がカコイイ。確かに泥臭いところもあるかもしれん。だが、それがいい。
効率とか OO も大事だよ。やっぱ。
0888883NGNG
>>884
ありがとうございます。
頭悪いんでそのコードを完璧には理解できていないんですが、
可能だと分かっただけで大収穫です。あとは自分で勉強します。
On Lispのaifみたいに(itでしたっけ?)陽に与えない変数を束縛してしまう
マクロには便利さを感じてないので、十分です。
0889884NGNG
間違い。filenameを忘れてた。

(define-syntax with-open-file
(syntax-rules
((with-open-file (var filename . options) . body)
(call-with-open-file filename (lambda (var) . body) . options))))

ついでにcall-with-open-fileの定義。Gaucheだとこんなんかな。
動かしてないからどっか間違ってるかもしれん。

(define (call-with-open-file filename proc . options)
(let ((dir (get-keyword :direction options :input)))
(case dir
((:output) (call-with-output-file filename proc))
((:input) (call-with-input-file filename proc))
(else (error "bad direction" dir)))))
0890デフォルトの名無しさんNGNG
slimeでコードを書いているとき、-!-をポイント位置を表すマークとして、
(defun foo ()-!-
ここでリターンを押すと、
(defun foo ()
-!-
となり、インデントをするにはタブを押す必要があります。
リターンを押しただけでイッキに、
(defun foo ()
  -!-
と改行とインデントをしてくれるようにしたいのですが、良い方法があったら
教えてください。

ちなみに、ilispでは、lispプロセスを立ち上げているときは、リターンで
改行+インデントがされます。
0891デフォルトの名無しさんNGNG
C-m に newline-and-indent をバインド。
0892デフォルトの名無しさんNGNG
#'とかは別になくても良いよな。
funcallいらねーと思わねえ?
スロット2つあるなんてデメリットの方が大きいよな。
0893デフォルトの名無しさんNGNG
変数名と関数名の名前空間を分けることの是非。
悪い点。
・変数参照になってしまう所を関数参照にする手間。
e.g. × (mapcar #'foo list), ○ (map foo list)
・関数参照になってしまう所を変数参照にする手間。
e.g. × (funcall foo list), ○ (foo list)

良い点。
・変数名と関数名に同じ名前を使える。
e.g. × (list item lst), ○ (list item list)
動詞と名詞の両方の働きを持つ単語ほど、たとえ数はすくないとしても、
使用頻度の高い言葉が多い。listなど。(他は?)

この他の良い点、悪い点があったら教えてください。

Common Lispで名前空間を統一するとしたら、
(foo arg1)で、fooの変数スロットがunboundでなければそれを使うようにevaluatorを変更。
defunをdepricatedにして、変数スロットを設定するdefineを定義する。
なんて感じかな。混乱するだけのような気もする。
0894デフォルトの名無しさんNGNG
俺には良い点の方が圧倒的に少ないように感じてしまうなあ。
でも、Lisperにとっては違うのだろうか。

order: 順序、注文 or 順序づける、注文する
ってのがあるね。
0895デフォルトの名無しさんNGNG
car (動詞)コンスセルの最初の要素を返す (名詞)車
0896デフォルトの名無しさんNGNG
cdr (動詞)コンスセルの(ry (名詞) CD-R
0897デフォルトの名無しさんNGNG
LISP(Scheme) についてはずっと、あこがれるだけでぜんぜん分からずにいたんだけど、
数日間、集中して構文を勉強したら、急に分かるようになってきた。
Shiro さんのところの「なんでも(or λ 再帰 継続)」シリーズの内容が、読んで理解できたよ。
継続についてのアリスの話も、大体は分かるよ。ものすごくうれしい。

私と同じく、周りに誰も LISP (Scheme) を知る人がいない人のために一言。
cdr は「クダー」って読むんだぞ。「しーでぃーあーる」じゃないぞ。知らなかっただろ?
まあ、発音する機会なんてないんだけど。
0898デフォルトの名無しさんNGNG
>>897
何を使って勉強したの? (本とか)
0899デフォルトの名無しさんNGNG
変数、関数名が比較的自由に決められるメリットよりも表記の簡潔さ、
単一名前空間を望むなら Scheme を使いたまえ。人は短くて簡潔な方
を好む傾向があるが、それらの性質は必ずしも必要ではない。気をつ
けろ!その行き着く先は極度のミニマリズムだ。
0900デフォルトの名無しさんNGNG
>>898 ちょっと長くなったけど、自分自身のまとめを兼ねて、こんなことを書いてみました。

環境は、Chez Scheme と ChezEdit
http://www5a.biglobe.ne.jp/~sasagawa/MLEdit/Scheme/index.html
教材は >>885 にもあがってる 「入門Scheme」
http://www4.ocn.ne.jp/~inukai/scheme_primer_j.html
(Chez Scheme は R5RS のマクロしか動かない。そして R5RS のマクロを説明している
日本語の教材が、これしか見つからなかった)

この本はかなりとっつきにくい。ダウンロードしたのは何ヶ月も前だったんだけど、
ちょっとかじっては挫折を繰り返してきた。説明が割と厳密なのが災いした。

そこで、今まではモニタで見てたんだけど、その日読むと決めた分(数ページ)をプリント
アウトして、自分の中であいまいな点がなくなるまで徹底的にガリガリ噛み砕いた。
0901デフォルトの名無しさんNGNG
例えば「バインディング」については、
「Scheme の識別子(変数)はすべて、アドレスを保持するのみで、値を保持しない。
つまり、Scheme 中で使われる値は、整数も含めて全てオブジェクトだと言うことができる。
識別子(変数)への代入は全てアドレス渡しである。識別子にオブジェクトのアドレスを
代入することを『識別子を値にバインドする』と言う」

こういった感じで、自分が納得できるようになるまで読み砕いていった。間違った解釈は
あるんだろうけど、とりあえずその場で納得することを優先した。あとで R5RS を読んで
修正しようと思っている。

特にリストとペア(ドット対)については徹底的にやった。これまであいまいにしてきた
点が多かったから、紙に適当にリストを書いては、それをペアに分解したり、さらにそれを
二分木の樹形図に書き直したり、中学生に戻ったつもりで紙に書きまくった。

これはとても効果があった。それまで
「car (a b) は a なのに、なんで cdr (a b) は b じゃなくて (b) なの?」
というレベルだったのが、(((a b c d) a b c d) a b c d) というリストを見て
「ああ、同じ長さ、同じ値を持つ3本のリストが、頭のあたりでくっついてるんだな」と
すぐに分かるようになった。
0902デフォルトの名無しさんNGNG
また、それまで理由の分からなかった表記法が、考えてみたら当然のものだということが
わかってきた。たとえば、((lambda (a b . c) (...)) 1 2 3 4 5) で、なんで c に
(3 4 5) が割り当てられるのか、とか。

意外な副作用として、カッコの対応が分かりやすくなって、S式を読むのがだいぶ楽になった。
S式を読む能力は、頭の良し悪しより、自転車の運転のような、訓練で身につく技能ではないかと思う。

こういうことをやっているうちに、頭の中でいろいろなことがつながってきた。
「入門 Scheme」でさらりと述べられていることが、実はとても深い意味を持つことが分かって、
読みながらしばしば感動した。まだ第1章の文法のところしか読んでいないのだけど。


もっと要領の良いやり方もあるのだろうとは思う。また、他の教材を知らないから、
「入門 Scheme」が良い本かどうかは分からない。だけど頭の悪い私にとって、この本を
こういうやり方で読んだことは良いことだったと思っています。


他の皆さんは、どうやって LISP を身に付けたのでしょうか。興味があります。
0903デフォルトの名無しさんNGNG
>>899
Scheme があまり普及しなかった理由の一つは、標準のライブラリの整備を、
その種の「悪しきミニマリズム」が阻んだからではないかという気がします。
まだ事情を知らないので、憶測で言っているだけですけれど。

また Guy Steele みたいな天才が現れるのを待つしかないのでしょうか?
0904デフォルトの名無しさんNGNG
……一応 Common Lisp スレなんだし Scheme ネタなら本スレでやったら?
あと、憶測でものを言う前に自分でいろいろ調べた方がいいよ。
0905デフォルトの名無しさんNGNG
>>904
いや、ここで Common Lisp の話だけじゃなくて、Scheme や Emacs Lisp の話も
してもらったほうが、初心者である自分には助かるんだけど。
なにしろ、いちばん学びやすいのは Scheme だと思うし、いちばん書く機会が多いのは
Emacs Lisp だろう?

前から不思議だったんだけど、ここで Common Lisp だけの話をしたい人は
初心者にはどれぐらい存在するんだろうか?

Scheme、Common Lisp、Emacs Lispの比較
http://www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/comparison.html
0906デフォルトの名無しさんNGNG
>>905
> なにしろ、いちばん学びやすいのは Scheme だと思うし、いちばん書く機会が多いのは
> Emacs Lisp だろう?

何を根拠にそんな決め付けを?
0907デフォルトの名無しさんNGNG
>>906
リンク先は読んだか?

> ユーザの多さでいうと、多い順に Emacs Lisp、Common Lisp、Schemeとなる。
これが、いちばん書く機会が多いのは Emacs Lisp だとした根拠だ。

ユーザもコードベースも一番少ないに関わらず、Scheme は MIT を始め、多くの
教育機関でコンピュータの初等教育に使われている。また日本語で読める
チュートリアルも多い。
これが Scheme が学びやすいと考えられる根拠だ。

しかし、そんなことは、はっきり言ってどうでもいい。俺が聞いているのは、
初心者様は本当に Common Lisp だけに限定したスレッドを望んでいらっしゃいますか、
つうことだ。

このスレはもうすぐ終わる。俺は正直、次スレが LISP 全般の質問・雑談スレになることを
希望しているんだが、他の皆さんはどうか?
0908デフォルトの名無しさんNGNG
次スレいらんだろ。本スレと合流でいいんじゃないか?
0909デフォルトの名無しさんNGNG
自分の意図を、もっと正確に書いてみる。
このスレがこれだけ伸びたのは、「初心者」需要が多かったからだと考えている。
本スレだとちょっと間抜けなことを言っただけで叩かれそうだから。
Common Lisp 専用スレの需要があったせいだとは思えないのだ。

しかし、このスレも後半ぐらいから、Common Lisp 専用スレの雰囲気が強くなり、
間抜けな質問も叩かれやすくなったと感じている。

今後のスレッド運営をどうするか?
1.本スレを一般向け、このスレを初心者向けの Lisp 全般スレにする。
2.本スレを Scheme、このスレを Common Lisp の専用スレにする。
3.このスレを廃し、本スレに統一する。

俺個人は 1. か 3.を支持したいんだが。

あと、
4. Scheme 専用スレを新規で立てる。
こういう意見があるとしたら、俺は反対だ。人が分散して全体が寂れることが、
ほぼ確定だと思う。
0910デフォルトの名無しさんNGNG
>「初心者」需要が多かったからだと考えている。
に賛成。

>3.このスレを廃し、本スレに統一する。
これに賛成。初心者に気を使うとしたら、「【初心者歓迎】Lisp & Scheme Part11」
などとしてみるとか。

まぁ、本当はどの場所でも、実際に初心者が「マヌケ」なことを言ったときに、
それを嘲笑しない雰囲気が大切だろうと思う。
0911デフォルトの名無しさんNGNG
序盤からできる範囲で答えていたが、別に叩きはあんまりないような。
どの辺を叩きっていってるの?次は統合でいいんじゃないかなー。本
スレの最近のカキコからも敷居の高さはうかがえないし。
0912デフォルトの名無しさんNGNG
次スレは立てないという方向でいいのかな?

>>911
では、叩きという言葉は取り消そう。俺が過敏だったのかもしれない。
0913デフォルトの名無しさんNGNG
このスレ見てきて、初心者スレは別個にあってもいいと思ったけど、
わざわざCommonLispに限定する必要はないと感じたよ。
結局読むの同じ人だし。

分けるとしたら

・本スレ(LISP統合スレ)
・初心者スレ
・特化した話題を扱うスレをいくつか(例えばCommonLispのコアな部分とか)

て感じが良いと思う。

まあEmacsLispスレは独立して立ってるし、専用のスレ立てたいCommonLisperの
気持ちわからんでもない。でもただの限定スレ、ってだけじゃ本スレと
話かぶりまくるし、今後はその辺を気をつけて立てようよ。
例えば初心者スレに特化するなら注意書きテンプレ考えて>1に貼っとくとか。
このスレの>1の中身じゃなんだかわかんねーし。
要は、住み分けがちゃんとできればなんでもいい。
0914デフォルトの名無しさんNGNG
漏れには一連の流れがスキーマーの破壊的リスト操作にみえてならない。
0915デフォルトの名無しさんNGNG
>>914
両方の利点を知りたいです。
そもそもwindows環境では、xyzzyに頼る以外にclispもインストールできない
人が多いと思います。Chez Schemeは認知度低そうですが簡単に
インストールが出来ました。
linuxや*BSDの環境でも初心者にはSchemeの方が簡単に手に入りそうです。
macはどうなのか知りませんが、手に入れた環境で手探りでlispに触れていく
んでしょう。
日常で使える便利なスクリプトがどれでも(os)、どちらでも(2つのlisp
)作れるようになれればいいな、などと思ってます。
0916デフォルトの名無しさんNGNG
>>909、907
最初の頃に質問させてもらいましたが調べる能力が
足りてないのも実感しました。質問以前に初心者ですらなかったのかもしれません。mapcarなんて基本的な関数すら知りませんでしたし、
今はもう質問に頼るようなことは諦めてます。
市場で農作物を抱えて運んだり台車で引っ張ったりと
いう単調で、そして人手が少ないのもあってかへとへとになる毎日です。
プログラムなんて興味があっても縁遠い人間です。

理解できてないのにtech板を定期的に見てしまうのは、"読み書きそろばん"
と呼ばれるような基礎的知識として、pcに簡単な処理をさせることはとても
重要だと思うからです。

じゃなぜ情報の少ないlispなんかに関心を持ったかというとスレの進行が
丁寧なのと、emacsの影響が大きいです。あと少ない労力で開発が
可能らしい…、という点でしょうか。
0917デフォルトの名無しさんNGNG
とりあえず初心者スレは存続して欲しいに一票です。
雑談スレになっても、またさほど高度ではない技術で
こんな面白いことができるという紹介のスレでも、lisperから
仕掛ける釣りのスレでも結構です。その時はageちゃえばいいんです。

きっと、何か聞きたいことが発生しても本スレだけでは
スレッドを汚したくない気持ちが強くて遠慮してしまいます。

0918デフォルトの名無しさんNGNG
改行制限に引っかかったので分けました。
915、916、917です。
0919デフォルトの名無しさんNGNG
うーん、謙虚をとおりこして卑屈になってないかい。
本スレが簡単な質問もできないほど流れが速いのならまだしも、
平気で数日間レスが無かったりする状況だから、初心者の質問が
「スレ汚し」なんてことはないと思うよ。
質問に対する回答を見てても、本スレか初心者スレかをあまり気に
してないみたいだし。
0920デフォルトの名無しさんNGNG
基礎的な質問はこっちに寄せて欲しい気もします。
そして、開発者やlisperの語る商売になる話、あるいは時代に一撃
喰らわせる程の熱い話があちらで飛び出して欲しいんですが、
やっぱり勘違いしてるでしょうか?
0921デフォルトの名無しさんNGNG
>>920
両方が混ざって混乱するほどレス数が無い
0922デフォルトの名無しさんNGNG
俺自身は必要をあまり感じないけど、初心者でこの手の初心者スレを
必要だと感じる人がいるのなら、次スレを立ててくれれば、俺は今まで
通り出来る範囲でレスをつけます。

このスレも一応、成功したうちに入るでしょ?
0923デフォルトの名無しさんNGNG
私も初心者スレの次スレがあった方がいいと思います。
ついでにいうとCommonLisp限定の方がいいと思うんですけど、なぜそう思うか
自分でも言語化できていないので強くは主張しません。
0924デフォルトの名無しさんNGNG
Scheme初心者はどうすれば良いんだい?
0925デフォルトの名無しさんNGNG
漢なら「Scheme初心者スレ」を立てて、最初の20レスくらいで、質問と回答の
パターンを示して、育ててみるのも一興よのう。
0926デフォルトの名無しさんNGNG
Lisp系全体で、本スレと初心者スレに分ければいいだけじゃネーノ?
0927デフォルトの名無しさんNGNG
>>926
賛成一票。
0928デフォルトの名無しさんNGNG
>>926
同じく賛成。
だいたい Scheme は上級で Common Lisp は完全に初心者とか
その逆の人とか少なくないか? 分ける意味無い気がする。

0929デフォルトの名無しさんNGNG
だってスチームは方言だらk(`Д´)
0930デフォルトの名無しさんNGNG
アホか
0931デフォルトの名無しさんNGNG
>>926 の意図が一瞬つかめなかった…。
つまり懐の深い本スレと初心者スレで、
Common lispもSchemeもありってことでいいんでしょうか。

>>925な感じでぐいぐいひっぱってくれればついていくかも知れないけど、
>>926なのでできればお勧めは前者ですよーな感じ?
0932デフォルトの名無しさんNGNG
あなたが、reverseを次にように書いたところ、同僚から、listの長さだけ
無名関数の呼び出しが発生するので、遅いだろうと文句を言われました。
それでも、あなたはreduceを使った、この簡潔な定義が気に入っています。
次の一手は?
(defun reverse (list)
  (reduce #'(lambda (a b) (cons b a)) list :initial-value nil))
0933デフォルトの名無しさんNGNG
reduceを使わない。
0934デフォルトの名無しさんNGNG
どれくらいの遅さか調べてみる。
0935デフォルトの名無しさんNGNG
(defun rev (list)
(declare (inline reduce))
(reduce #'(lambda (a b) (cons b a)) list :initial-value nil))
これで、reduceを展開してくれるコンパイラはない?
cmucl18e, clisp2.33, lispworks4.3.6は展開してくれない。
0936デフォルトの名無しさんNGNG
(declaim (inline ore-reduce))
(defun ore-reduce ...)
する。
0937デフォルトの名無しさんNGNG
>>936 その手があるのは、同意するけど…。俺はてっきり標準関数でも
お願いすれば、インライン展開してくれるコンパイラが主流だと誤解していたよ。
0938デフォルトの名無しさんNGNG
lex のような字句解析プログラムはありませんか?
それとも標準のストリームなどから容易に実装できるのでしょうか?
0939デフォルトの名無しさんNGNG
>>938
使ったことはないですが、とりあえず。
ttp://www.geocities.com/mparker762/clawk.html
0940938NGNG
>> 939
有り難うございます。助かりました。使ってみます。

read, read-char, read-line などは標準であるのに、、、
token 毎に読んだり字句解析まで出来る read なんかも
標準に入ってて、いつでも気軽に使えるといいな〜。
と思ってるのは私だけ?
0941デフォルトの名無しさんNGNG
>>940
>字句解析まで出来る read
字句解析がどういうものを求めているのか
よくわからないけど、set-macro-characterを駆使して、
自分でマクロ文字を定義してやれば、ある程度は可能かも。

って、そういう問題ではない?
0942938NGNG
>>941
>>939 のリンク先にあった lexer と同程度のこと、または
Unix の lex プログラムと同程度の事ができるものです。
恥ずかしながら read macro のいじり方が良く分からないんです。
0943938(長文スマソ。本スレの方がいいのかな。。)NGNG
以前、どこかのサイト(2ch?)または文献で
 「y2k の問題を解決するために COBOL のプログラムの
  解析プログラムをLISP により作成し次々と問題のプログラムを
  修正していった。
  LISP だとこのような強力なことが割合容易に可能となる」
みたいなのをどっかで読んだ記憶があります。
でも、LISP にそれを直接サポートする関数はあんまりないし、
Scheme でもいいのですが、
「LISP で簡単実装、擬 C コンパイラ」
みたいな文献やサイトも見た事ないです。
一度構文解析までできて構文木リストまでにプログラムを
持っていけるとあとは楽しそうなのですが、
それ以前でつまづいてしまってふがいないというか、
やるせないというか、悶々としてしまってます。

皆さん clawk と lalr を使っているのでしょうか?
それとも他言語コンパイラ向き LISP があるのでしょうか?
それとも標準的機能で簡単にある程度の事はできるのでしょうか?
0944デフォルトの名無しさんNGNG
たしかに、いろんな言語をパースできるライブラリがあったら便利そう。
しかも、y2kの話はかなりの売り文句になると思う。今まで知らなかったけど。
0945デフォルトの名無しさんNGNG
943が言ってるのはトマベッチがどっかに書いてた内容かな。あの人フリッツと仲良しさんで
フリッツは国の仕事よく請け負ってるからそんな表にでてこないネタいっぱい知ってると思われ。

ライブラリの件はzebuだっけ?何か有名なのあったよね。
使おうとしてたら上級Lisperの人に遅くて使い物にならんよ、って止められた記憶がある。
0946デフォルトの名無しさんNGNG
>>943
CommonLispのread系の関数は、lispのプログラムを読むために用意されているので、
マクロ文字の処理関数を書いてもCなどのソースを字句解析するのは厳しいでしょう。

Lexerには正規表現をよく使うけど、Common Lispの規格には規定されて
いないから、汎用的なlexerをCLの標準装備で簡単に定義するのは難しいかも。

まぁ、Cの字句解析なら手書きでread-charから書いてもそれほど手間じゃないと思うけど。

したがってlexerやlalrを使うことになると思います。Cなら文法定義もどっかにあるのでは?

Cの文法クラスって、recursive descent parserじゃパースできなかったっけ?
無理っぽいよね。
0947デフォルトの名無しさんNGNG
え、余裕だと思いますが・・
0948デフォルトの名無しさんNGNG
じゃ、lalrを使わずに自分でコーディングしてもいいね。
0949デフォルトの名無しさんNGNG
ネタが無いんだったら次スレは
「Scheme初心者スレ」でよろ。
09501NGNG
>>949
「Scheme初心者スレ」で単独スレを立てればいいではないか。
何もこのスレの後継にすることはないと思う。

ちなみに「Commonlisp初心者スレ」のスレタイで立てたのは、
内容をCommonlispで統一したいから。
Schemeとlispは別言語であり、別言語を混ぜると混乱する。
ここは「Commonlisp初心者」対応のスレであり、初心者が混乱することは
できる限り避けたいと思うしだい。

如何でしょ?
09511NGNG
>>949
「Scheme初心者スレ」で単独スレを立てればいいではないか。
何もこのスレの後継にすることはないと思う。

ちなみに「Commonlisp初心者スレ」のスレタイで立てたのは、
内容をCommonlispで統一したいから。
Schemeとlispは別言語であり、別言語を混ぜると混乱する。
ここは「Commonlisp初心者」対応のスレであり、初心者が混乱することは
できる限り避けたいと思うしだい。

如何でしょ?
0952デフォルトの名無しさんNGNG
CommonLisp初心者スレ(いるんだったら)と
本スレ=CommonLisp+Scheme+Scheme初心者
でいいんじゃない。
0953デフォルトの名無しさんNGNG
Special variableは、初期値を設定せずに、(symbol-value foo)として、
いきなり参照すると、unbound-variableエラーになりますが、
この動作に、歴史的な経緯や、理屈はあるのでしょうか。

エラーにせずに、(car 'nil) => nil みたいにとりあえずnilを返す仕様の方が
便利な気がします。
0954デフォルトの名無しさんNGNG
びみょうやね
0955デフォルトの名無しさんNGNG
>>953
初期値を設定せずに参照するって発想は間違ってるから、
それでいい。
歴史的経緯とか関係なく、プログラム組む上での常識。
0956デフォルトの名無しさんNGNG
エラーにせずに、すべての変数の初期値をnilにしてはどうでしょうという発想でしょう。
わざわざ値を設定しなくては、参照できない変数ってすこし面倒。
なんでもいいから値が最初から入っている事にしてほしいのでは?
0957デフォルトの名無しさんNGNG
デバッグ大変なのがわからんか。
ま、わからんからそういう発想が自然と出てきてしまうんだな。
納得。
0958デフォルトの名無しさんNGNG
dynamic variableの初期値がnilと決まっているくらいで、それほどデバッグが大変になるの?
他の型であることが前提のコーディングをしていれば、そこで簡単にエラーとなるでしょ?

関数のキーワードパラメータのデフォルトの初期値はnilだよね。
0959デフォルトの名無しさんNGNG
昔、Schemeの処理系を作っていたとき、最初>>956の言う様な、
初出変数を自動宣言できるという仕様にしていた。
だけど、Schemeでライブラリを書いていくうちに、それが大きな
間違いだった事に気づいた。
原因不明な実行時エラーという形で問題が表面化したからだ。
変数に使うシンボル名にゴミが付いただけで、それが何のエラーも
出ずに通ってしまっていたのだ。
エラーが出た時点で、名前にゴミが付いたという原因は判るはずもなく、
あてのないデバッグ作業が続いた。
ロジックは全てあっているし、トリッキーなこともしていない。
あげく、自分の書いたコードに不信感を抱き、このコードには
呪いでも掛かっているのでは?
と、オカルト的な思考をしてしまう程追い詰められた。
そして原因がわかった時、その恐怖は想像を絶した。
・・これは、Lispに限らない話。
0960デフォルトの名無しさんNGNG
今は、変数名を手打ちしている人は多いの? 俺は、emacsの自動展開機能を使っているので、
変数名の打ち間違いはここ数年ないと思う。

でも危険性はあいかわらず存在するから、どうしても初期値をnilにしたいっていうなら、
最初に参照した時点で、warningを発するようにするとかするかな。
0961デフォルトの名無しさんNGNG
打ち間違い以外にも、編集で誤って改ざんということはよくある気がするが。
0962デフォルトの名無しさんNGNG
コンパイルかけて身に覚えのないエラーが出たとき良く見ると"xo"とかいう二文字が混じってる
ことがよくある。誤って改ざんってわけじゃないけどバッファの移動に失敗してゴミ残すパターンが
多いみたい。CTRLキーをもっと確実に押せるようにキネシスでも買おうか思案中。高いけど。
0963デフォルトの名無しさんNGNG
Ctrl 押しわすれて p とか n とかいつのまにか入っちゃってることはたまにある
0964デフォルトの名無しさんNGNG
>>959 俺はunbound-variableエラーに賛成派だけど、
同じホラーストーリーは、plistやhash-tableなんかでも発生する可能性があるよね。
一箇所だけ、(setf (getf plist 'zpeed) 100)なんてね。
0965デフォルトの名無しさんNGNG
shなんかのシェル変数は、宣言無しで参照するとヌル文字列が返されるよね。

lispもトップレベルで色々、思考錯誤しているときに、
> (dolist (it some-list) (pushnew it a))なんて打ってから、
チッ! aを設定してネーゼなんてこともあるから、トップレベルに与える
フォーム中に未定義変数が含まれている時は、警告と共にnilに初期化
するというのは、アリだと思う。
0966デフォルトの名無しさんNGNG
ホラーストーリーやfailure modeと呼ばれるようなもので、最近、私が経験したのは、

(let ((foo (bar (list 'a 'b))))
;; do something
)
のつもりで、

(let (foo (bar (list 'a 'b)))
;; do something
)
と書いたときでした。私も呪われているのかと思いました。
0967デフォルトの名無しさんNGNG
構文上は正しいのに、実はバグが入っているという例は他にはないですか?
0968デフォルトの名無しさんNGNG
Controlキーって何指で押している? 俺は親指。
0969デフォルトの名無しさんNGNG
>>968
キネシスですか。いいですね。小指で押してますがやはり辛いです。
0970デフォルトの名無しさんNGNG
いや、普通のキーボードで設定を変えているだけ。

小指でコントロールを押すなら、oxとかp,nがたまに入るのは、ありえるかなと思った。
0971デフォルトの名無しさんNGNG
CLIM,CLUE,CLIO,CLXとやたらめったらいろんな種類が存在しているようですが、
LISPでアプリケーション書くときにGUI構成するのは何がお勧めですか?
当面CMUCL on Linuxで作業する予定ですが処理系・プラットフォームが変わっても
使い続けられるようなのがあると嬉しいんだけど商用の処理系でCLIMでケテーイ、ですか?
0972デフォルトの名無しさんNGNG
Celloとか。
http://www.tilton-technology.com/cellophane.html
0973デフォルトの名無しさんNGNG
CLIMってVBみたいなポトペタのフォームエディタはあるのかな?

>>971 CLIM for CMUCLとして、McCLIMもあるでよ。完成度はどうか知らんけど。
当面、CMUCL + McCLIMにしておいて、金が工面できたら売りものの処理系を買うのもいいかも。
0974971NGNG
情報サンクス。McCLIMってDebianのパッケージにもありますね。試してみるです。
Celloはコードにアクセスできないのでドキュメントとかメーリングリスト斜め読み中。
この前のcommon-lisp.net侵入騒動から完全に復帰するのはいつ頃になるんだろうねぇ・・・
0975デフォルトの名無しさんNGNG
Debianに来ていたのか。サンプルパッケージまで。
0976デフォルトの名無しさんNGNG
クロージャについて、関数と環境のペアと説明される事が多いと思います。クロージャは
必ずしも環境(スタックフレーム)丸ごと保存する必要は無い様な気がするのですが
(クロージャが作られた時に参照している幾つかの変数だけ分かれば良いとか)、間違って
いますでしょうか?

もう一点、レキシカル変数って他の関数とも共有され得る変数ですよね。スレッドと相性
が悪くないでしょうか?

初心者質問で済みません。
0977デフォルトの名無しさんNGNG
>>976
>(クロージャが作られた時に参照している幾つかの変数だけ分かれば良いとか)
その通り。コンパイル時にどの変数を参照してるかわかるので、それらだけを
抜き出してフレームを作るようなコードを出すこともできます。ただ、setfされる
変数は共有しなければならないので、それは一段間接参照をかませます。
Scheme->Cの処理系でこれをやってるのを見たことがあります。環境をCの
関数フレームに置けるので有利です。

この方法は、単に環境と関数ポインタのペアを作るのにくらべてランタイムの
クロージャ作成時のコストが高くつきますが、余分な環境を持たないメリットも
あるので、可否は処理系全体のバランスですね。

0978デフォルトの名無しさんNGNG
>>977
成る程。計算量的には環境へのポインタを作った方が効率が良さそうですね。

>Scheme->Cの処理系でこれをやってるのを見たことがあります。

これかな。
http://www.swiss.ai.mit.edu/~jaffer/hobbit.txt
0979デフォルトの名無しさんNGNG
Lispを人工知能製作に用いる場合、どのような手法があるのですか?
0980デフォルトの名無しさんNGNG
Scheme って、なんですか?
0981デフォルトの名無しさんNGNG
隙間を動詞にしたものが隙む。つまり隙間に入り込むという意味。
転じて、Lispでは仕様の微細な変更を言う。
0982デフォルトの名無しさんNGNG
>>980
scheme = skin、すなわち皮のこと。皮はハワイ語で kahua と表音されるが、
継続ベースのアプリケーションフレームワークを指すこともある。
kahua は gauche という scheme 処理系で動作するが、この作者は
川合氏であり、嘘のようなホントのカワ繋がりには、いささか背筋が寒くなる。
0983デフォルトの名無しさんNGNG
これもカワ?
http://www.gnu.org/software/kawa/
0984デフォルトの名無しさんNGNG
Lispって、いろいろ種類があるんだが、一番最初にどれを学べばいいんだ?
0985デフォルトの名無しさんNGNG
xyzzy lisp
0986デフォルトの名無しさんNGNG
>>979
人海戦術
0987デフォルトの名無しさんNGNG
>>986
ひたすら論理記述するしか無いの?
Lispでも人工知能が知らない対象を処理出来たりはしないってこと?
0988デフォルトの名無しさんNGNG
この世界にだって魔法はないだろうよ
0989デフォルトの名無しさんNGNG
Lispって何がいいんだろう?
今でも、現役の言語なの?
0990デフォルトの名無しさんNGNG
Javaより速く、メモリも食わず、かつ高機能。
0991デフォルトの名無しさんNGNG
sage
0992デフォルトの名無しさんNGNG
sage
0993デフォルトの名無しさんNGNG
sage
0994デフォルトの名無しさんNGNG
sage
0995デフォルトの名無しさんNGNG
sage
0996デフォルトの名無しさんNGNG
プログラムを生成するようなプログラムは、
他の言語よりもよさそうな気がする。まだ
Lispでそういうものを書いたことないけど。
Perlで設定に応じたCGIスクリプトを生成する
CGIを書いてたら、かなり面倒だったですよ。
0997デフォルトの名無しさんNGNG
sage
0998デフォルトの名無しさんNGNG
sage
0999デフォルトの名無しさんNGNG
sage
1000デフォルトの名無しさんNGNG
sage
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。