Lisp Scheme Part41
a little schemer/「scheme 手習い」 https://www.amazon.co.jp/dp/4274068269/ を読んでいます(ずいぶんと時間がかかっています)が、次のプログラムがさっぱり理解できなくて困っています 第5章「*すごい* 星がいっぱいだ」 この章の最初の方までは困難を伴いながらも、なんとか理解できました、この章でのこんな感じのコードを、仕様をみて独力で書きおこすことはできています https://ideone.com/fPHC2z ところが、p.92 から >Q: eqlist? はなんですか。 >A: 2つのリストが等しいかどうかを決める関数です。…@ >Q: eqlist? は、その引数についていくつ質問をしますか。 >A: 9つです。…A >Q: なぜ 9 つの質問があるか説明できますか。 >A: 自分の言葉で説明すると次のようになります。 >「各引数は次のいずれかです。・空リスト・アトムがリストに cons されたもの・リストが別のリストに cons されたもの >たとえば、最初の引数が空になるのと同時に、2番目の引数は、空リストか、car の位置に1つのアトムまたはリストを持っています。…B >Q: eqan? を使って eqlist? を書きましょう >A: https://ideone.com/vjYCZ5 この解答例がさっぱりです、実はAからよくわかっていません コードのコメントは私がつけたのですが、最後の方は混乱してしまって…何がわからないかわからない状況です。 何か理解するための手がかり足がかりヒントはないでしょうか? >>6 私はその本を持ってないのでそのあたりの問題を取り上げたブログ記事を見ながら説明しようかと思ったが、 その Q&A の通りとしか言いようがないんで、何がわからないのかよくわからない。 困ったな。 リストの先頭を見た時にあり得るパターンが 3 通りで、 l1 が 3 通りと l2 が 3 通りなら組合せは 9 通り。 9 通りのパターンは 3 種類に分類できて、 ・ l1 と l2 の先頭が空リストなら真 ・ l1 と l2 の先頭が一致すれば次の要素に対して再帰的に同じ処理をする ・ l1 と l2 の先頭が一致しないなら偽 となる。 実際のコードにするにあたって、空リストに car, cdr 手続きは適用できないんで、チェックの順番を気にするくらいかな。 引数が2つあり、それぞれは3通りの場合があるわけだから 引数の組み合わせとしては3×3=9通りの場合がある。 ※引数はリスト(空リストを含む)と仮定していいようだ。 愚直にこの9通りの場合分けを展開するとこの表↓のようになるので、それをそのままコードにしたのがその解答例。 A B 等しい? () () #t () (アトム . リスト) #f () (リスト . リスト) #f (アトム . リスト) () #f (アトム . リスト) (アトム . リスト) (and アトム同士が等しい リスト同士が等しい) (アトム . リスト) (リスト . リスト) #f (リスト . リスト) () #f (リスト . リスト) (アトム . リスト) #f (リスト . リスト) (リスト . リスト) (and carのリスト同士が等しい cdrのリスト同士が等しい) 他のソフトウェアに組み込むスクリプト環境でTinySchemeを使おうかと思っているんですが スクリプトの中からファイルIO関係の機能は使えないようにしたいです。 この場合、走らせるスクリプトの前に、open-input-file等のIO関係の関数を無害な関数で再定義する部分をくっつけてしまえばOKでしょうか? >>9 なんらかの方法で元の定義にアクセスできたら脆弱性になっちゃうから、 要らないなら削除する方が確実だと思う。 どのくらい確実にするかってのは程度問題だけど 削除する分にはそんなに手間でもないし。 >>10 ありがとうございます。 削除というのは、その機能をSchemeのソースから削除して再コンパイルするということですか? 依存型についてのテキストが出てるよ。 Daniel P. Friedman, David Thrane Christiansen "The Little Typer" Boro Sitnikovski "Gentle Introduction to Dependent Types with Idris" Edwin Brady "Type-Driven Development with Idris" Adam Chlipala "Certified Programming with Dependent Types" Aaron Stump "Verified Functional Programming in Agda" Idris と Pie言語 ではλ関数とπ関数が同じように導入されているので相互に勉強できるのがいい。 π算法 Robin Milner "Communicating and Mobile Systems: The Pi Calculus" Davide Sangiorgi, David Walker "The Pi-Calculus: A Theory of Mobile Processes" Matthew Hennessy "A Distributed Pi-Calculus" π算法はもともとCCSの拡張としてRobin Milnerらによって考案された、並行計算(π算法はλ算法の並行版)を表すモデルであり、プロセス計算の一種。 A Little Taste of Types - Code Mesh 2017 - David Christiansen https://www.youtube.com/watch?v=3z9nISI4ppw A Little Taste of Dependent Types 2018 - David Christiansen https://www.youtube.com/watch?v=1BWYy2-WM-o Gaucheのリファレンスマニュアル日本語版pdfはないのでしょうか? >>17 Gauche のソースツリーの doc ディレクトリで make pdf コマンドを実行すれば、 pdf 形式のドキュメントのビルドプロセスが走ることになってるよ。 ただ、 TeX を使うみたいなんで、 TeX を導入するのが面倒ってことはあるかも。 公式からは PDF 形式の日本語マニュアルは出してないっぽいね。 よく見ろ別人だぞ。 まさか同一人物なわけがあるまい。 話題がなさすぎるので近頃は C++ スレばかりにいるんだけど、 なんか面白い話題があればどんどん書いてよ。 WindowsでMinGWがインストールされておらずMSVCだけある状態で C言語のhelloworldプログラムでgauche.hをインクルードすると gauche.h内の#include <sys/time.h>の部分でエラーになります。 C言語からGaucheを利用する場合はMinGWがインストールされていることが前提という解釈であっているでしょうか? >>28 はい。 Gauche をビルドするためには MinGW というか (MinGW を含めた開発環境であるところの) MSYS2 を要求しています。 https://github.com/shirok/Gauche/blob/master/doc/HOWTO-mingw.adoc 少し古いバージョンは (MSYS2 ではなく) MSYS を要求していました。 gauche.h もその開発環境に依存しているので、 gauche.h を include した C のコードは MSVC ではコンパイルを通りません。 つまり、 Gauche の拡張モジュールや Gauche を呼び出すプログラムを C で書こうとするなら、 Windows では MSYS2 を使う方法しか想定されていません。 ただ、過去に「VC++用ポート」を試みた記事が WiLiKi に残っていますし、 ある程度は動いていたようですので、手間を書ければ全く不可能なことというわけでもなさそうです。 https://practical-scheme.net/wiliki/wiliki.cgi?Gauche%3AWindows%2FVC%2B%2B Gauche の実態は単なる DLL ですから、Gauche 自体を MSVC でコンパイルするのは難しくても Gauche を呼び出すプログラムを MSVC で作る分には頑張ればなんとかなる可能性は充分にあるように思います。 Racket のコアを chez のに置き換える話が以前に出てたけど、 もうほとんどできたみたいね。 次のリリースあたりからはそれになるのかな。 R7RS-Large の Tangerine Edition は議論・投票への参加者が少なすぎてちょっとアレな状況みたいね。 積極的に参加してあげて! 界隈でなんだかちょっとだけ ISLISP の人気が出てきてるというか ここ最近になっていくつか新しい実装が発表されてるんだけど、 使ってみた人いる? へー。 そうなのかと思って経緯を調べてみたりしてたんだが、 その過程で ISLISP の IS は International Standard の略だと見つけた。 id.nii.ac.jp/1001/00003362/ 仕様にも書いてないから知らんかった。 もっと古い時代に STANDARD LISP という名前の Lisp があったそうで、 http://www.softwarepreservation.org/projects/LISP/stanford/Hearn-StandardLisp-AIM-90.pdf それ故に標準化にあたって単に Standard とは名乗れず、 Common Lisp が Common Lisp という名前になったのもこのあたりの事情があるらしい。 単に名前を付けるだけでも変な苦心をしてるんだな。 イスラミックステートLISP 処女とヤリまくれるらしいぞ! >>38 イスラミックステートにかけるなら、 支配地域が縮小してるらしいぞというところに引っかければよかったんじゃないかと思ったが、 縮小どころか元々たいして使われてなかったということに気づいた。 >>39 大してして使われていない (少なくとも私の観測範囲では) と思ってるけど、 今後の発展があれば面白いなとも思ってることは付け加えておく。 (ディスってるわけじゃないんだからね! ってこと) 金払わないと正式な仕様書読めないのか、と諦めた記憶がある>ISLISP ドラフト?は読めたけど >>41 ドラフトと正式版の差は誤字の修正程度だよ。 Racketに対応したArcが出てたのね Arc Forum | Tell Arc: Arc 3.2 http://arclanguage.org/item?id=20772 >>43 ISLISP には興味無いよ。 でも LISP 界に動きがあるのは歓迎するので、 どういう受け止められ方をしているのか聞きたかっただけ。 >>45 ISLispってJIS規格になったんでしたっけ? >>46 JIS の ISLISP は 1998 年の日付になってる。 >>47 お返事、ありがとうございます そうですかISLispはJIS化されてたんですね でも日本で使われてるんですかね? Lispで日本で使われてるのはやっぱりCommon Lispだと思うんですけど(それと教育とかだとScheme(含Racket)が少しあるかな) ISLISP のことはなんも知らんけど、 急に ISLISP 処理系が立て続けに出てきたみたいやから なんか動きがあったんか? と思って >>32 を書いたんで、 私も質問者の立場なんやわ。 大した理由はないのであっても、 始まったならこのまま発展していくといいね。 ISLispのプログラミングテキストや解説書って笹川賢一って人が書いたKindle用の電子的なのが2タイトルあるだけで それ以外は海外でも何も出てないんですかね、Amazon USでタイトルを“ISLisp”で検索しても、その2タイトル以外は ISOの規格票しか出てきませんね とにもかくにも国際規格になったんだから、規格案をプッシュした連中がプログラミングの教科書や言語解説書や入門書ぐらいは 書いて出版するぐらいのことはやるべきなんじゃないかと思うんですが、見事なほどに何も出ていないようで驚きました >>51 Common Lisp の規模が大きくなってまとまらなかった中で 別の提案を整理して100 ページもないような規模の ISLISP を確立したという事情があるので、 完全なサブセットではないけど言語の考え方としては近い部分が多くて かなり小さいサブセット「的」なものという感じ。 つっても、やっぱり別言語ではあるので、それを「どれくらい」とは一言では表せないな。 個人的には、あくまで私の感想としては Lua と JavaScript くらいの距離はあるかなぁ……と思ってる。 昔の情報処理試験で人工知能の分野ときたらLispだったけど今違うのかな? >>53 このスレ (の過去スレ) では何度も話題になっている気がするが、 「人工知能」とは何か、それに「向いている」とはどういう意味かが曖昧なので、 Yes とも No とも言えるというのがおおよその結論。 人工知能を定義するなら「人間の知的活動を代行するもの」であり、 かつてはコンパイラや数式処理なども人工知能の範疇だった。 でも、分野として確立して以降は コンパイラはコンパイラだし、数式処理は数式処理であって、 今ではそれを人工知能と呼ぶ人なんかいない。 逆に言えば分野として確立していない知的な処理はなんだって 人工知能なので、範囲がざっくりしすぎて どんな言語が向いているかなんて言いようが無い。 強いて言うなら、かつては人工知能の主役は記号処理を基礎に据えたものであったので、 そのときの事情を前提にするならば、 それらを記述するには (当時あった他の主要な言語よりは) LISP が向いていると 言ってもそこそこ妥当ではあった。 人工知能でLISPを扱ってる本の巻末付録は大抵駅すぱあとシステムだからな 餃子がスゲー良いこと言ったな… > 逆に言えば分野として確立していない知的な処理はなんだって人工知能 機械学習みたいないかにも人工知能っぽいものでも、人間が理解して理論的に確立してしまえばなんてことない在り来たりな技術になるんだろうな 人工知能のカテゴリのひとつに「ルールベース」があるけど、 これって要するに if 文を並べて判断するようなシステムのことで、 現代的な感覚だと人工知能とは言わんよな。 ひとつのカテゴリとして名前を付けることすら馬鹿馬鹿しい。 (あくまでも現代の感覚で見ればという話なので、 当たり前のものにしてきた先人の努力を貶めるものではないことは断わっておく。) そんなごく当たり前のプログラムも昔は人工知能と呼ばれていたんだから、 人工知能という言葉が指す範囲はとてつもなく広いし、今後も変遷を続けていくと思う。 結果的に LISP が人工知能の記述に「適していた」あるいは「適している」のが事実であってもなくても、 LISP が人工知能の記述を目指しているというわけでもないし、 (LISP 系言語は幅広いので特に人工知能を指向したものも有りはするかもしれないが) 主要な LISP 系言語は Python やら Ruby やらと並べても違和感のないごく普通の汎用言語なんで、 用途を限定してしまうような言説は、個人的にはあまり好きじゃないな。 使いたいように使っていいんだよ。 >>57 > そんなごく当たり前のプログラムも昔は人工知能と呼ばれていたんだから、 > 人工知能という言葉が指す範囲はとてつもなく広いし、今後も変遷を続けていくと思う。 70年代前半だと数式処理(記号微分とか記号積分とか、特に記号積分はね)も立派な人工知能の一分野 ついでに言えば50年代後半だと今で言うコンパイラの研究も人工知能の1テーマだったらしい >>58 はちみつ餃子がすでに書いてるのに >>54 研究者や企業による実験段階+アルファまでAI 商品化され一般に流通したらIT Scheme というか、Lisp のことを少ししか分かっていないんですども、μKanren を使ってみたくて Sheme の処理系をインストールしたんですが Gauche、Guile、MT/GNU Sheme と、入れた全部 に assp がアンバウンドだと言われて動きません。 1.解決方法が分からなくて、自前で assp を書いて動かしてますが、本当はどうやったら assp が 使えるか教えてください。ライブラリをロードするのでしょうか? 2.せっかく書いたので、自前の関数の働きが本当の assp と同じなのか知りたいです。 みなさんならどのように書きますか? 最初に見つかったときに止める場合のセオリー はありますか? 書いてみた関数: (define (assp fn assoc) (let ((rtn #f)) (for-each (lambda (x) (if (not rtn) (if (fn (car x)) (set! rtn x)))) assoc) rtn)) >>63 μKanren のことはよくしらないけど、 assp は R6RS (※1) では rnrs lists ライブラリに含まれるので、 R6RS 処理系ではこのライブラリを import すると使えるようになる。 R6RS 以外には無い。 自分で書くとしたら SRFI-1 (※2) を使える状況なら こんな感じで書くなぁ (define (assp proc alist) (find (lambda(x)(proc (car x))) alist)) ※1 RnRS は Scheme の仕様書の通称。 n に改定番号が入る。 ※2 小さい言語である Scheme では日常的に使うにはライブラリが足りなさげなので、 ユーザーコミュニティとしてライブラリの仕様を考えて文書化したものの集合体が SRFI 。 (RFC みたいな感じ?) SRFI-1 はその最初期のもので、リスト操作系のライブラリ。 仕様の一部ではないので処理系によって SRFI の採用の程度は色々だけど、 実用嗜好の処理系は主要なものはまあまあ取り込んでいる。 今では仕様の検討の前段階として一旦 SRFI にしたりもしている。 >>64 ありがとうございます。Gauche は find があるみたいなので、早速置き換えてみました。 Scheme の規格は、過去のものを包括しているわけでもなく、なかなか難しいものなんですね。 μKanren だけに限らないかもしれませんが、μKanren の Scheme のコードは、普通の オブジェクト指向言語と違って型を作って使い分けするのでなくて、そういう意図でベクトルや ドット対やリストを使い分けていたり、戻す値が何を意図したものなのかわかりにくくて、 短いけど難しいですね〜 μKanrenてユニフィケーションの亜種みたいなもんだから多分どの言語でも大丈夫だぞ >>66 μKanren や miniKanren はいろんな言語に移植されていますね。 実は私も、ある超マイナー言語に移植することでその言語の勉強と、移植したライブラリで なんかしてみようと始めたんですけど、スタック系言語なんで、なかなかすんなりいきません。 あと、コア部分はいいとしても、Shceme でマクロを使っているところをどうするかって ところが悩みどころ。他の言語の移植をみても、そのへんはつくってないものも多い様で。 >>72 サイトのオーナーは個人みたいだけどDNSから消えてるね アーカイブには残ってるんでそっちをみれば? http://web.archive.org/web/20120305231338/http ://karetta.jp/book-cover/programming-gauche webで公開されてるsicpのレビューを なんで翻訳者が違うamazonの書籍のところに書いてるんだ? qiitaにでも書いとけよ chicken scheme のサイト( www.call-cc.org ) が ここ数日ダウンしたままだ 流石にこのままフェイドアウトではないと信じたい パーソナルコンピュータの父アラン・ケイが選ぶ「プログラマー必読の古典本」とは? https://gigazine.net/news/20190813-alan-kays-best-classic-book-programmers/ アラン・ケイ氏が「大ファンだ」と絶賛する本が、プログラミング言語LISPを生み出した ジョン・マッカーシー自身の手による解説書「LISP 1.5 Programmer's Manual」です。 アラン・ケイ氏によると、この本を読んで成長するためには「どうすべきなのか」 「実際にどうしているのか」を意識しながら本を読むだけではなく、13ページに書かれた 例を「自力で書き直す」ことが重要とのこと。 アラン・ケイ氏は「LISPは単なるプログラミング言語にとどまらず、思考を鍛えるのに最適な言語です」 と述べており、「LISP 1.5 Programmer's Manual」を「完璧な古典」だと絶賛しています。 LISP知らん人に勧めても判るのかね MITってschemeやめてpython教えてるんでしょ 紫のSICPやめてpythonの教科書になったのは知ってたけど 何年か前のことだよね > chicken scheme のサイト( www.call-cc.org ) が ここ数日ダウンしたままだ > 流石にこのままフェイドアウトではないと信じたい この件、googleの最新キャッシュ日付(2019年9月24日 12:18:42 GMT )を考えると もしかして "おま国" 的なアクセス制限されちゃってる? 確認ありがとうございます。 "おま環" (お前の環境だけだろ) のようですね... chicken scheme ( www.call-cc.org ) にアクセスできない件、スレ違い気味で申し訳ありません。 0. Googleのキャッシュから ⇒ ◯ (見えないよりマシ...) 1. ルーターのアクセスポート制限を解除 ⇒ × 2. プロバイダー設定( plala ネットバリアベーシック) をフィルタリングOFFに ⇒ × 3. VPN (L2TP/IPsec) で接続 ⇒ ◯ (繋がった!) とりあえず、こういう結果になりました。 plalaが規制してる/ plalaが規制されている どっちにせよこれ以上はどうにもならなそうです。 見れるようになったのでヨシとします。 sicpはそんなに良い本? どういうふうに良い本なのか教えてほしい >>92 俺もつながらん。 プロバイダは Biglobe jpドメインは拒否されてるのかもね 契約してる激安海外VPS経由でアクセスしたら見れたけど、プロバイダ経由だとpingも通らんわ >>95 私の場合は日本のISP(海外の出版社のサイトとかでアクセスした側の国を自動判別している場合は日本と判定される形の接続法)で インターネット接続しているけれどwww.call-cc.orgのHPやその下の様々なページは普通に見えるよ Common lispよりschemeの方がユーザ多いの? 一番人が多そうなのはracket? schemeは実装多すぎてどれを選べばいいのか分からん、 特定実装に依存すると いつか廃れたときに困る。RnRSやらsrfi-xx どこまで使えるのかマチマチだからね。 common lispは今のとこ sbcl にしとけば間違いなさそうな安心感がある >>99 ちゃんとメンテされている商用以外のフリーの処理系はSBCLしかないという… Scheme で安心感の強い処理系っていうと Racket とか Guile とかかな。 そう簡単に廃れなさそう。 Schemeの無料で使える処理系で例の大顰蹙買ったR6RS対応してるのってあるの? >>103 あるよ。 Racket Chez Vicare Sagittarius Ikarus IronScheme Ypsilon Mosh Larceny R6RS に準拠ってほどではないけど一部をサポートしているものとしては Guile BiwaScheme もある。 Sagittarius と Larceny は R7RS もサポート (R6RS と R7RS を混在させることも出来る) しているよ。 Vicare, Ikarus, Ypsilon は実質的に動きが無くなっているのでこれから使うのはやめた方がいいかもね。 なんでGaucheが出てこないんだ? R7RS準拠と書いてあるよ >>105 ここでは >>103 に対する回答なので R6RS の話をしてる。 >>104 お教え下さり、どうも有難うございました。 RacketもR6をサポートするようになってたんですね。 R6発表後も数年間はRacketはR6対応じゃなかったようなのでサポートする気がないのかと勝手に思い込んでました。 R7RS⊃R6RS⊃R5RS ではないんだっけか CommonLISPから何も学んでねーな Scheme はまだ未完成という意識がある気がするな。 だから実務指向な言語と違って現段階では互換性を重要視してない。 重要視はしてないけど突飛な変更が入ってるわけでもなくて、割と正統進化してると思うよ。 R6RS が異端なだけ。 その R6RS にしたところで R7RS と共存が可能な程度に近しいわけだし。 関数の値が最も0に近くなる引数を求めたい時、どう書けばいいんでしょう? 繰り返しで引数を少しずつ変えていけばいいのはわかるのですが、定石とかあるんですか? その関数が線形なのかとか微分可能なのかとか分からんとなぁ 微分可能ならニュートン法が簡単 そうでないなら、範囲 [ a , b ] をステップ幅 (b-a)/n で 暫定値を探る。(n:分割数) それが範囲の左右半分どちらにあるかに応じて値 a, b を更新、あとは再帰的に投入。 ステップ幅 が指定誤差未満になったら a を返して脱出 そのまま愚直に組むだけならそんなに長くならない。 >>113 の言ってる関数は数学の関数じゃなくてプログラムの関数の事でしょ… 多分線形でも微分可能でもないだろう 乱数使って適当な範囲で試行してずらしながら一番近そうな範囲を選択して絞り込んでいくという位しか思い付かない どちらの関数にせよ考え方は一緒じゃないかな。 値の変化が連続的でなければそのやり方では求められないし、連続的であっても極小値に落ち込んでしまう可能性がある。 関数がハッシュ計算するようなものだったら総当たりしかないのでは? 誰かと思ったらグレアムか 奴は口だけのポンコツになって久しいよ もう実装は無理 Yコンビネーターも辞めたとかなんとか… 詳しく知らないけど、引退かな? ポール・グレアム (54歳) 庵野秀明 (59歳) 引退するような歳か? arcだかはどうなったの まあどうでもいいんだけど グレアムは金には困らんのだから残りの人生は全部が趣味みたいなもんだろ。 引退もクソもねぇよ。 闇の書を永久封印するために暗躍しているのかもしれん。 fooもねえ、barもねえ hyperspecナニモノだ グラハムはハーバード、MIT人工知能研、イタリアの美術大出てるんでしょ? アメリカの大学は学費も相当かかる ビジネス始める前から「普通の奴等の上」を行ってる人なんだと思うなぁ 頭さえ良ければ、とか思うかもしれないが環境、友人は大事だよ ビアウェブのパートナーはMITの教授だよね、確か いまPLAIの8章をよんでいるんだけど、次のExerciseの不変条件と言うのがよく分からん・・ ttp://cs.brown.edu/courses/cs173/2012/book/mut-struct-vs-var.html#%28elem._%28chunk._~3cms-setbox.C-case~3e~3a1%29%29 ソースコードはこれ https://bitsend.jp/download/d7ebf31e84a7dc5d8b55a3e3b66ce803.html Storeに束縛を追加するのはbox、その束縛を参照するのはset-box!とunboxだけだから、 set-box!を評価するときに、ロケーションがStoreに存在しないことは無いように考えているんだけど、もっと数学的に 証明しなきゃいけないんですよねこれ・・ $ ros run * (+ 31000 33500 1000 2300 16500 300 1000 10100) 64700 おいおい,なんだこのメチャクチャな値 こんなんじゃ,まったく信頼できないんだが どうなってんだ しかも再現できないし $ ros version roswell 19.09.12.102(NO-GIT-REVISION) 正しい値は 95700 なのだが (- 95700 31000) が 64700 になることに気づいた 最初の引数,抜かしてんじゃん... REPL の + 関数,バグってるんだが それとも WSL がいけないのか? tmux がいけないのか? $ ros run -- --version SBCL 1.5.5 Gauche の 0.9.9 がリリースされたよー >>134 Lispworks 8 でる情報あったんですか? てっきり次は 7.2 かと。 Racket 7.6リリースされたよー https://blog.racket-lang.org/2020/02/racket-v7-6.html Chez Schemeの取り込みが進んで、プロダクション・レディになったそうな。 デフォルトにはまだなっていないようです。 SICPを勉強したくてschemeを一通り勉強したけど schemeが本当に好きになった 綺麗な言語だなと思ったのはschemeが初めて SICPで4.4論理プログラミングがでてきたけど、論理プログラム言語(Prolog)なんて 一生使わんのじゃないのか・・・?俺みたいな雑魚PGは特に。 そもそも俺はなんでインタプリタ作ってるんや・・・ >>146 SICP はコンピューターサイエンスの本だから、 いろんなパラダイムについて説明しているよ。 知ってれば便利なこともあるとは思うけど、 必ずしも日常的に役立つというものでもないのも確か。 prologはともかくユニフィケーションはパターンマッチでたまに使うかも 歴史、哲学、思想を勉強しても目の前の仕事には直結しない みたいなことなのかな PrologはSQLに近い(同じ?)という人もいるね 事実を列挙すれば解を求める処理をやってくれるってのは理想のひとつではあるよな。 実際にはには Prolog が答えを出すメカニズムを理解していないと 答えを (効率的に) 出しやすい事実を上手く与えられない場合もあるし、現実は厳しい……。 思うんだけどLispというと悟りとか、ゲーデル云々みたいな話がよく言われるけど Prologではあんまり関連付けて言われないですよね 上にもあるけどprologは論理がそのままプログラムになるっていわれてんだろ 似たようなもん hy面白いけどlisperにはrubyの方が人気なんだ >>152 > Prologではあんまり関連付けて言われないですよね Prologは「論理プログラミング言語」と呼ばれたりするけれど書かれたプログラムを実行可能にするためのプログラミング言語であるために 論理のための言語(つまり論理式を記述するための言語)とはかなり違ってしまっているからね その典型がPrologで動くプログラムを書く上で不可欠なカット “!” ね あれは本来の論理には対応物がなく論理とは全く縁のないコンストラクトだが カットを使わなければほとんどのPrologプログラムはまともに動かなくなってしまうだろう その点、Schemeから命令的な言語コンストラクトおよび標準手続きであるset!とset-car!, set-cdr!を除いた部分は 弱い(weak, つまりλ抽象の本体式中のβ-簡約基(redex)は簡約せずに放置しておく) 作用的順序(applicative order)の評価戦略(reduction strategy)のλ計算そのものだ call-ccは継続(continuation)というメタな(つまり意味論上の)値を対象レベルに持ち込むmeta-circular的な拡張であり Schemeに限らずLisp一般で広く採用されているS-式という構文は自分の構文に対する抽象構文の表現になっているから プログラムが自分自身(や同じ言語で書かれた他のプログラム)のソースコードを記述している言語を対象言語として 自分自身がそれを素直な形で操作できるメタ言語レベルの存在として振る舞えることになるからね 言い換えればS-式という表現形式のために括弧をやたらと多用させられるLisp言語では ソースコードをその抽象構文(木構造)と同型な形で記述させていると言っても良い だからLispのプログラムをLispで処理する場合には、C等のような普通のプログラミング言語で書かれたプログラムを処理する場合には 不可欠な字句解析や構文解析が実質上は不要なんだよ 何故ならば処理する側のLispプログラムにとって処理される側のLispコードは最初から抽象構文木と1:1対応する形式で提供される訳だから 正にゲーデルの不完全性定理で行っている形式化された論理のゲーデル数による表現とそれを原始再帰的函数や同述語を含むメタ論理のレベルで 処理する構造が、Lispの世界に対応していると言えるわけですよ 要するにPrologはメタ論理レベルのプログラミングが出来ないってこと? >>50 需要の問題だろ Lisp自体がマイナーで Common Lispでやっと本が出せる位なのに >>54 昔の一時期は妥当だったんだろうけど 今ならPythonの方が向いてるだろう >>57 >>58 要は人工知能というより記号処理なんだよ >>82 >>84 MITの件もあるし 今ならPythonでいいでしょ MITレベルの頭ならLispなんて すぐ読み書きできると思うが >>146 >論理プログラム言語(Prolog)なんて ほとんどのプログラマが 仕事では一生使わないだろうな? でも設計をする上で参考になる >>149 Prologの勉強は無駄ではないと思うが すぐ成果には結びつかないだろうね? でも長期的には流行りの言語やFWに飛びつくより 地力につながる可能性もあるだろう >>150 宣言型という点では近いけど言語としては同じじゃない ユニフィケーションやバックトラックの挙動があるから >>151 AIはディープラーニングが主流になったが それはそれとしてアレでPrologがもう少し 分かりやすければ日常的に使うんだけどな これどうやって書くんだってのが多すぎる >>156 Lispはメタプログラミングしやすいって理屈は分かるが 実際にそれでものすごい作業効率が上がるかは疑問だな? なぜんあらメジャーな言語はライブラリが充実してて それ使えば最初から書かなくても済むわけだから早い >>159 本当にできるかできないかは知らんが そういえばメタプロやってるって 声ほとんど聞いたことないな Lisp勢はマクロマクロうるさいのに hy マクロの入力にpair入れたのに マクロ実行時にunquoteするとlistに化けるバグがある気がする Clozure CL 1.12 がでてきた。 https://github.com/Clozure/ccl/releases/tag/v1.12 ぜんぜん 1.11 からバージョンあがらないから死んじゃったのかと思ったよ。 SBCL 2.0.4 リリースされたよ。RISC-V プロセッサに対応したのが目玉みたいだよ。 http://www.sbcl.org/news.html#2.0.4 Scheme の map 手続きについて、 手続きを適用する順序 (副作用が発生する順序) は仕様上は未規定ということになっています。 各処理系として保証するということは有りえるんですが、 Racket の場合は保証されていると読み取って良いでしょうか? https://docs.racket-lang.org/reference/pairs.html?q=map#%28def._%28%28lib._racket%2Fprivate%2Fmap..rkt%29._map%29%29 わざわざ "from the first elements to the last" という書き方をしているからには順序を意図しているように 解釈するのが自然かとは思うんですが、単に範囲を言っていると解釈できなくもないので、 英語と Racket に明るい方がいればご教示賜りたいです。 >>187 racket使ってるわけでも英語ができるわけでもないけど。 最初から最後までって範囲の話してるんじゃなかろうか。 順序の保証があるなら IN ORDER とか付きそうな気がする。 >>188 R5RS などでは手続きが各要素に適用される dynamic order は unspecified である というような表現になってるんですよ。 order という語が主語になってます。 https://docs.racket-lang.org/r5rs/r5rs-std/r5rs-Z-H-9.html?q=map#%25_idx_580 だからわざわざ変えた表現をするからには違うこと (順序が保証される) を言おうとしているんだろうと思いつつも、 明確に順序を強調してるわけでもないな……? というところで解釈に迷ってました。 私は R5RS (など) と言い回しが違うという点に引きずられていましたが、 "from the first elements to the last" というフレーズ単体で見ると範囲のニュアンス で捉える方が自然ですかね。 私自身はいずれにしても map の副作用の順序に期待しないんですが、 しばらく前に Qiita に投稿されていた記事の中で map の順序が効いてくるコードがあったので、 これってありなんかなぁと思ったという経緯です。 >>187 保証とはどういうことを指しているのだろう 将来仕様を変更しないとは書いていないのは確かなようだ racketでは引数の評価もleft to rightとは書いてあった schemeでもfor-eachは先頭から順番に評価する 実際に評価順の違いが観察できるのはchezかな >>189 > 私は R5RS (など) と言い回しが違うという点に引きずられていましたが、 > "from the first elements to the last" というフレーズ単体で見ると範囲のニュアンス > で捉える方が自然ですかね。 いや、違う。 R5RSとRacket Reference v7.6とでのmapが手続き(proc)を適用する要素の順番に関して言及しているのは 各々、以下の箇所だが、両者では明らかに全く異なる。 R5RS>The dynamic order in which proc is applied to the elements of the lists is unspecified. Racket>Applies proc to the elements of the lsts from the first elements to the last. R5RSは>>187 で君が述べていた通り、リストの要素への適用順序はunspecifiedだと明確に書いてある。 これに対してRacket v7.6ではprocをlstsの最初の要素から最後の要素へと適用すると書いてある、 つまりリストlstsの要素の並びの順番に手続きprocを適用して行くと明記している。 だからprocとして受け取った値を標準出力に書き出す手続きを渡せば、R5RSでは表示される要素の順番はどんな順序でも良いのに対して Racket v7.6では元のリストlstの要素の並び順に必ず表示せねばならない。 これは私の想像だが、R5RSでmapが手続きを適用する要素の順番を規定しないと明記しているのは長大なリストに対する並列処理を可能にするためだろう。 逆に言えば手続きの適用順序を確実に把握したい場合にはmapでなくfor-eachを使えというのがR5RSを定めたチームの言語設計上の意図だろう。 >>190 > 保証とはどういうことを指しているのだろう その言語仕様書のそのバージョンに準拠していると宣言している言語処理系は、それを守らねばならない(守っていなければバグだ)という意味だよ。 だから今の例では、Racket Reference v7.6準拠と処理系が宣言したら、その処理系はmapで手続きを適用する要素の順番を必ずリストの並び順に する義務が生ずる(Racket v7.6の定める言語仕様=Racket v7.6ユーザとの約束の順守を保証せねばならない)、ということだ。 当然ながら、言語仕様書のバージョンが変われば約束(つまり言語仕様による規定の内容)も変更され得る。 >>187 処理系によって(A B C)の評価順序が (1 2 3)だったり(3 1 2)だったり(3 2 1)だったりするから mapのようなリストで処理結果を返すような関数のクロージャ内では原則副作用は起こさないことが求められる for-eachみたいな初めから副作用を期待する関数はどう並べようが問題は起きない >>192 それは承知しているのです。 ここでは Racket のドキュメントをどう解釈すべきかというのが論点です。 >>191 > 最初の要素から最後の要素へと適用すると書いてある 順番に (in order) とは書いていません。 順序が意味を持つ箇所ではおおよそ order という語で強調しているのに それがないここでも順番であることを確信してよいほどに (英語のニュアンスとして) 自明でしょうか。 >>191 > 長大なリストに対する並列処理を可能にするためだろう 手続きの引数の評価順序については未規定ではあるものの "some sequential order of evaluation" という制約がついています。 https://docs.racket-lang.org/r5rs/r5rs-std/r5rs-Z-H-7.html#%_sec_4.1.3 ちょっとわかり難いんですが、これは「同時ではない (かのように動作する)」と解されるそうです。 たとえば (list (begin (display 'a) (display 'b) 1) (begin (display 'c) (display 'd) 2)) とあったときに表示は abcd か cdab のどちらかであり acbd だったり cabd だったりはしない ということです。 map についてはこういう制約は書かれてはいないものの、 順序は規定しないという文言は「既定はしないけどなんらかの順序を想定する」 とも読めなくもないので並列化を許しているとは言い切れない気がします。 副作用がないときに限っては並列化しても仕様に反しないのは間違いないですけど、 その場合は順序に関して有るとも無いとも書く必要がないんですよね。 どうせ観測できないので。 >>194 mapについては、まえからか、うしろからか好きな方で実装すればいいよ、程度のはなしだとおもってた。 継続を突っ込むとどうとかいうのがあったとおもうけどだれか解説pls >>195 継続については「call/cc は副作用を生じる」というひとことで説明できます。 副作用とは何かというのは色々なモデル化のやり方があってはっきりしたひとつの定義を 定められないみたいなんですが、この説明が納得感があって参考になると思います。 https://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3Acall%2Fcc%E3%81%A8%E5%89%AF%E4%BD%9C%E7%94%A8 副作用がないなら順序なんか考える必要はないんですよ。 どの順序で実行されようと並列であろうと (観測できる) 結果は同じなので順序を気にする意味がありません。 結果が同じにならない場合 (副作用がある場合) がどうあるべきか考えるから順序が効いてくるんです。 で、副作用がある手続きの中でも特に第一級継続は (観測できるだけでなく) 流れを変えることが出来るから どれが妥当なのか結論が出ないなぁってことです。 グラフかくのってどうしたらいい?gnuplotの🎺使うの? gnuplot使ったことないけど難しいのか? >>193 "from the first elements to the last"は最初の要素から最後の要素へだから当然ながらin orderの意味を含む もしも、上の表現を使ってin orderを保証しないことを意図する言語仕様があったら、 その言語仕様を書いた人間が英語(というよりも人間の使う言葉)の常識を知らないと言うべきレベルの代物 procの適用にin orderを保証したくないのならば"from the first elements to the last"などではなく、例えば “(map) Applies proc to every elements of the lsts exactly once”とでも書くべき というか、そもそもR5RSでのmapに関する表現をそのまま使えば良い >>194 なるほど、インターリーヴを起こしてはならない、ということですね 良い反例ですね、了解しました 確かにそれだと並列処理という話は排除されますね 実用性皆無の話だなschemeらしいや racketとの比較ならr6だと思うのだが しかもr7でなくr5とな scheme間でさえ移植性は低いんだからどんな挙動でも良いんじゃねえか racketはまだ実装が複数存在するような状況ではないらしいが schemeとは文化が違うんで実用性に舵切った仕切りになりそうね >>199 > "from the first elements to the last"は最初の要素から最後の要素へだから当然ながらin orderの意味を含む この説明は説明になってなかったですね ちゃんと書くと、前置詞fromとtoとを同時に使う場合、前者は動詞が表す行為の始点を、後者は終点を表す つまり > "from the first elements to the last" という表現は先頭の要素たちがprocをapplyするという行為は、その行為の始点が先頭要素で終点が末尾の要素となる経路から成るということ そうであるので、途中の要素に関しては193が心配している通り順序通り(in order)とは確かに書いていないけれど、 少なくとも最初に適用されるのは先頭要素たちで最後に適用されるのは最終要素だということは上の引用した英語句から確かだということ applyを行う最初と最後はそれぞれ先頭と末尾でなければならないのに途中はランダムでも可というのは不自然すぎる (なぜ最初と最後だけは変更を許さず先頭と末尾に確定させるのか?、ランダムを許すならば最初・最後も含め全部がランダム可にするのが自然) ということだ もし最初および最後だけはそれぞれ先頭および最後だけに限定し、それ以外の途中の順番だけは規定したくない、という極めて不自然な仕様にしたいならば 誤解させないように、「但し、最初・最後以外の途中の順番は自由で規定しない」という趣旨の語句を挟む必要がある そうこうしているうち Racket 7.7 リリースされたよ。 https://blog.racket-lang.org/2020/05/racket-v7-7.html 個人的なトピックス ・イミュータブルで高速なハッシュテーブルHAMT(hash array mapped trie)がインプリされた。 ・コンパイラの最適化でコードサイズ20%減。 ・GC1,2割高速化。 ・ドキュメント改善。 今の Racket は ChezScheme をバックエンドにしたやつと従来からのやつがどちらも配信されているけど、 これって将来的には一本化される予定ってあるのかな? hy言語をwindows10で使いたい pip install hyは成功するが コマンドプロンプトでhyと入力してもhyが実行されない 変なパスの設定がいる? >>204 管理者権限でインストールしたなら C:\Program Files\Python37\Scripts だけど、 ユーザ権限なら %LocalAppData%\Programs\Python の下のどこからしい。 https://www.indeed.com/q-Lisp-jobs.html ここで何度も募集かかってる企業って人が辞めるのも早いってこと? 防衛産業の企業は人気ないとかなのかな Common Lispは使い込まないと頭に入ってこないが Racketにはドキュメント読んだだけで頭にすっと入ってくる綺麗さがあった 最近のRacketって昔と同じ感じの綺麗なままなんだろうか 最近読んだRacketの() []の括弧を区別する方法のドキュメントがわかりにくくて RacketもCommonLispと同じなってしまって,これならCommon Lispでいいじゃん と思ったのだが > 最近読んだRacketの() []の括弧を区別する方法 racketがschemeから枝分かれして10年だがracketになるよりまえのr6rsからだろ たまにしか書かない程度ならなんでも良いだろ大袈裟だな Racket は元は教育用途で使われていたこともあってドキュメントはかなり整備されている部類だと思うが。 他の言語と比べてCommon Lispっぽい書き方、Schemeっぽい書き方ってどんな書き方ですかね そら末尾再帰をふんだんに使うとか変数はなるべく使わないとか CLっぽい書き方はマクロを使いまくった超絶技巧だろう Schemeっぽい書き方は兎に角無理矢理に再起呼び出しを使った超絶技巧な書き方だろう ダイナミックスコープ活用してるの見るとcommon lispだなぁって思う 括弧のやまがある時点でlispっぽい。あとはまあ、ラムダ式とかもほかに普及してきてるから、マクロかなぁ。 hy言語良いのにpython使いが良さをわかってくれない 見るからに検索に引っかからなそう 名前って大事だよね・・・ LispworksのprofessionalとhobbyistDVどう違うの? Lispworksのprofessional 32bitかhobbyistDV 64bitどっち買うか迷う >>218 hobbyistDVは業務で使うことはできんくて作成したEXEも配布できないです professionalは業務用途で無制限の配布ライセンス込みです 業務で使用するEXEの配布をするのが目的かどうかでしょうね Pythonぽい独自言語をpythonに変換したい Lispは使わずpythonのパーサー使った方が楽だろうか >>221 PythonぽいならPythonに変換すればいいだろ! racketでデバッグするのは DrRacketを使うしかない? コマンドラインでデバッグできたらいいんだが デバッグってどういうレベルのことだろ。 REPL はあるんだからそこから実行してみればいいんじゃね。 Python のpandasが日時関係処理充実しすぎて手放せない しかしlispで似たことできるなら乗り換えたい Pandasのデータからガントチャート作ってくれさえすればいいのだけど Lispに相当するものないでしょうか 既に手放せないほどのものを漠然としたlispへの印象で乗り換えたら全てが満足したという話は寡聞にして知らない pandasはRの劣化コピーで Rはschemeと相性がいいから Rに乗り換えると良いのでは? 邪道かもしれないが hy使えばlisp でpandas使える lispは他の言語に寄生して生きていくしかないね pyレベルのライブラリなんて期待できないし 時期にcommon lisp でできるようになるかも 最近numpyのcommonlisp版作るnumcl ってプロジェクトあるし カッコなし、字下げか空白だけで繋ぐlispとかあったら3レス分くらい流行るかも >>233 たとえば(/(+ 1 2 3 4 5) 5)はどうなるの / + 1 2 3 4 5 5 こうかな? 無限ループ ((lambda(x)(x x))(lambda(x)(x x))) こういうのだと字下げだけでは対応できないから補助キーワードが必要になる call lambda x call x x lambda x call x x こうかな 無意味に行数が増える時点で自分的に却下だけど >>233-235 Scheme での提案として存在はする。 https://srfi.schemers.org/srfi-49/srfi-49.html でも使われているのを見たことは無いなー。 そこまで括弧が嫌いならあえて Lisp の系統の言語を使わなくても 他の選択肢はいくらでもあるわけだしな。 なんていうか、何も変わらんなあ… カッコがないのにカッコが見える AST をそのままかけるのが lisp の欠点であるし強みでもあるんだから、それが嫌なら他言語で AST をいじれるライブラリーを使ってかけって話だしね >>237 Indentation-sensitive syntax ( I 式) は S 式との間での単純な変換規則なので S 式を忘れて書けるほどの抽象度ではないという感覚はわかる。 むしろ脳内で S 式に展開しようとしてしまって変に負荷がかかる感じがある。 最初から I 式で学んでいればまた違う感覚なのかもしれないけど、 そういう学習ルートは確立してないしなぁ。 趣味プログラマでLispしか知らないんだけど、 みんなはやりたいことの応じて言語を使い分けてんの? >>240 そりゃ使い分ける たとえば速さや移植性を重視するときは今でもCが手放せない 一時Rustも使ってみたけどLLVMに縛られるのでCに戻った あと複雑なことをしないグループログラムだとPythonが楽 ネットを探せば必要なライブラリはだいたい手に入る なんだかんだで C だけは手放せない感じはあるかな。 低レイヤを支配してるのはやっぱ C だわ。 それもこれからは一部は Go や Rust に置き換わっていくとは思うけど。 >>242 >これからは一部は Go や Rust に置き換わっていくとは思うけど。 …… C で記述された lib を Go や Rust は気軽にコールできるのですか? まさか… >>243 そりゃ当然できるよ。 呼び出すだけなら難しい手間は何もない。 ただ、 C の側のコードの保証が弱すぎる。 たとえば (C側で) malloc で確保したメモリは Go や Rust の側でいつ解放するのが 正しいのかわからないのでそのあたりのつじつま合わせは手動で頑張るしかない。 多少のラッパーを書く必要はあったりする。 趣味でやっててhyperspec引きながらやりたいことできるようにはなってきたんだけど、 ガッコで系統的勉強したわけじゃないし、自分でやっててもうちょっとええ方法あってもいいよなあとか思うんだけど、 なんかいい勉強方法ある?PAIPはイヤ。 SICPとCTMCPとかどうかな。 LISPじゃなくてプログラミング全般を体系的に学ぶ話になるけど。 日本語で書かれた Common Lisp の本はほとんど絶版になっちゃってるしなぁ……。 ガチの初心者なら Land of Lisp とかもアリかと思うけど、自分でリファレンスを調べられる程度ということになると 逆にちょうどよい書籍ってあまりない感じだよね。 使ってる処理系のソースを読んだり処理系を作ってみる on lisp好き let over lamda変態チックで好き でも今はsmalltalkerになってしまったよ lolのワクワク感はすごい、とりあえず写経したけど理解が追いついてないのでg!無し版を実装中 初心者だけどlisp関連の良書はかなりネットに上がってるよね、cltl2、onlisp,、lol、sicpなどなど 初心者だけど評判良さそうだからとホイホイ買ったのをネットで見付けてはヘコんでる みんな、fletとかlabels使うの? 俺全然使わないんだけど。 labelsはよく使う fletはネストが深くなって読みにくくなるので嫌い スキーム手習いなんですけど 前の章までしっかり理解してから読み進めてくださいとのことですが 継続渡しから急に難しく感じます そこまでが理解できてないってこと?? >>254 私はその本を持っていないから具体的なことはわからんけど、 不慣れな初心者にとって継続渡しは実際に難しいと思う。 でも「難しい」だけで「理解できない」わけじゃないならたぶん前章まで一応の理解はできてるんじゃないかな。 継続渡しスタイルに書き換える方法がわからないではなくて継続渡しスタイルに書き換える意味がわからないからかな? ああ。 なるほど。 継続渡し形式でプログラムを書くことは実際にまず無いし便利でもないので その点では意味不明と感じられても仕方がないことではあるな。 後の話 (第一級継続) に繋がる前振りだと思うので、 この時点ではパズルとでも思ってとりあえずこなすしかないわ。 >>256 そんな感じです 例で挙げられてる渡される側の関数が何したいのかよくわからないし 多分、教育的に意図的にそうしてるのかもしれないけど その意図がいまいちわからなくてモヤモヤするんですよね >>257 一応追っかけることは出来るんですが 直で継続教えてもらったほうがわかりやすいような気がするのですが… つまり、読めてないってことなんだろうなと 俺はsicpでcall-cc出てきてもさっぱり理解できなかったけど、 onlispで継続の実装を読んでやっと理解できた。 継続でできることってのは超高性能goto(?)が使えるようになることなんだけど、 そのためには継続渡しスタイルで今までの状態(実際はクロージャだけど)の全部または一部を渡して計算をしていくんだよ。 渡されたクロージャのどれかを呼び出す事によって以前の状態に復帰できる。 みたいなことだったと思う。空覚えなんで誰か突っ込んでね。 それと本のわからんところのコードを貼れば誰か解説してくれんじゃない。 超高性能gotoって書いてるのは普通の言語のgotoって同じ関数内でしかジャンプできないんだけど、 継続なら安全に関数間でもジャンプできるっていう意味。 継続はわかってしまえば当たり前でどこにでも存在してるんだけど、 継続を考えたやつは本当頭いいわとおもった。 >>258 「プログラミング言語 Scheme」や「プログラミング Gauche」でもそういう手順で説明されている。 ネット上で見つかる解説でもよくあるパターン。 http://www.shido.info/lisp/scheme_cc.html http://www.nct9.ne.jp/m_hiroi/func/abcscm20.html ようするに定番なんですわ……。 Landin's J operator の糖衣みたいなもんじゃ? call-ccって. 普段cl書きなんでこのまま動くか知らんが、雰囲気はたぶん (define call/cc (lambda (func) (func (J (lambda x x))) >>258 継続渡しの初期の用例にヒューイットのアクター理論があるように 並行性が絡むと有り難いこともあるけど Schemeの規格にそういうのがないから Gaucheを使ったウェブアプリサーバーにKahuaってのがあったけど あれが継続渡しを使ってたはず そういう発想はschemeっぽくないと思う これはコンピュータにかける魔法言語なんだからぁ schemeは知らんがclでcall/ccエミュってるぞ、こういうのは勉強になる 閲覧無料の論文もたくさん出てくるし、確かrosetta code(だったか)に少し残念だけど動く実装載ってた気がする デフォでdynamic scopeのclの方が(エミュる)のはむしろ簡単な気がする clデフォでdynamic scopeじゃないな どういうcps実装なん dr.schemeを起動したらada lavelaceが表示された。12月10日が誕生日らしい。 Software Design for Flexibility How to Avoid Programming Yourself into a Corner https://mitpress.mit.edu/books/software-design-flexibility >>6 この冬、職場から休暇をいただいたことをきっかけに a little schemer への再チャレンジを始めました 2週間では >>6 までは進めなかったけれども、しつこくてべたな精読を今後も継続することにしました‥‥個人的な話でごめんなさい 2018 年の話題へスレ内でアンカーできるあたり、だいぶん進みの遅いスレだなぁ…… ところで先月、 Gauche の 0.9.10 がリリースされたよ。 最近Clojureをさわって思ったんだけど、コンスって必要?ただのリストじゃだめなん? 最近はlistと言いつつ狭義のlist(linked)じゃなくlinked arrayな事が多いけどclosureもそれかな?(触ってないごめん (三十年前の言語だけど)Pythonのコード読んだけどそうだったはず 計算量の議論なんかだとlinked listとarrayは一長一短ってことになってるが、アーキテクチャと殆どのデータの性質によって連結配列が実質万能なんで仕方ないね 抽象データ型としてcons/car/cdrというインターフェイスを提供してるなら十分lispだよ consがなんでそんな大事なのかというと、普通に使われる抽象データ型の中では最も表現力が高いこと 単に自由に伸ばせるリストのようなモノでは、構文上バイナリツリーより複雑な構造は書きにくい(ポインタを駆使しない限り) consが提供されていれば自然に平面DAGが、そしてちょっと読みにくくなる程度で任意のグラフが表現できる 化学構造やグラフをconsで扱ってるけどほんと便利だよ 書きにくい/やすい、ってのは環や分岐がcarとcdrとconsだけで書けるって意味ね これらのアクセサが提供されていない言語、例えはPythonやcではリストのインデックスに対応する参照/ポインタを明示的に取り出して記録し、アドレスを格納する必要がある またアルゴリズムにかける時に素の型とポインタ型を区別して場合分けする必要まである そのまま文字列として吐くのも実装しなくていいし(リンク先のインデックス表示が読みやすいとは言わないが) PythonなんかだとオブジェクトがリッチなのでnetworkXのような巨大なライブラリを使えば木を超えた表現も自然にかけるので、一時浮気をしたが… 形式言語の分野だともう線形な文字列や二分木の括弧文法は研究され尽くしてるので、グラフ文法なんかが最近流行ってlisp系言語で論文書かれてるね 連投してごめんだけど、環や分岐がポインタ使わず自在に描けるのはかしこいsetfの寄与もある、って書き忘れてた(schemeはset-cdr!だっけ) 念のため >>279 興味深い内容をありがとう ちょこちょこ遊んでいるだけなので到底そこまで使いこなせる気がしないけど、 データをプログラム中にストレートに表現して操作できるというのはよく分かる 他の言語だとデータを保持するためにわざわざクラス設計からしないと いけないような強迫観念にかられるけど、lispはそういう気にならない データ型を定義しないのはトイプログラムだけだけどな Lispはリストだけ使うのが通だとか善意で広めないでくれよ (カッチリした型を中心にする言語に比べれば) 最初はラフに 書き始められるというのはあると思うよ。 でも、そのままだと千行くらいの規模でももうだいぶんキツいんじゃないかな。 人によってはコードを書く腕力 (?) というか強引に行けちゃう人もいるけど、 雑に試行錯誤できるということとそこから部品として確立するのは別の段階なので、 試行錯誤で弄ってるときと同じノリでどんどん拡大していったら すぐわけわからんようになる。 世間で思われているよりは型定義はすると私も思う。 そういう後付けのボイラープーレトにはCLOSやジェネリックよりコンパイラマクロが便利ね ここでいう型定義はdeftypeのことを指しているのでしょうか Common Lisp でなら deftype とか defclass とかいったものを使うことになるんかな。 私は Scheme しか知らんからよくわからんけど。 >>288 defgeneric/methodは勢いで書き上げた触りたくないコードに機能追加するにはコード触らなくちゃならない 型の付いていない複雑なconsはどうせdestructuring-bindして振り分けるしかないんだから分けてdefmethodする利点もない define-compiler-macroなら一切既存のコードに触れる必要は無いからすごく便利だよ 既存のライブラリに手を入れたいけど、直接書き換えるとアップグレードで無かった事にされるから嫌、って時にも活躍する もちろんリファクタリング出来るならした方がいいけど、取り敢えず動けば良い時の話ね この場合、 alist はどっち側に分類されるのかな… 個人的にはだいたい alist で済ませてるけど。 Lisp 的なスタイルだとかなり短いサイクルで開発が進むので、 リファクタリングしないまま手の付けられないほどグダグダになった状態は単にサイクルを 回すのが下手なように思うんだけど。 まあ上手くいってないときでもどうにかする方法があるのはありがたい話ではあるけどさ。 既存のコードには手を入れず振る舞いだけに着目して付け足して行くってスタイルはaspect oriented programmingとか言うんだっけな まあ盲で付け足してゆく事と同義ではないが >>290 plistの方が好きだな、pprintでkey-valのカラムに並べられるし、alistが要求されれば一段flattenすれば済む consの数も同じだし好みでは ただvalがlistだと(a . (b c))=(a b c)とformatされてしまうので(a . ((b c))) = (a . (b c))と書いてる aとリストのペアなので意味的にも正しいはず 最後は(a (b c))が正しい、.が余計だった なんかid変わってたけど289です 真意を掴めてなかった感がある alist-pとplist-pを定義してる、よく見るし受け入れられてるイディオムだと思う deftypeしておくといい すると振り分けをdefmethodに任せる事が出来る deftypeしたtypeはclassじゃないからdefmethodできない コンパイラマクロはプログラムの意味をかえたらいかんし パッチするなら別定義のファイルを追加でloadすれば上書きされるのでコンパイラマクロする意味0 嘘ノウハウいらないです・・・ 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 ) …に展開される http://www-formal.stanford.edu/jmc/recursive.html pdf17p evalのボトムケースでもある大事なassoc、俺にはplist版は思いつかない evenpが欲しいところだけど算術の定義がまだだし… clのcx^nrがn=4までなのもcaddarまで使ってるからだろうかね ffとかappqとか見慣れない面白関数出てきて面白かった first/restは単なるエイリアスでなくL-exp(線形リスプ?)における相似物としてちゃんと別に定義されてるとかも あとpairがpairlisに改称した理由とか気になってる、次は1.5マニュアル読むか 小並感 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とか定義しとくと便利ね jmcはラムダ教徒だったろうになあ いくらlispが形式言語処理向けとはいえ、機械的に処理するには置換が面倒過ぎる >>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を使う限りは循環定義だな 誤解してた M式apply[f; args]の引数はシンボルなのでS式のapplyに渡ってくるのはfunction fじゃなくてシンボルfか グローバルでdefunしたfなら多分呼べるはず、試してないけど cons-car-cdr公理主義者への反発として最近妙に感心してしまったポエムを貼っとく https://arxiv.org/pdf/1507.05956 本当の基本関数はc、a、d、rでした paulのon lispに載ってる(explode 'bomb) → (B O M B)がハマりそうと思い、実装してみたは良いけどなんに使うんだコレ… 楽しいからいいか cxrとconsは表裏一体なので片手落ち r•c = idになるからこそ car•cdr = c•a•r•c•d•r = ca•(r•c)•dr = cadr と読める訳であって cxr • cons= id を成り立たせるにはcxons = id となるようなo, n, sも定義せねばならない 後はまかせた わたばさんのところ見て知ったけど 井田昌之先生のHPで bit 1996-4、5月号、Guy L. Steele Jr.『Scheme 過去◇現在◇未来』(訳 井田昌之) などの歴史資料PDFが読めるね Racket のメジャーリリース。 https://blog.racket-lang.org/2021/02/racket-v8-0.html ついに Chez Scheme の実行エンジンを組み込んだものがデフォになった。 普通のやつらを超えろおじさんのarcヲチするのにちょっとracketしてるけどフレンドリーかつ尖ってるね どんどん尖ってゆけ >>309 現在の俺がもしjmcだったら?とか言い出したので見限った 今ざっと目を通しても目新しいところ、興奮するところが全然ないんだなこれが https://sep.yimg.com/ty/cdn/paulgraham/bellanguage.txt ofは便利くらいの感想しか出ない あと整数nをnth nへオバロは、逆なんじゃないかな? push n へオバロならforthライクに発展できるのに おじさんは自分に求められてるのは変態テクニックやインスピレーションだと自覚しろ >>310 言語が自分自身を書くことが出来る、ということをよりうまくやれれば ってことでしょ lisp1.5マニュアルを彼なりにアップデートしたいんだよ 関数やマウロの実体もリストというのはだいぶん振り切れていると思うがおまえらには目新しくはないのか>bel >>313 むしろ昔ながら/手抜きlispがそんなもんでは lit(eral)はマッカーシーのappqだし、elispは対話モードならちゃんとcarでlambdaが取れる 後は語り尽くされたlisp1/2の分化の話になるのでその辺はググって 補足 elの挙動は完全にバグいので忘れた方がいい、一方で関数実体はリストのサブタイプではないとヒューリスティックに判定されるのでそもそもill-defined アラン・ケイもそれを自分でやってみようとすることが重要だと言ってる 原始関数が変われば何もかもが変わるわけだから 変わった世界が良いのか悪いのか、は自己言及がどれだけよく出来てるかどうか ということだと思うんだけど つまり、僕らが使いやすいと感じるかどうかではなく 未来にそれに慣れた人たちがより効率の良い開発が出来るかどうか で、グレアムは自分なりにBelは良く出来てると思ってるんだろう オレにはよくわからんがw グレアムが現役プログラマだった時代なら実務に全振りしただろうが、今は投資する側の立場だからね。 投資に技術的な知見を活かしてはいるんだろうけど、道楽が出来るんだろう。 レディットで実装した人いるね 確かに使われてみなければ分からん事もたくさんあるので使ってみたい、まあ、そのうちね… 原典からlit=appqを引用(復古)するのなら、read&eval結果を示すのでなく、各々の挙動についてイメージできるように書いてほしい とりわけlitは、302のレスにあるdefunをdefmacroに置き換えた定義(その場合(lit a b c)と記述できる)であっても、 より強力なreader macroによる、定義(e.g.quote)でも実装できるのだから、なおさら でもグラハムは尊敬してるよ、著書もエッセイ以外紙版で全部持ってるし、啓蒙家としての実績を差し引いてもトップクラスのハッカーであるのは間違いない >>319 言葉足らずでした clは基本的にapplyへマクロを渡せないから、or/andに対応したsome/everyが提供されてるわけだけど、展開効率を無視すればread時に関数へすり替えるワークアラウンドで実現できる そこが売りなんだからもうちょっと仔細を、と ・知能は高い ・こまかい技術用語をちりばめてくるので詳しそうと思わせる ・言語仕様と歴史的経緯と個人研究の区別をつける意識がない ・検証するとトータルとしては話が嘘 こまったもんだ 関数がリストで表せるからatomじゃないってのは気持ち悪いな 別にどんな言語であろうと関数定義はトークンの並び≒リストで書けるわで 論理学では関数や述語はそのシンボルと引数のリストとして書かれるにも関わらずatomと定義される、あんまり明るくないんでなんでそうするのかは知らんが ELisp だと、一部の関数は本当にリストとして保持されてたりするんだよね。 ラムダ式そのままの形で。 だから car や setcar とかで中身にアクセスできちゃったり。 elのfunctionはid関数っていうね…知りたくなかった 関数定義をいじくりたいならformとして持ち回って、invokeする時にfunction噛ますのがベストプラクティスと思うよ、わりとよく見る あ、後半はちゃんと関数を理論と整合するatomとして扱うlisp(clとか)への言及です linuxでdr.schemeがちゃんと表示してくれなくて追加パッケージも入れられない (表示が崩れてまともにサブウインドウが開いてくれない) どころか終了すらまともに出来ないので、、、 探したらgeiser(Emacs拡張?)というのがあって それ入れたらEmacsからracket使えるようになった(≧∇≦)/ 追加バックはコマンドラインから入れられた これで充実した春休みが送れそうだぞ Happy Hacking! maclispのpitman/moonual読んでるけどシンボル操作系ユティリティが充実してて楽しい、ちまちまclへ移植 そんなのもうたくさん誰かやってるだろって?絶対にググらないぞ 誰かがここに検索結果を貼る可能性を考えなかったのが敗因でした gosh> '() () racket> '() '() (。・_・。)…? >>331 Racket でも (write '()) としたら quote は付かない。 repl が quote を付けてる。 空リストの外部表現は () が正しい。 racket> '() '()racket> '() になる…… 訂正 racket> '() ()racket> になる…… すんません、再度訂正 racket>(write '()) ()racket> になります replに代わってrpeplを提唱したい 意外とreadは仕事をしている clだけどread-from-stringにはいつもお世話になる 連投してスレ汚しすんませんでした こんなのあるんだね https://en.scratch-wiki.info/wiki/Snap!_ (programming_language)#First_Class_Continuations Snap!: Scheme Disguised as Scratch https://youtu.be/wtUMvx9mvm4 Lispへの憧憬 https://xtech.nikkei.com/it/article/COLUMN/20090324/327085/ Lispに対する偏見、エリートコンプレックスを赤裸々に吐露していて参考になった すこし弄れるからといってエリート意識持っていたりするのも同じ事なんだよね そこに本質的な差は無いし、能力的な差も殆どない >>339 なんかカッコいい感じは分かるけど、なんでそうなのかは分からん Fortranはすげー科学者がみんな使ってて技術的にも常に(今も、Fortran2020を見よ)最先端だけど、別にFortranはカッコよくないと思うし どういう心理なんだろ 思うに、使ってる層のエリート度で考えるとFortranと変わらん 思うに、単純にコードの見た目がalien technologyっぽいかだろ by an alien 大事なことなので2回思ってしまった… 見た目は大事ってことじゃね ところで記事に挙がってるJava、cl/scm、(モダン)Fortranの全てにガッツリ関わってるSteele先生すげーな 十年前の記事だけど状況はだいぶん変化したのでLispへの憧憬などというものがもう成り立ってない・・ 十年前に書き込んでくれ・・ なあにlispの本質は60年前から変わってないさ lispに直接関わる事じゃないんだけど、ちょっとよろしいかしら ISLISPなるものの規格を読むのにjisc.go.jpに登録しなくちゃならないんだけど、pcからもスマホからも"障害が発生しました"と怒られて進めないんだけど、俺だけ? ちなみに一月前にも試して同じだった フリーな規格なのでhtml版読めるとこもあるけど、一応pdfもと 一部の日本人が布教に熱心で検索にかかりまくるから胡散臭くて敬遠してたんだが、少なくとも初期はcl委員が関わってるし由緒はあるんだよな 無難なlispだが、大体スーパーセットなclにアクティブですごい処理系沢山ある限り絶対流行らんが あんまり布教頑張るとネガキャンに見えるぞ… >>338 vimだと階層に合わせて背景塗り分けるプラグインとかあるね Peirce(パースの法則の人)も初めはlogical graphと言う円で囲む二次元言語を考えてたんだが、今言及されるときはテキスト表現で()になってる(そして読みやすい) 歴史はめぐるってか ちなみにlispと見た目が似てるからってパーサを書いたが、やはり親和性が高い 面白いのでオススメ コードエディタじゃなくて残念なんだけど、愛用してるOneNoteのテキストのドラッグが()ごとドラッグしてくれるのに気づいた まあいつものMSのお節介なんですけどね 本来の用途である物書きでは選択範囲を自由に決めさせてくれないイライラ要素 規格っつーのは多少の粗があっても皆で統一したほうが便利だというもんなんで、 ユーザー規模がないものは規格化が活きてこない。 ISLISPでコードが書いてあってもオレオレLISPで書いてあるのと大差ないんだよ。 共通の知識になってないから。 ISLISP の仕様自体が悪いわけではないし劣っているわけでもないと思うんだけど、 最初に広められなかったらこれから広まるってことはもう無いんだろうな。 それはそれでいいんじゃね。 細々とやっていくのが好きな人もいるんだろ。 30年事足りるほど十分カバーしてるclってすごいよな(実働は1980年初頭だからもっと?) まあマルチスレッドあたりの仕様がバラバラなので、そこをしっかり決めてくれるMACLISP風規格があれば、俺はポッと出でも支持するんだが >>351 Scheme で言う SRFI に相当するものとして Common Lisp にも CDR (Common Lisp Document Repository) があるんだが、 Common Lisp は Scheme よりも実務主義というか話し合いするよりも動くライブラリを置いときゃいいだろみたいな文化があって 共通仕様の策定に熱心ではないような気がするな。 >>352 今誰が主導してるかと訊かれて、答えに詰まるのは特異な状況だとは思う 商用(持ってないけど)ですら保守的にみえる ぬるま湯に浸かるのを良しとしないISLISPの人を讃えたい フリーでまともな処理系待ってるから出来たら起こしてくれよな!(讃えるだけ) でもミンスキーは言ってたよ 表情や仕草が人間ぽいものはたくさん作られたが、 福島の震災で作業できるロボットは創り出せなかった もう何十年も止まったままだ って SRFI出るや否や写経と称してシュババとクオリティ実装するclerが結構居るし、必要とあらば足りるしな quicklispにも結構載ってるよね、clに混ぜるのは違和感あるからあくまでお手本としてアイデアを拝借するだけだが() scheme処理系も多くのSRFIを標準で揃えてるわけじゃないから(ポートは容易だろうが)、やっぱまとめ役が居ないことに尽きる qlがやる気出さないかな >>353 Common Lisp や ISLISP のワーキンググループは解散してるはず。 規格としての主導者は現時点で存在しないよ。 制度の詳細は知らんから再開できるのかもしれんけど。 SRFI や CDR は (英語がわかるなら!) 誰でも提出できるし、 議論が尽くされたと思ったときに決定稿に (あるいは撤回を) していい。 ユーザーコミュニティの中に文書の置き場と相談の場所があるだけなので、 誰かが可否を決定してるわけではない。 主導者がいないっつってもコミュニティで議論してたらだいたい「いつもの面子」みたいにはなるだろうけどな。 つまり SRFI や CDR で決定稿になっても権威が与えられるわけではないので、 そんなプロセスを経ずとも適当にライブラリを作って皆が使ったり使わなかったりして デファクトスタンダードが決まっていけばそれでいいんちゃうの? という考え方もあって、 Common Lisp は割とそういう空気っぽい。 Common Lisp のことはそれほど知らない (Scheme についてもあまり知らないけど) ので間違ってたら指摘してね。 ところで IEEE の Scheme は期限を過ぎても更新せずにそのまま廃版になってたみたいね。 https://standards.ieee.org/standard/1178-1990.html 知らんかった。 元から参照しているやつはあんまりいなかっただろうし ステータスが Withdrawn になったからといって何か変わるわけでもないけどさ。 generaはwikipedia読んだ程度だけど随分先進的そうだ mac/lml/clまぜこぜだそうな >>360 みたいな感じでマウスで弄ったりカーソル置くと引数やdocがポップアップしたり オンラインヘルプ大好き人間としては興味あり まあ今時のソフト無くてもテキスト書くくらいなら十分使えそう 試したらレポる(たぶん >>361 詳細にドキュメント化されていて迷うことは無さそうだけど、これで手軽ってどんだけ良く訓練されてんだよw lisp machine/generaではcやFortranもlisp実装なんだよね 性能はさておきとても興味深い 権利的に大丈夫なのかが気掛かりだ Symbolics(のようなもの、symbolics-dks.com)はまだホームページ持っててソフト売ってるわけで 実働してるかは怪しいが lisp machineのVMもいつまで動くやら、動作報告のあるブロブのビルド方法は不明、linuxのバージョン上がればバイナリ互換性が失われるかもしれない 近いうちにロストテクノロジーになるなこれ linuxも一応abiの規定あるけど同じアーキテクチャでも違うディストロでそのまま動くとは限らんしな とりあえずクローンした気がする(気がするだけ) winならx86系でさえあれば安泰なんだが、generaのXインターフェイス使ってるぽいし無理そうだよなあ うちでは代々バイナリをコピペし継いだoffice95がwin10でバリバリ元気に働いてるよ Alto→NextStep→OSXがコンシューマ向けになって成功してるのに Interlisp-D、Symbolicsは(パンピー的には)伝説のマシンのままなのはどうしてなんだぜ Next, OpenStepを元にしたGNU/Stepというのもあるけど GNU/HURDが完成したら、Lispマシンぽいことやるんでしょうかね… Objective-Cならぬ、Lispective-C(仮称)で GNUは、というかストールマンが目指してるのはフリーな(自由な)CとLispの環境だと思うんだよね guileをゴリ推してるけどなにそれ状態だよなー 特段良いとは思わないけどlisp押ししてくれる貴重な権力者 正直C協調性だとか拡張向きだとか今時普通なんで売れないと思います 応援のつもりで一応入れてる ちゃんとダウンロード数カウントしてるか知らんが 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.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる