Lisp Scheme Part41
Guile も良い処理系だよ。 Windows ではいまいち使い勝手が良くないからワイはあまり使わんけど。 GNUプロジェクトとして開発しているだけあって、 ライセンス的にもビルドプロセス的にもGNUのソフトウェアとは連携しやすいから 個別のソフトウェアとしてどうこうというだけでなく GNUプロジェクトであることに意味があるんだと思う。 ただアプリケーションの拡張用に Guile はリッチすぎる気がする。 ライブラリはホスト環境 (アプリケーション) 側で用意するから 言語処理系の側は単純なほうがありがたいことが多い。 GIMP が TinyScheme をベースにしてることからもわかるように、 拡張用言語はこんくらいの規模でいんだよな。 GNUといえばEmacs 最も普及しているLisp環境 >>361 GitHub - lisper/cpus-caddr: FPGA based MIT CADR lisp machine - rewritten in modern verilog - boots and runs https://github.com/lisper/cpus-caddr guileはdicoと使うと便利ぞ dicoはdictと喧嘩しやがるアレなやつだからだが >>379 既にハードも気軽にお手製できる時代だったな… やったことないんでどこまで気軽か知らんが >>381 Unlambda.com | Main / Cadr http://www.unlambda.com/index.php?n=Main.Cadr Retrocomputing - MIT CADR Lisp Machines CADR Emulation LispとCの融合ということだと、KCLはLispective-Cなのでは >>377 Guile-based Emacs http://www.mit.edu/ ~raeburn/guilemacs/ Racket Programming the Fun Way: From Strings to Turing Machines https://nostarch.com/racket-programming-fun-way pというprocedureが何回呼び出されたかを出力したいと思って以下のコードを書きましたが、意図通り動きません。 どうすればいいですか? (define (cube x) (* x x x)) (define (p x) (- (* 3 x) (* 4 (cube x)))) (define (count_p angle n) (if (not (> (abs angle) 0.1)) n (p (count_p (/ angle 3.0) (+ n 1))))) Schemeで (newline) (display 1.0) のように複数の文?をつなげて実行することができます。 x が正のときに (newline) と (display 1.0) を続けて実行するようにするにはどのように記述すればいいのでしょうか? >>389 (if (< 0 x) … と if を使いたいです。 (if (< 0 x) (begin (newline) (display 1.0))) (if (< 0 x) ((lambda () (newline) (display 1.0)))) condでいい (cond ((< 0 x) (newline) (display 1.0))) implicit progn(begin)が欲しいならwhenとunlessを積極的に使おう 色んな書き方が出来るからこそ、most specificなものを使おう lispの質問が減って自己紹介みたいな駄文が多いんだよ 結局 most specific なものは何だろう プログラムがr4rsで記述できていてシングルスレッドしばりの競争ならいまでも速い可能性はあるだろうな だれか追試してくれよ (eq? '(a b c) (list 'a 'b 'c)) を実行すると #f となるのはなぜでしょうか? eq?はメモリ上の実体が同一かどうかを返すので、値を比較したかったらequal?を使えばいいよ named let使おうと思ったらCommon lispには無かった (let loop ((n 10)) (if (> n 0) (loop (- n 1)) #t)) ↓ (((lambda (loop) (set! loop (lambda (n) (if (> n 0) (loop (- n 1)) #t))) loop) 'dummy-label) 10) こういう仕組みだからCLで書けなくもないと思うけど 現代のlispハッカーはみんなloopマクロ使ってるよ named-lambdaならalexandriaにある Schemeで、 (+ '3 3) を評価すると 6 が返ります。 '3 は「3」というシンボルを表わすのではないんですか? >>413 クウォートは評価を抑制するという仕組み。 データ (S式) の世界がプログラムの世界にマッピングされるときにデータの世界のままで留め置く感じ。 識別子はデータの世界ではシンボルなので、(変数として) 評価しなければシンボル自体となる。 3 はデータの世界でも数値の 3 であり、数値はプログラムの世界で評価すると それ自体になるという自己評価 (self-evaluating) という規則の対象なので 3 はクウォートを付けても付けなくても評価結果は数値の 3 。 ちなみにベクタリテラルが自己評価の対象になるかどうかは変更があったので注意が必要。 R5RS/R6RS では自己評価の対象ではないのでクウォートが必要だが R7RS では自己評価になる。 まあほとんどの処理系は適当に許容したりもするんだけど。 number?で#tなだけで数値をシンボルで実装した処理系もあるかもしれん 小さい数値はヒープアロケーションせずにワードに詰め込む (ことで GC 削減して高速化を図る) ような実装が一般的だったり、同じ内容の文字列リテラルを統合したりすることがある。 eq? が数値や文字列について処理系依存になっているのは おそらくそういった最適化を許すための配慮なんだけど、 処理が遅くなってでも一貫した扱いをするというデザインを選んだなら 内部的に数値とシンボルと統合することも選択肢としてはあるかもね。 そうしてもユーザー視点ではたいして得なことはないんだけど、 アプリケーションに組み込んで拡張用言語として使うとか だったらアプリケーション側の事情と馴染みやすいかどうかみたいな視点もあるし。 数字はreadした時点でnumberになる それをquoteしてもnumberのまま quoteするとはevalされないということだ もちろんnumberをevalしてもnumberのままだ あっそうか 末尾再帰が仕様にないからloopを使うようになってるのかな? 逆やね末尾再帰でloopを代替できるからイキって仕様からloopを消したったのがschemeやからユーザーもイキるやで 末尾呼び出しの最適化が至高の技術のように思っていた時期が僕にもありました 末尾呼出し最適化はあくまでもセマンティクスの話であって、 ループ構文を避ける強い流れがあるわけじゃないよ。 do や named let くらいしか繰り返し構文が用意されてないのは 皆が合意できる仕様をまとめられていないという非常に単純な理由だよ。 R7RS-Large に入れるループ構文の候補としては ・ SRFI-42 (https://srfi.schemers.org/srfi-42/srfi-42.html ) ・ foof-loop (http://wiki.call-cc.org/eggref/5/foof-loop ) ・ chibi loop (http://synthcode.com/scheme/chibi/lib/chibi/loop.html ) が挙がっている。 まあまだちゃんと議論されてないので他の候補が出るかもしれないし、 結局何も入れないということもあるかもね。 アキュムレータ加えて末尾再帰で書くよりはdoを好むわ ロジックとしては全く等価だし、見やすい方がいい loopキーワードは:を付けてlisp keywordにすればビジュアル的に随分見やすくなるね ところでloopの独特の言い回しはAlgol由来だと最近知った、downtoとか esacやfiまで取り入れてたら投げ捨てるけど >>412 sbclが内部でnlet使ってるね ::で参照したりコピペしたりしてるわ やっぱclに入れた方が良かったな loopしなくてもdestructuring bindやwithの為にloop使うのは我ながら良くないと思う 値を集める節がハマると簡潔に書けるのでつい 慣れた Scheme ユーザーなら末尾呼出し (末尾再帰) になっているかどうかは空気のように判断できるけど、 do で書けるものなら do で書いたほうがそういう判断をする必要さえないわけで、 なるべく抽象度の高い構文 (または手続き) を使うに越したことはない。 大事なのは抽象化で、繰り返しをしているところなら繰り返しに見えるように書くのが筋だろ。 (繰り返しに do という名前を当てるのがどうなんだ……とも思うけど Fortran 由来らしい。) そういう意味では >>425 が loop をループ以外の用途に使うのは確かに良くは無いんだが、 場合によってはそういうのもイディオムとして定着していることがあるから 意味に忠実にするために冗長になるくらいならイディオムに頼るほうが「わかりやすい」場合もある。 どちらがいいというわけでもなくて全体の匙加減だから難しいよね。 末尾呼出し最適化をいかした書き方というのは確かにあるのだけれど named let はシンプルな loop に特化していて中途半端なのだよなあ named let 嫌いだわ、構文として紛らわしいだけ あれはgotoとでも名乗るべき >>428 おいらはすき。letなんてどうせシンタックスシュガー。 書き捨てなら抽象度は低い方がよいのが原則じゃないか? 高いほうがいいのは使い回すケース、例えば数列計算関数に項を計算する関数を渡して特殊化したい場合 carがdoなら、何がしたいのか一目で分かるよね あとclでも普通ループへの展開はしてくれると思うけど、保証はされてないから神経質な人は、より確実に等価なコードに展開されるだろうdoの方がいいかも いやさすがに気にし過ぎか >>430 > 書き捨てなら抽象度は低い方がよいのが原則じゃないか? 手間とのトレードオフで抽象化層をわざわざ作るのを避けるという意味ならそうだけど、 多様な語彙 (標準ライブラリ、またはそれに近いもの) がすでに揃っている中 から選べるなら状況をより適切に表しているものをピックアップしたほうが わかりやすいし手間も少ないでしょ。 ポエムだけど、状態機械ともロジックは等価だよね 二項漸化式を例に 仮引数-呼び出し 末尾再帰 a b accum - b (next b) accum' do a b result - b (next b) result' 状態機械 a b state - b (next b) state' 状態機械は普通遷移テーブルを与えて考えるけど、制御構造で動的に割り振れば前の二者になる 状態を引数で受け渡すことで、ステートフルな計算を実現する >>431 その文章には賛同するけど、その線引は深入りすると宗教戦争になりそうなやつだな… 忘れてくれ 状態機械の定義にそぐうかは詳しくないので分からないけど、表で管理するのは見やすそう でもデータ構造中に保持する限り反復に翻訳される可能性は皆無だろうな do構文は何がどこかすぐ忘れる named letはうる覚えでもなんとかなる ただのletの亜種だから断然読みやすい すみませんscheme初心者なのですが累乗を求めるプログラムが動きません http://www.nct9.ne.jp/m_hiroi/func/abcscm04.html を参考に、let と cond を使って書いてみたのですが let で局所変数を導入した瞬間に動かなくなりました 何が間違っているのか指摘していただけると幸いです (define (pow x y) (let ((z (pow x (quotient y 2)))) (cond ((zero? y) 1) ((zero? (modulo y 2)) (* z z)) (else (* x z z)) ) ) ) (z (pow x...)) の評価が ((zero? y) 1) の前に起きてるのが原因なんですね z に (pow x..) を束縛だけして評価しないみたいなことって出来るんですかね? (define (pow2 x y) (if (= y 0) 1 (let ((z (pow2 x (quotient y 2)))) (if (= (modulo y 2) 0) (* z z) (* x z z))))) みたいに if 文に分解して (= y 0) 1 を (let ((z (pow2 x ..) の前に出すしかないんでしょうか let と cond を一緒に使うとスッキリ書けそうなのですが… (define (pow x y) (let ((z (lambda()(pow x (quotient y 2))))) (cond ((zero? y) 1) ((zero? (modulo y 2)) (* (z) (z))) (else (* x (z) (z)))))) (define (pow x y) (let ((z (lambda()(pow x (quotient y 2))))) (cond ((zero? y) 1) ((zero? (modulo y 2)) (set! z (z)) (* z z)) (else (set! z (z)) (* x z z))))) ifとletを使うのが一番いいと思う (define (pow1 x y) (let ((z (delay (pow1 x (quotient y 2))))) (cond ((zero? y) 1) ((zero? (modulo y 2)) (* (force z) (force z))) (else (* x (force z) (force z)))))) (define (pow2 x y) (let ((z #f)) (cond ((zero? y) 1) ((begin (set! z (pow2 x (quotient y 2))) (zero? (modulo y 2))) (* z z)) (else (* x z z))))) >>443 なるほどアリティ0の無名関数として束縛してやれば定義時に評価されずに済むんですね 評価したいときはリストにすれば評価されると めちゃくちゃ為になりました ありがとうございます >>444 やはり自然なのはifとlet使った書き方なんですかね そもそも明示的に遅延評価を表すシンタックス形式(delay)があるんですね勉強になります ありがとうございました 計算量のことを言うなら繰り返し二乗法を使うのがスマートやろ。 force 使うの大袈裟すぎない? 440で全く問題ないと思ったけど 元になる数式をなるべく形式を変えずに書きたいみたいな要求はあるんじゃないの? プログラマ的視点で見れば >>440 の形に不自然さは感じない (むしろ比較的自然だと思う) けど、 理論家がコードに書き起こすときにはコードを変形させるよりは 遅延を明示したほうがすっきりと感じることだってあるだろう。 そこらへんは何が正しいとは言えないけど、 現時点で Scheme を学習中の人みたいなので色々な方法に触れておけば どれかは役にたつこともあるかもね。 こんなんでもいいんじゃない (define (pow2 x y) (if (= y 0) 1 (let ((z (pow2 x (quotient y 2)))) (* (if (= (modulo y 2) 0) 1 x) z z)))) 簡単な場合をよく考えられないなら応用的状況ではもっと出来ないよ。 応用ができるようになってからなら枝葉は後回しにすべきだけど。 (いわゆる「早すぎる最適化は諸悪の根源」ってやつ。) あと、単にこのスレってあまり話題ないから。 Parenscriptとclojurescriptのメリットとデメリットどこかにまとまってないかな 主力をcLかclosureのどっちにするかで悩んでる racket から pythonのtensorflowとか使いたいのに まともなpython ffiが見つからない racket死んでる? フリーランスに立ちはだかる「常駐」の壁。慣例を打ち壊し、 “テレワーク”案件3割→8割へと成長を遂げた「クラウドテック」の軌跡 https://prtimes.jp/story/detail/DBnPOktyljr テレワークの一般化により、11月にはテレワーク可能案件83.7%へと増加。 2021年、フリーランスのトレンドは「移住&テレワーク」と予測 https://prtimes.jp/main/html/rd/p/000000045.000050142.html リモートワーク求人専門サイト「プロリモート」がリニューアルオープン、業務委託契約の求職者と企業をマッチング https://www.value-press.com/pressrelease/262778 1/3以上が採用につながる高マッチング率、リモートワーク×エンジニア・デザイナー専門の 人材紹介サービス「ReworkerAgent」正式リリース場所からも時間からも自由な働き方を実現! https://www.nishinippon.co.jp/item/o/713384/ 新潟県、移住してきたテレワーカー/フリーランスに最大50万円を支給 https://internet.watch.impress.co.jp/docs/news/1287094.html 茨城県日立市、県外からの「テレワーク移住者」に最大151万円の助成金 https://internet.watch.impress.co.jp/docs/news/1281120.html 長野市、市内に移転・事業所設置し、移住することで最大550万円の支援金を支給 https://internet.watch.impress.co.jp/docs/news/1274735.html フリーランスが活用できる「最大1,000〜3,000万円・補助率50%〜75%」の 『ものづくり・商業・サービス補助金』とは?概要や条件を解説 https://freenance.net/media/money/4255/ 『ReWorks(リワークス)』リモートワーク特化型転職サイトとして 3月5日 リニューアル https://prtimes.jp/main/html/rd/p/000000051.000010457.html 春頃にLispマシンの話題になっているが、 TAOのコードは結局Public Domainに出来ないのかな https://www.nue.org/nue/tao/celis/index.html だいぶん昔にjaistでtaoのイベントがあったが同様の質問が出たが権利問題が解決できないらしく関係者にさえ配布できない状況らしい lispの勉強会で遭遇した人の話なので風の噂レベルでスマンがガッカリしたのを思い出した.エミュレーションもデモしたらしい Scheme版のcl-ppcreは何処いったんだ? 政治闘争で頻繁に互換性ないアップデートを繰り返して死んだ hy 次はclojureで同じ政治闘争が始まりそうという噂が hy くらいの新興処理系でどんどん変更が入るのは普通のことだと思うが。 つってももう登場から 8 年なのか。 >>462 いやそこにある実装は知ってるけど必要なのは>>461 もしかして自分で変換して使ってたのかな? スレに書き込む前に妄想と現実の区別がついていることをよく確認しましょう 自分で変換した不確かな正規表現ライブラリなんて使いたくねーな いやそれは移植元にテストケースがあるからテストが完走すればだいじょぶっしょ しかしそもそもschemeにもpcreライブラリは沢山あるだろうけど 妄想も噂も似たような言い換えみたいなものなのに 何でそんな強い口調で言い換えを強要してくるんだ ()に包めば言い換えないでも柔らかさを演出できる ()はすごいのだ 465から別の話題になってて468まででひとつの会話の流れ. つまりお前が勝手に被弾してるわけよ‥ sbcl2.1.9 windows版(amd64)入れてみたけど今まで起動直後に表示されてたWARNING(win版はスレッドまわりが壊れやすいけどそんなの対応してらんない!みたいなやつ)が表示されなくなって地味にうれしい スレッド周りはpthreadのエミュレーションを自前で実装してたのを、直接Win32のAPIを呼ぶようになった コードが一気にシンプルになったし、その時にバグの修正も行ったのだろう hhk限定モデル注文した これでlisp書きまくるぞ [ )* ] このキートップを作って売ったら儲かる! ()と[]は入れ替えてる スペースカデットの模造品とかないんだろうか roswell環境で.roswell/local-projects/が認識されないんだけど原因分かる人いない? quicklispとかroswellとか、全部一体化されたら使うわ Chicken Scheme 5.3.0 が先月リリースされてたのに気づいてなかったわ。 Lispworksのpro版購入してる人いますか? Release of LispWorks 8.0 http://www.lispworks.com/news/news39.html LispworksってSBCL みたいなSIMDサポートありますか? 週2日出社、週2日在宅の週4日勤務が最高の働き方だと提唱したい 週休3日制になったら給料を減らされる??そんな考えだからいつまで経っても貧乏なんだよ... サラリーマンが副業でプライベートカンパニーを設立するメリット Webマーケターに転職して、セミリタイアを実現させる方法 【朗報】「在宅勤務OK」の求人、コロナ前と比べて7 7倍に上昇! 【悲報】「会社員に戻りたい!」というフリーランス、全体の3%しかいないw 【悲報】副業が解禁されても、副業を見つけられずに困窮する会社員が続出... 日頃から副業をやっておくことの重要性を再認識しよう 【驚愕】5人に1人は本業よりも副業収入の方が多いことが判明w 本業よりも稼げる副業とはなんなのか?? >>491 Gauche 0.9.11-p1 リリース Windows での問題修正のみみたい。 >>492 1.0に向けての作業入られているようだけど 今年中に出るかは判らんなぁ >>494 それでも1.0はやっぱり大きな節目じゃないかな それでなくてもマイナー言語を採用する 障壁は大きいのに、まだ安定版じゃ無い、 とか難易度が高い 1.0 で Stabilize と書いてはいるが、別に現状の動作が不安定で落ちたりするという意味じゃなくて API の試行錯誤とかをやってたのを 1.0 では「とりあえずの」決定版にしようねという話であって、 後にもたまには大きな変更だってあるだろうし、そのへんの感覚は番号だけ見てもわからんのだよな。 むしろメジャーバージョンが変わった直後は不安定という通説もあるし。 メジャーバージョンがクソデカでも信用ならんものなんて腐るほど見てきただろう? 心理的な障壁というのはわかるんだけど、逆に言えば気分の問題でしかない。 検証した上でやっぱりアカンとなったならしょうがないんだけど、 バージョンナンバー「だけで」判断してるのならよい態度ではないよね。 1.0をだしたら、これまでできなかったあんあことやこんなことをやってみて、がんがん不安定化させるということだよね。もう飽きたからメンテナンスフェーズにはいるじゃないよね。 Gauche は作者自身が仕事で使うための道具でもあるから 万人向けではない方向にデザインされるということはあるかもしれんが、 (まあそもそも Scheme が万人向けではないが……) 常に作者によって使われているので大きく壊れることはたぶんあんまりない。 gaucheはr7rs対応したときに2.0になっていてもよかったのではとおもう 俺はscmは遊ぶ用だけどguileがいい感じ、イントロスペクションがつよいので掘って遊べる まだまだあんどきゅめんてっどなelモード探索も楽しい >>504 今一度! 3度目の挑戦ですが、sheme 手習いを読む、読み通す!! あくまで個人的感想だが、そういう風に勉強のために勉強するみたいなのは結局は上手くいかんのじゃないかと思う。 じゃあ、GAFAを超えるものを作るために勉強する! >>507 仕事で使えば直ぐに覚えられるね だがSchemeの仕事は無い 成果物として作るんでなくてもちょっとした前処理程度のことをするときに使えばいいよ。 使い捨てるものを何で作ろうが文句は言わせん。 プライベートで使うんでもいいしな。 俺は Scheme が一番慣れた言語だから…… こういうのがニワトリタマゴってやつかね。 慣れるために使いたいのに慣れてないから使わないってのでは 何も進まんでないか。 scheme使いなら自作の処理系の1つや2つは持ってるよね なにか作ろうと思うと結局cffiでcライブラリを呼び出して使ってるので、糊みたいな使い方しかしてないなぁ Ruby でも JavaScript でも Python でもだいたいそんなもんだろ。 scheme修行読んだら処理系書けるかな? ちょっと読んでちっともわからなくて挫折したけど 処理系作りたいなら下手な本より既存の処理系のソース読みまくるのが近道 >>520 斉藤由貴バージョンの 夢の中へ が脳内再生された。 ちゃんとエンドユーザー様までデプロイするのはめんどいのは確か グラフィックス叩いたりするライブラリに依存するのはやむ無しだけど、純lispなライブラリはライセンスの許す限りスニペットに切り出して同梱してる 継続が凄いって話は、かれこれ10年くらい聞いてたんだけど、結局は限定継続で十分だよね、 限定継続もあんまり応用ないね、って感じに落ち着いたのかな? 継続が凄いってなんだよ 継続ベースのlisp実装をschemeと言うのだから、そういう意味では凄い応用例だよ 非限定継続ってjmcのambとかが該当するのか? 動作としてはバックトラックするだけだから特に継続概念が必須というわけではないけど、なんか楽しい 形式定義できるのが継続の便利なところなんだよ。 バックトラックするだけとはいうが「バックトラックってなに?」というのを突き詰めていったときに「継続をこんなふうに受け渡してるでよ」と言えるの。 でも実際はambはただの愚直な探索だから遅いんじゃないの? 原理的にはバックトラックと同じ速さ。 それが遅いというのならバックトラックでも遅い。 バックトラックより速い方法があってチューニングの手間をかけていいならそうすりゃいい。 >>522 久々にscm書いてみたんだけどsrfi1とMITとr6rsでfold, fold-left, reduce fold-right, reduce-right(とそのpair-版)が初期値の畳まれる位置や引数の左右スワップとか違ってて混乱した とっくに誰かやってると思ったけど今後の為に:initial-valueと:from-endを取るcl式reduceを移植しました… scm はキーワード型がないけどキーワード引数をどういう風に渡すの? restに'symb突っ込んで泥臭く拾ってます srfiにちゃんとした機構あった気がするけど、小道具レベルで依存はしたくないので ところで scm を使うのはなにか理由があるの? 単なる好みならそれはそれでいいんだけど このスレで言及される Scheme 処理系は Gauche, Racket, Chicken あたりが多いので scm 使いは珍しいなーと思った。 guile使ってるけど#:で自己評価シンボルになるな よく見かける:の方はデフォルトで有効じゃなくて、オプション切り替えだったり Guile のキーワードはシンボルとは別の型。 (symbol? #:foo) は #f を返す。 CLの掟とか知らないから名前付き引数はマクロでシコシコやってた思い出 >>539 新興?処理系もまだ増えてるのね 良きことだ github.com/Soldier-B/ns.js/blob/master/ns.js#L3 >>546 ここでアイスランド語が言及されるとは驚きました、アイスランド語は実に濃ゆい言語ですね 教科書(Johns Hopkins) を買ったけれども、当然 1 ワードも読めませんでした schemeはじめましたなんだけど [lisp1.0+]label, [cl]labels = letrec + let name [cl]flet ((f (args) fletbody)) body = let ((f (lambda (args) body)) letbody) って理解でいいの? おおよそ似た雰囲気では書けたりするのかもしれないけど 単純に対応してるわけじゃなかったりもするからいいかどうかは状況によるんじゃないの。 まんまじゃね? とりあえず(macroexpand 'sb-int:named-let)はそのまんまlabelsに展開されたのでお試しあれ どの処理系でも似たような定義が大体あるはず 1958年のオリジナルlispのlabelは、scheme界隈ではlet1という名前で見掛ける 当然だけど、ローカル定義が一つなので(自明には)相互再帰はできない 触って気付いたけど (flet ((cons (a d) (list :cons a d))) (cons :a :d)) ; (:CONS :A :D) clisp, sbcl ; (:A . :D) ecl eclのこれバグ? 触ったことないのでeclがどの程度cltl/ANSI/clhs等の標準をリスペクトしてるのかも分からないのだが とりあえずgoogle play storeからeclのandroidポートらしいeql5 replを入れてみた (list ;; attempt to shadow cl:cons (flet ((cons (x y) (cons y x))) (cons 'co '?ns)) (let ((cons (lambda (x y) (cons y x)))) (funcall cons 'co 'ns))) ((CO . NS) (NS . CO)) fletは謎挙動だね… * shadowしない名前(xcons)ならok * (flet ((cons (x) (1+ x))) (cons 42))がアリティ不一致で怒られる から推測するに、普通cl packageの関数なんて弄られないだろうと踏んで、関数の名前解決を手抜きして最適化してるんだろう 値の名前解決は特に弄る意義もないので、scheme風にlambdaをletで値として束縛して呼べば問題ない clを名乗る以上はオプションで切れるくらいの配慮はあるだろうから、eclにこだわるならマニュアル読んでみては 少なくともclhsはリスペクトしてないね ...flet can locally shadow a global function name, ... http://www.lispworks.com/documentation/HyperSpec/Body/s_flet_.htm | 彡⌒ミ \ (´・ω・`)名前のシャドウ化辺りって自分で処理系実装した子はわかると思うけどハゲる要因だから絶対関わらない方がいいと思う (| |):::: (γ /::::::: し \::: eclは有名だけど、embeddableの名前通りの用途で1MBちょいな処理系だから、そういうものと割り切って使うべき funcallが冗長ならletのbodyにfuncallをconsするだけのmy-fletを作ればいいじゃない (さらなる災禍を招きそう) eclのlocked packageなる概念やcompile-timeの意味論に関連しそうなissue 2 yeas agoだけど https://gitlab.com/embeddable-common-lisp/ecl/-/issues/574 >>553 特定の名前の解決を決め打つ言語は多いし、そういうポリシーもありだと思う 普通でないのはcondition(warning)を挙げないところ 決め打つ名前(locked package?)が分かってる限りは、flet/labelsのレキシカル束縛リストから拾った名前がbody内の呼び出しformのcarに存在するか、ランタイムコストの無い自明な静的解析でconditionを挙げられるはず >>550 等価と思って良いよ 伝統的なlisp(とcl)のように(let ((x '())) ...)を(let (x) ...)と略記できない、だとか細かい差異はあるけど 百聞は一見にしかずなので、構文の対応を見るのが手っ取り早い あとeclのname collisionの件、consの例(>>553 )はさすがにcontrived-exampleだと思うので、ついでにeclで破綻するように letrec/nlet/labels で定義するラベルとして、所謂accumulatorイディオムにloop(他にはlp, iterとか)を使うのが慣例だけど、eclではcl:loopと読まれるのでは?と予想 ;;; cl -- ok: cmucl, sbcl, clisp, gcl err:ecl (的中) (defun fact (n) (labels ((loop (k acc) (if (= k 0) acc (loop (1- k) (* k acc))))) (loop n 1))) ;;; scheme -- ok: guile (define (fact n) (letrec ((loop (lambda (k acc) (if (= k 0) acc (loop (1- k) (* k acc)))))) (loop n 1))) pcでテストはしたけど、スマホから手打ちなので変だったらごめん >>557 スクリプト言語 (処理系) 的な想定だと実行開始時にテキストの解釈から毎回やるので 静的解析もランタイムの一部みたいな感じになる。 この場合に限って言えばどちらにせよ名前のルックアップはやるのだからそのときにわかるだろうとは思うけど 静的解析を頑張らないという方針はあり得るんじゃないの。 Gauche で検出されないエラーで (let ((0 1)) 0) みたいなのがあって、 実際にはオプティマイザが消去してしまうんだそうな。 文法の解析で通したものをオプティマイザがエラーとして弾くのも変な話だし、 オプティマイザが走査することがわかっているものを前段階でもチェックするのは二度手間だし、 オプティマイザを密結合してしまうのも保守しづらいし…… という葛藤があるのはわかる。 まあそれぞれに事情があるので原理的に可能だからといってそうすべきだとも言えない気がする。 0はシンボルじゃないから、文法解析を通しちゃ駄目だろw そういう手では絶対書かないだろう変なコードも、マクロ書いてるとまれによく発生するから困る カウンタ変数を捕捉更新しようとして、うっかり評価してしまったケースとか 多分(let ((i (+ i 1))) i)が化けたのかな letの時点でオプティマイザに通してんのかな let系はlambdaまで落として((lambda(i) i) (+ i 1))とすれば間違えようがないと思うのだが エスパー大会か? (let ((i (+ i 1))) (another-macro i)) another-macroは副作用目的で自明にiに展開したか、乗法的な関数を呼んだ(iの初期値0*n=0) >>565 gancheは知らんけど、さすがにletはプリミティブな事が多いかと むしろ最適化で読み飛ばすならlambdaまで還元してしまってはダメで、LETをヒューリスティックに認識する必要がある 仮に評価順を示す為にバッククォートでわざとらしく書くと `(let ((,index ,(1+ stride))) ,(* index stride)) ; (LET ((0 1)) 0) (に等価な)展開とかがありがちかな 特に例に意味は無かったってオチだったりして defmacro/macroexpand方式だと特にだけど、(let ((0 1)) 0)みたいな残骸から推論する技能はとても大事に思う 書く時もそうだけど、人が書いたモノの後始末なら前提知識が無いのでなおさら これだけ想像を膨らませてくれる貴重な(let ((0 1)) 0)すら消し飛ばされるならもうお手上げ なんて文句を言いつつ、schemeでもついslibのdefmacroに手が伸びてしまうのだが >>565 論理的にどんなletが束縛リスト(とおそらくbodyも)を読み飛ばせるかについて補足 letフォームの評価値は最後のフォームの評価値(car (last 'let-form))のみで決まるけど、それが再束縛のできない自己評価オブジェクト(0, T/#t, :kw-symb etc)ならば、単にそれを返すだけで他を一切見る必要すら必要がない (let dont-care/maybe-invalid self-evaluating) →self-evaluating もしそれ以上簡約してしまうと、(eq 'let (car 'let-form))と(car (last 'let-form))だけを見て決められない 一応値については正しいというだけで、もしbodyに(exit)や大域脱出が入ってても無視するのか?という問題はある ill-formedな>>560 すら無視するのだから、当然well-formedな(exit)も無視するのが自然だけど、実際のところはgaucheに訊いてください >>570 念のために補足しておくけど >>560 のケースは捕捉されないエラー (現時点では捕捉することを意図的に諦めているエラー) であって Gauche の仕様として正しいというわけではないよ。 結果は未定義。 直接的に書いてしまった場合にしてもマクロ展開結果でこうなるにしても あくまでも誤っているプログラムだからね。 言いたかったのは >>557 に対してで、原理的に出来てもやらない事情の例として (私は ECL のことは全然知らないので) Gauche での例を出したってだけ。 >>571 どうも、俺のも原理的には…という同じ意図の話だよ eclやgaucheが有名実装では最もアグレッシブな感じなのかな? (declaim (optimize (speed 0) debug safety) が外せない俺には怖くて触れないよ なおeclのlocked package?の件、標準の宣言を全て付けても有効な模様… >>572 > 有名実装では最もアグレッシブ そんなことはないんじゃないかな。。 実行前の処理に時間をかけない (かけても総合的な性能向上にならない) という 判断でエラーチェックに消極的だけど最適化にも消極的だから。 UCB Scheme https://people.eecs.berkeley.edu/ ~bh/61a-pages/Scheme/ UCB Scheme is a modified version of STk 4.0.1 by Erick Gallesio. USB Schemeじゃないのか どっちかって言えばUSB Schemeが欲しいのだが そのリンクがどうしたっていうんだ? 何か思うところがあるなら話題に挙げるのはかまわんが ただリンクを置いて去るのはやめて欲しいな。 ニュース系のネタならお知らせの意味で貼ったのかなと思うところだが、 そういう感じでもないみたいだしな。 そもそもダイナミックスコープの何がだめですか Emacs lispはダイナミックスコープですが、 あちこちから呼ばれてる関数を、空関数で上書きして殺すとかできて便利です Emacs lispの感覚でGIMPのスクリプト(scheme)を書こうとすると なにか何でもかんでもラッパー渡し(いちいちcarをひとつ辿る)って感じです ちなみにLispは普通の手続き型言語としてしか使ったことないです そんな奴への説教とかあったら聞きたいです マクロとか、「確かにif文を関数として実装するのは無理かもしれないし、 そういう時に使うのかな」くらいにしか解ってないです >>581 全然ダメじゃないよ。でも誰か(昨日のオレ)が余計なことをやって不審な挙動をしてるけど原因がさっぱり分からないというのは起こりやすいかもしれない。 Lispではたまたまうまく動いてるように見えるけど変数宣言の無い言語でダイナミックスコープやると死ぬ >>581 元のプログラムを書き換えずに影響を差し込むことが出来るってのはアプリケーション拡張用として便利だけれど 元のプログラムが想定してない滅茶苦茶なことも出来ちゃうということと最適化が困難になるのが深刻な問題だと思う。 ユーザーが変な使い方をして変なことを起こす分には自業自得といえるにしても 今ではパッケージをネット上からダウンロードしてインストールまで自動だから 悪意あるコードが他のパッケージを好きなように変更できるようだと影響範囲が大きい。 たとえばウェブブラウザのアドオンなんかだど各アドオンは通信によって協調は出来るが 環境は共有しないようにすることで影響力を制限している。 参照しているものがことごとくいつでも変更される可能性があると インライン化や畳み込みといったごく基本的な (しかし効果が高い) 最適化すらできない。 現代的な言語処理系に対して数十倍単位で遅いのはさすがに困る。 ものごとの良し悪しにはトレードオフがある。 どちらの問題もコードが小規模ならどうということはないので利点のほうが上回っていたのかもしれないが、 時代を経て巨大になりすぎた。 疎結合を意識した構成にしないと手に負えない。 グローバル&ダイナミックは罠になり得るけど、対話的に使うコマンド言語(シェル)は大体そうだし利便性の問題、新しいpwshでももそう 定義をテキストとして全てダンプして、読み戻せる利点がある cl/scheme(fluid-letとかそんな名前の拡張)のように基本レキシカルで、ローカル&ダイナミックは宣言が必要なら意図せず使う事は稀なはず (form-in-scope? (declare (special x)) form-in-scope) (locally (declare (special x)) (form-in-scope)) 面倒だけど(declare…)が外、つまり同じレベルのフォームに影響する場合があるのが気持ち悪いから、明示的な後者を好む レキシカルな情報を取り込んでしまう(暗黙にクロージャを作る)クロージャにはテキスト表現が無いから、ダンプが出来ないのは致命的な欠点 よってダイナミックスコープ一択になる pwshだと gci function: bashだとdeclare -f (多分、よく知らん) でダンプ、出力されるテキストを読み直せば(大体)環境が復元できる pwsh方式だと{code}.GetNewClosure()でクロージャは明示的に得る >>581 guileだっけ? あれ変な拡張山盛りだから出来るんじゃない?fluid-letみたいな名前がないかaproposしてみたら >>587 GIMP の Scheme (Script-fu) は TinyScheme が使われている。 (昔は SIOD だった。) まあ fluid-let くらいなら自分で書いてもたいした手間じゃないけどね。 #<closure ...>が嫌ならいにしえのfunargを使えばok 別にレキシカル環境をリストで持ったって構わないわけで、印字表現が不透明なlispはインクリメンタルコンパイルやリストより効率の良いデータ構造を選んだ結果 厳密にはダイナミックスコープでないけれど、コード注入なら'ラムダ式を渡して廻っても同等の自由が得られる(call by name) 既存のコードの方でも準備が必要だけど >>588 ええ…gnu公式の拡張言語とは一体なんだったのか >>590 アプリケーションに特有の機能はアプリケーション側で用意されたものを呼出して使うわけだし 言語側のライブラリはほどほどで足りるんで小さい処理系のほうが面倒がないというのはあるかも。 Guile はビルドするだけで面倒くさいが TinyScheme はファイル数個の簡単構成だし。 ローカルにダイナミックな束縛をやるなら、それ専用のprogvフォーム(clにある)はどう思われてるんだろ? (progv 変数リスト 値リスト body) let系列の (変数 値)リスト慣習を転置(zip)した記法だけど、束縛が多くても縦にスペースを取らない let慣習では変数 値はsetq/set!だけど、progvの変数リストは評価されるから、リード時にバッククオートでシンボルを埋め込むようなハックが不要 動的束縛を活用するようなメタな場面では特にだけど、埋め込む為だけにわざわざリーダを何度も通すのが歯痒い 多分に個人的な好みだと思うけど >>592 転置されてるのと束縛リストの実行時評価は、おそらくlet風のマクロを書く時に便利だからかな mapcar #'list let-like-binding-list がprogvに渡せて、あと欠損値も勝手にnilで埋まる あと機械的に名前を処理するならgensymもお忘れなく 例が悪かった 単にlistをmapcarするだけでは、let形式のリストをそのまま渡した方が早い 不定数の引数を取ってリストを返す関数で、自明なlist以外をmapcarするならかなり楽が出来るはず しかし何に便利か今すぐ具体的な例は思い付かない() >>591 俺環ではインストール(展開後)で50MBのディスク容量占めてるな 実験的なelisp対応(編集機能無しで一体何の意味が?)とか 興味深いけど謎な方向に突き進んでるね GNUは昔から他人の成果物の丸パクリしか脳が無い団体だよ emacsの膨大なテキスト処理関数群に依存していない純ロジックのみのelispコードなら資産になる そんなの指折り数える量だろう ライセンス問題でどうしてもコードを触りたくないなら別だけど 何らかのlisp書きであれば、コピペしてその方言に適合するよう手直しする程度は自明な作業でしょう >>598 ダイナミックスコープとレキシカルスコープでは埋めがたい差があるし、モジュールやフェイズの方針なども大きな差だ。 伝統的に方言と称してはいるが個々に定義された別の言語なのでそんなに簡単に修正は出来ないよ。 私自身はそこそこ Scheme には習熟している自信があるが Common Lisp も Clojure も全然わからん。 C と JavaScript の外観はなんとなく似せてあるが静的型と動的型の違いという根本的な部分で違うからそう簡単に移植はできないのと同じような感じ。 いっそ Emacs そのまま組み込んじゃうとかそんな方向に進まないかな… 近頃の環境ならそんなに重くないはずだし。 >>600 やってできなくはないのかもしれないよ 昔、zlibがまだなかった時代にDOSでzオプションの利くtarを使いたくて、 仕方なくtarとgzipをまとめて一つのバイナリにリンクしてしまって、 スタートアップでヒープを半分に割って、スタックをそれぞれに割り振って、 あとはバッファが一杯になるたびにtar側とgzip側をsetjmpとlongjmpで行ったり来たり、 解凍は問題ないんだけど圧縮がどうしても同じ結果にならなくて、発表せず一人で使ってた オレオレSchemeでMineSweeper ソースがSchemeで書かれている ttp://ujip.ninja-web.net/schemeonjs/minesweeper.html だからなんやねん つか何年前から来たの?ってレベルの話だろ オンラインでuLisp動かしてみようかとTinkerCADのArduonoUnoにソースコード流し込んでみたけどさすがに5000行は許してもらえないみたいだな。 最適化されたCLは最適化されていないCよりは速い 昔Common LispでCより速いHTTPパーサを書いたとか言ってたのを見かけた コードを見るとnodejsのCで書かれたHTTPパーサをパクったみたいな感じなのに 比較対象はなぜかどっかの個人がCで書いたHTTPパーサだった その個人が晒してたソースのMakefileはデフォルトでは最適化なし なぜ比較する前にCの方を最適化することを思いつかなかったのだろうか というかなんでnodjsの方と比較しなかったんだ? 誰か理由わかります? scheme処理系作ったりSICPで悟り開いたりしたけど今の使い方は実質電卓 スペース区切りの値そのまま貼り付けられて便利なんよなー John Cowan 氏が R7RS-large の議長の座を降りることを表明した模様。 これからの体制については現時点は決まっていない。 実質機能しない規格なんて不要 主要処理系の実態調査して ANSI Common Schemeを策定すべき 実用的で無い言語にANSI規格とか要らないだろ それより、Type Script 普通に良い言語だぞ、 あれ実質的に型付きのlispだわ 「Type Scriptはlisp」発言頂きましたー >>615 設計者の「そうしたかった」という発言が拡大解釈されたもので、 インタビューをちゃんと読むと「そうできなかった」ということも言ってる。 How to Design Programs, Second Edition https://htdp.org/2023-8-14/Book/index.html 新版出てた Chez Scheme の 9.6.2 が五日前にリリースされていた。 Gauche 0.9.13 のリリース候補が出た。 問題ありそうな部分や要望があるなら今のうちに出しとくといいよ。 https://sourceforge.net/p/gauche/mailman/message/41039777/ Gauche1.0.0 !! 早く来てくれーーー!!! Gaucheの目的が何なのか知らんけど それが達成されるまで1.0にならんのだろうな Gauche のバージョンナンバーの予定はここにかいてある。 http://practical-scheme.net/gauche/devinfo-j.html 具体的な基準ではないので(ユーザーの意見を聞きつつ)開発者が納得する完成度になればメジャーバージョンもあがるってことだろ。 「Gauche 1.0」って文字列の違和感がすごい 要望ね。schemeは処理系としては構造が簡単だから適当に作ってもそこそこ良い具合に出来上がるだろうが、 問題はその後で、処理系の方向性を決める必要がある。処理系作るってことは目標が既に設定されている場合もあるが、 他人に使って欲しいのであるなら例えばpythonライブラリ流用できるとか.NETでGUIアプリ簡単に作れますとかwebだとか生成AIで何かいけるとかそんなのだね 俺がGaucheの名前を知りながら長年ほぼ触ったことないのはその辺りが原因だよ Gauche の目標設定はトップに書かれている。 http://practical-scheme.net/gauche/index-j.html 要するにスクリプト言語として常識的に必用とされる機能を盛り込んで日常業務に使える Scheme 処理系を目指すってことだ。 英語の「日常会話程度」が専門的な会話より難易度が高いなどといわれることもあるように「普通に使える」ってのは何か特徴的な売り文句があるより大変だったりもする。 Gauche は作者自身が業務で使ってるわけだから特化するより万能寄りのデザインなんだろう。 個人的には日本語テキストを不自由なく扱えるのがありがたいね。開発が始まったきっかけも stk で日本語を扱えなかったかららしいし、そこらへんは力が入ってると思う。 schemeを好きで使ってるやつって俺含めて既に自分の処理系は持ってると思うのだが、 自分の欲しい機能を満たせばそれ以上求めないし、その成果を踏み台に次のステップへ階段を上がるだろう 階段を上った末、他人に使わせる場面に出くわす事は良くある事で、その時それはschemeではなくなってた方が良いかもしれない 新人「えーなにこの括弧だらけ…今のトレンド?か、かっこいいですねワラワラワラ(辞めよ…)」 業務で使ったら他人を辞めさせる能力については万能になれるか 次のリリースはついに1.0だと>Gauche お祝いしなきゃ expecting ってのがどのくらいの確信なのか感覚的にわからないのだけど 一応の既定路線くらいには考えていいんかな? しらんがな どうせ本人もここ見てるだろうが質問あるなら直接本人に聞けよ 答え難いだろうが Chez Scheme 10.0.0 リリースきた https://github.com/cisco/ChezScheme/releases/tag/v10.0.0 サポートするアーキテクチャが増えたってのと、 そこにポータブルな仮想マシンも追加されたというのが かなり大きい変更点らしい。 GuileとGaucheって、VMインタープリタ、Cプログラムとの連携・拡張、オブジェクト指向あり、もともとR5RS。 フリーソフトウエアやライセンスという点以外は、言語・実装の方向性としては似ているように思いました。 Gaucheが、BSDライセンス版Guileのような感じがしたのですが、みなさんどう思いますか? ガイル? >>634 まじか?>>1 のスレにAAあるから見てこいよ Sagittarius 0.9.11 も来たよ〜〜〜。 https://bitbucket.org/ktakashi/sagittarius-scheme/wiki/Release%20Note%200.9.11 Sagittarius は暗号通信系に強いね。 作者はオランダの銀行システムに関与する技術者だそうなのでその経験が活かされてるんだろう。 【検証】40時間Lispを勉強したら信者になれる?【Lisp1】 https://youtu.be/V2GM9lR-Di0 Lispの勉強をしたら『葬送のフリーレン』と同じカタルシスが待っていた。【Lisp2】 https://youtu.be/JvsSt_ksKiw 神の言語からschemeを経て生まれたjavascriptは人間にとってはちょうどいいバランスだったわけだな それの前にポールグレアムいじり回が3回あって それで「Lispがそんなにすごいなら」ってことで40時間勉強したというわけだねw ポールグレって本職の人じゃなかったんだな すごい熱量な感じなのに MIT卒でLispで儲けたあと、ベンチャーキャピタルになった元本職かな エッセイストだと思うけどマとしては通販サイトとか作ってたんだっけ ただ小さな関数やマクロutilが集まったonlisp.lispは準標準関数的な感じで愛用してます そもそもハッカーであるかにガンガンプロダクト作る的な意味での本職マか否かは関係ないと思うのです cl&schemeの根幹や文書化のみならずC, Java, Fortran委員まで勤めた皆のSteele先生だって何作ったか寡聞にして知らんくらいだし 最近ではC,AWK,Goのバイブル+作法本で鳴らしたKernighan御大も隠居してエッセイストやってる 言語本+エッセイで良い書き物できるのがハッカーの十分条件だと思うね、pgrahamも余裕で該当 おれはlispはスゴイ神の言語とかくっさいワナビ主張は大嫌いだけど、lispはハッカー言語という主張には賛同したい 名だたるスーパーハッカーの共通部分を探してみると、それはシンタックス/セマンティクスに対する深い理解、すなわち言語デザイン能力なんだよな まあlispの専売特許でなくML系やHaskellもそうだけど、つまりDSLの書きやすさね 別に言語内完結に拘らずともlex/yaccでも処理系手書きでもいいが、言語内で完結したいなら好ましい 挙げられてるPaul GrahamやG.L.Steeleのような簡潔で一貫性のある手続きインターフェイスや構文の設計(言語デザインのみならず、むしろ日常の構造化プログラミングにより通ずる)には、それを自然言語に起こしながら深く考え推敲する経験が必須だろう これがハッカーの必要条件だと思う(>>646 の十分条件に対して) >>648 もう80才超えてるし、教鞭執れてるかは怪しいね… 最近プログラム書いてねえなあ、とかウェブで言ってたし 代わりに最近のエッセイ本はマ/CSというより一般人向けっぽいので食指動かず Understanding the Digital WorldシリーズとかDefending Yourself in a World of Too Many Numbersとかそんな題の書いてる ソフトウェア作法、プログラミング書法、プログラミング作法の現場で戦うプログラマーの為の三部作は素晴らしい、言語に縛られない(あえて題材は様々な言語)し、lispにも通ずる普遍的な知恵袋だよ スレチなのでそろそろこの辺で >>646 Steele先生はlisperの毛嫌いするC系言語/Algolishな言語も無数にデザインしているという皮肉! lispの話をしよう onlisp.lispのようなオレオレutil(s).lisp/scmから引用し過ぎるのはあまり宜しくない? macroはコンパイル順の関係で引く方が問題起きにくいけど 名前がdescriptiveなのは前提として too generalであれば初見の人に読みにくいのではと思うこの頃 一方でspecificであるかぎり、手続きを分かつ働きすら無い関数抽象も読み易い: carにget-operator、cdrにget-operandsなど単なるリネームでも重用する これらはpackage内にレキシカルな意味で近傍に置くべきよね?(使い捨てならflet/labels、共用ならdefun) より一般的な小物をコーディングを楽にする為だけに引くならば、lisp書きなら定義も大体覚えてるだろう有名な小物util集(alexandria、sfri)に依存した同梱するのも(ライセンスが許しても)憚られる… このスレやSO等見ても必読書なOn Lispは知名度あるだろうから、onlisp.lisp由来のものは初見で読めてコンパクトでバランス取れた妥協点だと思って使ってるんだけど (ライセンスや再帰志向で性能難アリなので、手習いがてら書き直したクローン版、念の為) なおonlisp.lispは手続き名がいにしえのlispかよってくらいヤバいのが欠点 文章下手糞すぎて読む気も起きない これって神の言語に慣れすぎて言語障害になった例かよってくらいヤバいのが>>652 の欠点 ストールマンがガンになったらしい 長髪も髭も落としてしまって別人みたいになってる 昔MSの偉い人がGNUはガンだとか言ってたな ついに自覚させたか ゆる学徒ハウス別館 現役Lisperが語る! Lispはオーパーツで人類には早すぎた【電脳史学】 https://youtu.be/tLZ8J9tGVEs ゆるコンピュータ科学ラジオ 大人の勉強は「夢の中」が主戦場。寝ながらマクロを書くといい【Lisp雑談】 https://youtu.be/Lbt_CCQKWFA >>660 は娯楽コンテンツとしては面白い でもLispは良いとして集合論を勉強しようとしてるのにはやれやれだな Haskellで圏論とかAIで代数幾何に夢見たりするのと似てる 結局広く浅くでウンチク欲を満たすに留めて、実践から逃げたいのだろうな 実践は壁だらけだから Lispとは別に2人で集合論やって Lispは一冊何か挟んでからPAIP読んでほしい 番組のネタ的に その人らはLispに大した拘りはないし 今更検索でまともに引っかからない古代のPAIPなんてやる意味を見出せないだろ AI関連ならTranslatorからChatGPTブレイクに至るまででも話題にしたらいい そうかなあ、論理プログラミングとか自然言語解析とか右側の人大興奮じゃないの >>649 MLやregexエンジン積んでパターンマッチ機構を言語ビルトインにしても特にアドバンテージなんて無いと思うけどな 50行のコードでcl-ppcre(perl相当)とも機能面では十分戦えるわけで or/and,named-capture/backref、lookahead/behind-assertion、predication、filter、context-sensitiveなreplace等ね 超古典な"LISP" Winston, Paul Horn, 2nd edのchap.17に載ってるやつ 本を薄くするために徹底的に再帰で書かれてるからまあ性能は察せ() 再帰で分かりやすいコードだから叩き台にもオススメ あれはsymbolic pattern matchなのでregexと比べるのは良い例出なかったごめん まあexplodeしてしまえばもうキャラクタベースだ 確かGrahamの>>652 にあるシンボルをバラすやつ、まあ3行くらいで書ける小品だけど explodeってネーミングがクールで覚えてたわ >>665 そうそう、PCと自分のスキルで実践出来る分野なのに(最低限の真似事すら)やってないのがお察しか 右の人が予めPC音痴だと予防線張ってるのは自走力低めだと自己分析出来てるのかも まぁ実践(この場合はプログラミング)で玉砕しちゃったら、しょんぼりするか歯切れ悪くて 面白くなくなるタイプだからチャンネル的には今のままで良いのかも 左の人は画面キャプチャしながらライブコーディングするスタイルを何処かで見せないと説得力に乏しい 左右どちらも含蓄なく浅はかに見えてしまうので、その道の専門家をお呼びするスタイルにして欲しい C#のufcpp的な人が(声とコード画面だけでも)出演したら(最低限の真似事なら)実践する人が増えると思う >>665 ,668 うむ、若かりし頃はマルコフやProlog/SQLモドキとかやってた、なるべく決定論的なのが個人的な好み トレースを分析しても理解の困難なモノは、決して知的探究心を満たしてはくれないのだ 流行りの文章生成もマルコフならトレーサビリティは完全なのが良い 古いAIのバイブルPAIPすら恥ずかしながら未読の身ですが… lispもデータドリブンなNN系はむしろ苦手とは思わない NN系がマスメディアでもバズり出した頃にウィキペディア見たら、Pythonのサンプルコードが載ってたので そのままCPython/Numpyとclで書いてみたら、ベンチはsbclぶっちぎりだったよ もちろん個々の処理がバックのcライブラリより速いなんて言わない 同レベルのコーダが同ロジックで翻訳すればの話 その差はclの無駄に細かいarray/vectorコンストラクタ引数の設計 具体的にはR/W抑えるビュー相当の:displaced-*と:fill-pointer、配列の動的リサイズ指定の:adjustable引数ね Numpyのndarrayはこの辺が裏で自動でやるのでコーダの裁量がない まあNumpyでプラグマ/フラグ駆使してその辺のお節介挙動を切れば普通に負けるかも あくまで並コーダが素直に書く限りの話 Cバックエンドで配列のviewをサポートしてるなら究極的には言語/処理系ではアルゴリズム瑕疵が無い限り有意な差はないよ ただし最速言語Fortranを半分程度使うNumpyにも優位性はある gccはじめ同じILにコンパイルされても配列多様コードでにおいてCより数倍は速い ただしNumpyは書き方に細心の注意をしないとユーザの預かり知らぬ所で勝手にディープコピーする大きな罠も そうした不透明性が嫌い 明示できるCLのFortran実装を待ち望む >>671 clの明示性といえば、:rehash-size :rehash-threshold等で個々のハッシュテーブルまでチューンできるのがいいね 配列なんかよりハッシュテーブルの方がリハッシュコストが遥かに高い 動的言語のリハッシュは知る限り全部処理系任せか、サポートしていてもインタプリタのコマンドラインオプションで一律にしか変えられない >>671 >ただし最速言語Fortranを半分程度使うNumpyにも優位性はある >gccはじめ同じILにコンパイルされても配列多様コードでにおいてCより数倍は速い この部分、Fortranで配列多用したらCより数倍速い的な意見なのかな? 1ミリも分からんので、詳細求む >>671 言語/処理系で有意な差はないと言ってるのに、Cより数倍も速いって、矛盾してるぞw >>674 何の根拠も無く「数倍は速い」なんて言い出さないから >>673 に対する>>671 の回答には期待しているw 中間言語が同じならコーディングの瑕疵は人間工学的な問題 Cは宣言が貧弱でin/out、純粋関数、エイリアスの有無は推論頼りだから失敗すれば死ぬ ただ最近はrestrict宣言付けて回るなら重なるか推論不能な配列のエイリアス有無も指定可、難解だけど 一方で参照渡しのFortranはtaraiベンチで推論失敗すればデリファレンス地獄で死ぬわけだけど、これ解消する宣言あったっけ? むしろ宣言無しのナイーブなコーディングなら数倍どころでは済まんよ ランタイムの重いclは比類なき宣言の豊富さで静的言語にまで迫ろうと頑張ってるわけで パフォーマンス志向でarrayとdeclareまみれのclはlispっぽさが失われるのがつらい 何でも出来るのだと前向きに考えてゆきたい… >>671 ,676 話逸らさんで良いから Fortranの「配列多様コードでにおいてCより数倍は速い」コードを出してw ゆる「コンピュータ科学」ラジオなので、集合論でもいいだろw マウントしないと気が済まんのか どのレスがマウントに見えたのか知らんけど 集合論なんてAppendixか記号一覧でサラッと確認して本題を進めるのに 集合論のブルーバックスを読んでシッタカウンチクを語る方がマウントに近い行為だと思うけどw まさか公理的集合論とその形式的手法をガッツリやるのかな そんな訳ないかw 単純に集合論とか圏論は逃げ (研究者じゃない限り)コンピュータ科学は実践を伴ってナンボの世界なわけで そこのレベル低そうな人にウンチク唱えられても何か可哀そうで娯楽にすらならん 痛レス追加w プログラミングにおいては、学問的基礎はそこそこにしてドンドン先に進んだもん勝ちなのよね 学習の初期段階から集合論(動画内ではタイプ理論も)に油売ってたら(逃げを通り越して)脱落かと ユーチューバーが視聴数稼ぎの為に手を出してるのを差し引かないとね、初学者が真似したら破滅 みんな母国語を話せるでしょ?言語学なんて知らなくてもw 逆に数学ちゃんとやらないからLispでつまづいてイライラするんだろうな そういう奴は20年後も進歩してないと思う(俺のことだが) でもまぁ左は慶応情報工学、右は数学が得意と言ってるし集合論は楽しみではあるな(他意は無い) 集合論もゲーデルもコンビネーター理論も入門レベルは理解したい と思い続けて10年w そんなことよりCentOS8入れてみたらGuileもEmacsも入ってなくてブチ切れそうなんだけど >>686 Lisp本ではないが論理学の問題集みたいな一般向け書To Mock a Mockingbirdの後半がみっちりコンビネータ論理に充てられててオススメ 手計算させて解法と答えも章末に載ってて取っ付きやすい入門 そのままdefunしてアプリケーティブに動かしたり、簡約パーサも数個の基底コンビネータの書き換え規則をcondで振るだけの自明な10行 かなり遊べるおもちゃ >>689 ありがとう ものまね鳥、積読になってる😅 右の人、集合論を勉強すると見せかけてゲーデルエッシャーバッハを持って来ると期待してるw >>652 acl2.lispもたぶん参考にしてるかもだけど On LispにもANSI CLにも載ってないのを集めた utx.lispってのもあるよ 念の為 探してみた、一番下にリンクある http://web.cecs.pdx.edu/ ~mperkows/CLASS_ROBOTICS/lisp-source.html 他にもなにやら面白そうなコードが色々 >>670 性能は知らんけど丁度>>696 にニューラルネットのコードがあったよ、とコメントしておく NEURAL NETWORKS. PERCEPTR.CL Perceptron. BACKPROP.CL Backpropagating Neural Net. 書かれたのが30年前で特に最適化してない短いお手本コードだけど、今時のAI向け言語とどの程度性能に差が出るだろう?ちょっと興味ある 他言語も得意で暇な人ベンチしてくれないかな() Lisp系の本あるある Amazonで検索してレビューを見ると、kaizenのしょうもないレビューが付いている 閲覧者にとってどうでもよすぎることしか書かないゴミレビュアーなんだよなkaizen 「読んでませんが」「一行もかけてませんが」「どういうものかわかりませんが」 けれど、「昔のAI業界知ってます」というね 片っ端から違反報告したろか read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる