Lisp Scheme Part41 (855レス)
上下前次1-新
273: 2020/12/18(金)00:23 ID:xE2tdWzM(1) AAS
3月にサスマンの新しい本が出ますね
274: 2020/12/18(金)00:35 ID:wHl77nxB(1) AAS
Software Design for Flexibility
How to Avoid Programming Yourself into a Corner
外部リンク:mitpress.mit.edu
275: ◆QZaw55cn4c 2021/01/02(土)01:05 ID:wp0Bo1A/(1) AAS
>>6
この冬、職場から休暇をいただいたことをきっかけに a little schemer への再チャレンジを始めました
2週間では >>6 までは進めなかったけれども、しつこくてべたな精読を今後も継続することにしました‥‥個人的な話でごめんなさい
276: 2021/01/02(土)09:30 ID:DXffwUjS(1) AAS
頑張れ
277: はちみつ餃子 ◆8X2XSCHEME 2021/01/02(土)12:55 ID:rf+zWHQf(1) AAS
2018 年の話題へスレ内でアンカーできるあたり、だいぶん進みの遅いスレだなぁ……
ところで先月、 Gauche の 0.9.10 がリリースされたよ。
278: 2021/01/11(月)12:28 ID:evx8yw3j(1) AAS
最近Clojureをさわって思ったんだけど、コンスって必要?ただのリストじゃだめなん?
279(1): 2021/01/11(月)22:00 ID:TgqHKx3G(1/2) AAS
最近はlistと言いつつ狭義のlist(linked)じゃなくlinked arrayな事が多いけどclosureもそれかな?(触ってないごめん
(三十年前の言語だけど)Pythonのコード読んだけどそうだったはず
計算量の議論なんかだとlinked listとarrayは一長一短ってことになってるが、アーキテクチャと殆どのデータの性質によって連結配列が実質万能なんで仕方ないね
抽象データ型としてcons/car/cdrというインターフェイスを提供してるなら十分lispだよ
consがなんでそんな大事なのかというと、普通に使われる抽象データ型の中では最も表現力が高いこと
単に自由に伸ばせるリストのようなモノでは、構文上バイナリツリーより複雑な構造は書きにくい(ポインタを駆使しない限り)
consが提供されていれば自然に平面DAGが、そしてちょっと読みにくくなる程度で任意のグラフが表現できる
化学構造やグラフをconsで扱ってるけどほんと便利だよ
280: 2021/01/11(月)23:51 ID:TgqHKx3G(2/2) AAS
書きにくい/やすい、ってのは環や分岐がcarとcdrとconsだけで書けるって意味ね
これらのアクセサが提供されていない言語、例えはPythonやcではリストのインデックスに対応する参照/ポインタを明示的に取り出して記録し、アドレスを格納する必要がある
またアルゴリズムにかける時に素の型とポインタ型を区別して場合分けする必要まである
そのまま文字列として吐くのも実装しなくていいし(リンク先のインデックス表示が読みやすいとは言わないが)
PythonなんかだとオブジェクトがリッチなのでnetworkXのような巨大なライブラリを使えば木を超えた表現も自然にかけるので、一時浮気をしたが…
形式言語の分野だともう線形な文字列や二分木の括弧文法は研究され尽くしてるので、グラフ文法なんかが最近流行ってlisp系言語で論文書かれてるね
281: 2021/01/12(火)00:03 ID:XqNkUArk(1) AAS
連投してごめんだけど、環や分岐がポインタ使わず自在に描けるのはかしこいsetfの寄与もある、って書き忘れてた(schemeはset-cdr!だっけ)
念のため
282: 2021/01/13(水)22:45 ID:c60O+Iz7(1) AAS
>>279
興味深い内容をありがとう
ちょこちょこ遊んでいるだけなので到底そこまで使いこなせる気がしないけど、
データをプログラム中にストレートに表現して操作できるというのはよく分かる
他の言語だとデータを保持するためにわざわざクラス設計からしないと
いけないような強迫観念にかられるけど、lispはそういう気にならない
283: 2021/01/14(木)12:13 ID:/NlgSZrU(1) AAS
データ型を定義しないのはトイプログラムだけだけどな
Lispはリストだけ使うのが通だとか善意で広めないでくれよ
284: はちみつ餃子 ◆8X2XSCHEME 2021/01/14(木)22:43 ID:9qLPLWCT(1) AAS
(カッチリした型を中心にする言語に比べれば) 最初はラフに
書き始められるというのはあると思うよ。
でも、そのままだと千行くらいの規模でももうだいぶんキツいんじゃないかな。
人によってはコードを書く腕力 (?) というか強引に行けちゃう人もいるけど、
雑に試行錯誤できるということとそこから部品として確立するのは別の段階なので、
試行錯誤で弄ってるときと同じノリでどんどん拡大していったら
すぐわけわからんようになる。
世間で思われているよりは型定義はすると私も思う。
285(1): 2021/01/15(金)01:43 ID:Hai3vgIl(1) AAS
そういう後付けのボイラープーレトにはCLOSやジェネリックよりコンパイラマクロが便利ね
286: 2021/01/15(金)21:24 ID:6113KkR6(1) AAS
ここでいう型定義はdeftypeのことを指しているのでしょうか
287: はちみつ餃子 ◆8X2XSCHEME 2021/01/16(土)09:43 ID:uH9KWN6j(1) AAS
Common Lisp でなら deftype とか defclass とかいったものを使うことになるんかな。
私は Scheme しか知らんからよくわからんけど。
288(1): 2021/01/17(日)08:06 ID:MtDeBO+C(1/2) AAS
>>285
嘘でしょ
人口無能が生成した文かこれ
289(2): 2021/01/17(日)11:47 ID:9ajuvsmH(1) AAS
>>288
defgeneric/methodは勢いで書き上げた触りたくないコードに機能追加するにはコード触らなくちゃならない
型の付いていない複雑なconsはどうせdestructuring-bindして振り分けるしかないんだから分けてdefmethodする利点もない
define-compiler-macroなら一切既存のコードに触れる必要は無いからすごく便利だよ
既存のライブラリに手を入れたいけど、直接書き換えるとアップグレードで無かった事にされるから嫌、って時にも活躍する
もちろんリファクタリング出来るならした方がいいけど、取り敢えず動けば良い時の話ね
290(1): 2021/01/17(日)12:14 ID:fZnccXPg(1) AAS
この場合、 alist はどっち側に分類されるのかな…
個人的にはだいたい alist で済ませてるけど。
291: はちみつ餃子 ◆8X2XSCHEME 2021/01/17(日)12:16 ID:ERThMJgw(1) AAS
Lisp 的なスタイルだとかなり短いサイクルで開発が進むので、
リファクタリングしないまま手の付けられないほどグダグダになった状態は単にサイクルを
回すのが下手なように思うんだけど。
まあ上手くいってないときでもどうにかする方法があるのはありがたい話ではあるけどさ。
292: 2021/01/17(日)12:22 ID:16Ro+9sx(1/4) AAS
既存のコードには手を入れず振る舞いだけに着目して付け足して行くってスタイルはaspect oriented programmingとか言うんだっけな
まあ盲で付け足してゆく事と同義ではないが
293: 2021/01/17(日)12:36 ID:16Ro+9sx(2/4) AAS
>>290
plistの方が好きだな、pprintでkey-valのカラムに並べられるし、alistが要求されれば一段flattenすれば済む
consの数も同じだし好みでは
ただvalがlistだと(a . (b c))=(a b c)とformatされてしまうので(a . ((b c))) = (a . (b c))と書いてる
aとリストのペアなので意味的にも正しいはず
294: 289 2021/01/17(日)12:38 ID:16Ro+9sx(3/4) AAS
最後は(a (b c))が正しい、.が余計だった
なんかid変わってたけど289です
295: 289 2021/01/17(日)12:54 ID:16Ro+9sx(4/4) AAS
真意を掴めてなかった感がある
alist-pとplist-pを定義してる、よく見るし受け入れられてるイディオムだと思う
deftypeしておくといい
すると振り分けをdefmethodに任せる事が出来る
296(1): 2021/01/17(日)22:27 ID:MtDeBO+C(2/2) AAS
deftypeしたtypeはclassじゃないからdefmethodできない
コンパイラマクロはプログラムの意味をかえたらいかんし
パッチするなら別定義のファイルを追加でloadすれば上書きされるのでコンパイラマクロする意味0
嘘ノウハウいらないです・・・
297: 2021/01/17(日)23:38 ID:4VqziDiv(1) AAS
>>296
そうだっけ、ごめん確認してきます
298: 2021/01/20(水)01:48 ID:9Gv1v6nA(1/2) AAS
alist vs plist はalistの方がassocが(lisp的な意味で)簡潔になるから?で一票
assoc[x;y] = eq[caar[y];x] → cadar[y];T → assoc[x;cdr[y]]]
M式、[x→y; ...はapplyによってS式(QUOTE (COND (x y ) …に展開される
外部リンク[html]:www-formal.stanford.edu
pdf17p
evalのボトムケースでもある大事なassoc、俺にはplist版は思いつかない
evenpが欲しいところだけど算術の定義がまだだし…
clのcx^nrがn=4までなのもcaddarまで使ってるからだろうかね
299(1): 2021/01/20(水)01:59 ID:9Gv1v6nA(2/2) AAS
ffとかappqとか見慣れない面白関数出てきて面白かった
first/restは単なるエイリアスでなくL-exp(線形リスプ?)における相似物としてちゃんと別に定義されてるとかも
あとpairがpairlisに改称した理由とか気になってる、次は1.5マニュアル読むか
小並感
300: 2021/01/22(金)02:54 ID:GlnM3g/q(1) AAS
consesのカッコのネストを無視して初めのシンボルを返すffは、左端の簡約だけで導出が決まる特性を持つコンビネータ計算(SKなど)にとても重宝する関数だよ
applyを.と見なせば(論理学記法で)SKx = ((S K) x)はcons((S . K) . x)と等価
.
/ \
. x
/ \
S K
(ff ((S . K) . x)) ; => S
ffでSを得て、そこへのaccessor は(dfs 'S '((S . K) . x))で4行程度で実装出来る、carで潜る時にはpush 'car、cdrならpush 'car、その枝で見つからなかったときにはpopでSへのアクセサ(car car)が得られて、そのノードを公式に従ってsetf '公式すれば導出完了
lispと言えばラムダってイメージあるとおもうけど、むしろコンビータと相性が良い、特にclのラムダは細かなコントロールを求めた代償として明示的なapply/funcallが必要だからなあ
あとdotprintとか定義しとくと便利ね
301: 2021/01/22(金)08:32 ID:hEWi2BMh(1) AAS
jmcはラムダ教徒だったろうになあ
いくらlispが形式言語処理向けとはいえ、機械的に処理するには置換が面倒過ぎる
302: 2021/01/26(火)22:54 ID:+x6NTk+g(1/2) AAS
>>299
app(ly)-q(uote)?直訳するとこんな感じか
(defun appq (m)
(cond (null m) nil)
(t (cons (list 'quote (car m)))))
(appq (cdr m))
>(appq '(a b c d e))
; ('a 'b 'c 'd 'e)
(jmcの)applyは関数fをコレにconsしてS式 (#'f 'a 'b 'c ...)を得ると
common lispではformの先頭は関数名かラムダじゃないとダメなのでevalには'funcallか'applyを追加でconsする必要があるので、組み込みevalを使う限りは循環定義だな
上下前次1-新書関写板覧索設栞歴
あと 553 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.021s