【入門】Common Lisp その8【質問よろず】
あれ、ちょっと言葉が足りてない気がするので補足。
実際問題、末尾再帰の最適化が出来ない処理系なんて稀だし、
それを言ったら C/C++ でも主要な処理系は末尾再帰最適化するので、
再帰の話で C/C++ と Lisp を比べるのは意味ないんじゃねーの?
既に
>>940 が述べた通り、 Lisp では仮に再帰やループを使う場面でも
それを抽象化した関数なりマクロなりを使うことが多い。
そしてそういった「抽象化」が出来るところが何より Lisp の優位性だと思ってる。
もちろんどんな言語でも抽象化のための機構はもってるんだけど、
Lisp は粒度が細かいとでもいうか、小さい単位で抽象化するよね。
(それにはデメリットもあるのでそれが良いとか悪いとかじゃなくて、
Lisp の方が向いている場面もあるという意味で。)
それとインクリメンタルな開発プロセスも Lisp の特徴なので、
出来上がったコードで差が無いように見えても C/C++ でもよかったとは限らない。
というか、何のためにLisp総合スレとCLスレが分かれてるんだかわからん展開だな
Lispは手続き型やオブジェクト指向の言語とは全く違う感覚で書く。
書いたコードはREPLでその場で実行修正、ソフトのためのライブラリを書くボトムアップ、副作用はなるべく一部に閉じ込める、高階関数で汎用部品を組み合わせる、マクロで関数で不可能な抽象化を行なう等。
CやC++と同じ感覚で書くと真価が掴めない。どの言語でもその言語に適したスタイルを身につけないとダメ。
945 :
デフォルトの名無しさん:2012/02/28(火) 13:49:48.10
マクロで書く関数では不可能な抽象化とは具体的にどういった物でしょうか?
他の言語では言語の機能、文法として提供されている抽象化等。
他もにDSLを作って簡単な宣言からプログラムを自動生成したり、コードの内部にxmlを埋め込んでプログラムを自動生成したり。
sxmlからGUI用のコードを生成するとか、他の言語だとIDEが吐くスケルトンも言語内で抽象化出来る。
Let over Lambda とか On Lisp とか Practical Common Lisp を見ろ、とか言ってもどうせステマ乙、
で済まされるかもしれないが一応言っておく。
>>945 > マクロで書く関数では
えーと…何といいますか…
マクロで関数で不可能な抽象化を行なう等。を、マクロの関数で読み違えてるんじゃないか?での連続だから。
関数で不可能な抽象化をマクロで行なう等。 ということだな。分かりやすくすれば。
えと、ここ入門スレですよね
>>945 良く引き合いに出される例だけど
if test then
true-case
else
false-case
fi
これが, 関数 if だと
if(test true-case false-case)
と, なってしまう. このため,
1. 遅延評価を前提としてない言語だと test が返した結果にも関わらず,
true-case とfalse-case が実行されてしまう
2. true-case アンド/オア false-case に副作用があった場合, if 式の結果
が保証されない
マクロは ``クロ内で積極的に評価しない限り引数は評価されない'' ので上記
のよ うな問題は発生しない
てな所か?
>>951 入門スレだけどCommon Lisp限定の話なら話の高度さに関係なくスレは進むよ
Macroについての入門だったり、高階関数の入門だったりと初めての事が出てくる話ならなんでも入門さね
マクロはリストを返す関数だけど、
返すリストがコードとして実行時に再度評価される?
はい、そんなところです。
>>941,942
schemeだかgaucheの中の人の記事にschemerは再起使うのが普通ってあったんだが
いや実際、使ってなかったから使わないのが普通なんだろうけど、
再起、末尾再帰なんて黒板問題でしか出てこないもんなのか?
>>944 TDDなんてREPLみたいなものじゃないの?
インクリメンタルな開発なんていうけれど、
要求分析が出来てない状況での開発にOOPが向いてないだけだよね?
ゲロゲロなオブジェクトの山になる前に、ただのcで書けってだけで。
>>956 schemerとCLerは大幅にスタイルが違う。schemeなら再帰が普通。
TDDは方針、replはそれを支えうる機能。TDDにも使えるけど他の用途にも使える。
関数単体での実行が出来るし、変数も弄れる。作った関数をその場で確認しつつ修正していくスタイルは楽。コンパイルを通すためだけのコードも書かなくて良い。
高階関数やマクロはCより粒度の小さい部品が作れる。汎用的で小さな部品を組み合わせるのが関数型のスタイル。汎用だから仕様の変更にも強い。
どちらかというとLispSchemeスレ向きの話題になりつつあるな。
欠点は動的型なのでテストが面倒な点と、自由度が高いので馬鹿が入ると酷い目に会う点かな。
部品の粒度が小さいし、実装と機能を分離させるし、動的型だし、マクロ等で無茶が出来るしで、特に決断を後にする、考えながら書くのに向く。
静的型以外の言語の機能なら簡単に後付け出来る。言語としての制約はないに等しい。どんな問題を解決すべきかも分からない研究等には最適。
500行程度のcのコードで情報学科の教授は勤まるがな
>>956 サンプルが偏ってるんじゃないかな。マクロとか普通に再帰を使いまくりだよ。
木構造であるプログラムのコードを扱うのがマクロなわけで、木構造と再帰の関係はご存知の通り。
また、再帰と同類の再帰的なマクロ定義も常套手段だし、やっぱり再帰とは切っても切れない関係。
マクロに限らずとも、例えば多値を使う場面では再帰を使うことが多い。
これは多値と標準のループ構文の相性が悪いから。
再帰を使う以上、メリットがあるなら最適化される末尾再帰にもするし、
再帰が不要ならdoやloopといったループ構文で済ませたりもする。要は使い分け。
それと、Common Lispはマルチパラダイムなので、書く人によって本当に全然スタイルが違う。
例えば、SchemeやHaskellも使う人なんかはモダンで関数的なコードを好んで書くけど、
歴史のある処理系のコードなんかは代入も使いまくりで実に手続き的だったりする。
この辺りは、色々な人の色々なコードを読んでみないと実感できないと思う。
パッケージの機能がいまいち飲み込めないです
パッケージを切り替えるときに
common lisp内部ではどういう処理をしているのですか
一応補足しておくけど CL で「積極的に再帰を使うような風土はありません」と書いたのは、
単純なループのかわりとか、なんでもかんでも再帰というわけではない、
という程度の意味であって全く使わないという意味じゃないよ。
Scheme の場合には破壊的な更新をすると第一級継続との組合せがやりにくいとかいうのも理由にあるかも。
>>962 「環境」が変わります。
ネームルックアップテーブルを切り替えるわけです。
WEB+DBの最新号、関数型言語入門を山本和彦が書いてるのを立ち読みして来た
けど、LISPに関する文章が悲しくて泣けた
いや、こっちにまで出張してこなくて良いから。
どんな文章だった?
Lisp Schemeスレ見れ
c++学んだ後にjavaを覚えて、オブジェクト指向についてわかってなかった
っていうようなもんじゃねーの?
素人だし仕方ない。
俺がわからなかったからおまいらもわかってないよな?
みたいな売り込み方はなあ・・・
言語とは畑違いの雑誌に素人が書いた素人向けの記事だからそれでいいんじゃないの?
一件落着
あの人素人なのか?
日本を代表するhaskell hackerだろ
書いたコードの経歴も調べられない素人>972
seriesは実際の現場では使われているのでしょうか。
CLtL2の付録に載っていて、ファイルの入出力がとても手軽でいいなとは思うのですが
with-open-fileマクロを使うのがやはり主流なのかなと思いますが。
気になったので聞きました。
kazuさんのこともしらない人ってなんなの
このスレをそういうので埋める気?
それだったら980あたりで次スレお願いね
何仕切ってんだよクズ
>>976 他にレスが付かないから、そんな詳しくないけどレス。おそらくは主流じゃない。
Series使ってる人はふたり知ってるけど、自分が読む範囲のコードでは見掛けない。
ただ、表に出てこないだけで、ある所にはあるのかもしれない。自分も知りたい。
CLtL2でSteeleの書いてる通りなら、実績に裏打ちされたものではあるんだろうから、
これ使って良いのかな、って話なら、気にせず使っちゃえって思うな。
自分もSeriesのアプローチは好き。
いいと思うよ
本人も迷惑だろうな
> kazuさん
きめえwwwww
986 :
980:2012/03/05(月) 04:08:27.32
↑ここまで自演
↑ここまで自粛
↑ここで再帰
と思いきや、継続↓