2 ポイント 投稿者 GN⁺ 2024-04-22 | 1件のコメント | WhatsAppで共有
  • Racketは言語指向プログラミングを中核に据えた成熟した言語で、一般的なアプリケーション開発と新しい言語の作成を同じエコシステム内で扱う
  • 中核は**マクロと#lang**であり、新しい構文・ドメイン特化言語・既存の表層文法をライブラリのように作成し、モジュール単位で利用できる
  • Webサーバー、データベース、数学・統計、GUI、科学シミュレーションまで含む標準ライブラリと数千のパッケージにより、汎用開発の範囲を広げている
  • Typed Racket、コントラクト、オブジェクトシステム、DrRacket IDEがあわせて提供され、関数型コードとオブジェクト指向コンポーネント、漸進的型付けを必要に応じて組み合わせられる
  • Racketは単なるLisp系言語ではなく、各問題領域に合った言語を作り、実行・編集・ツール支援までつなげようとする開発環境に近い

言語指向プログラミングのためのRacket

  • Racketは「Racket, the Programming Language」と「Racket, the Language-Oriented Programming Language」の両方を掲げるプログラミング言語である
  • Racket version 9.2が利用可能
  • 初期からWindows、macOS、Linuxでクロスプラットフォームのグラフィカルプログラミングをサポートしてきた成熟した製品である
  • 基本的な開発機能には、パッケージ管理、GUI、スタンドアロン実行バイナリ、外部インターフェースまで含まれる

一般的なアプリケーション開発の範囲

  • Racketは、Webサーバーアプリケーションから数学、科学シミュレーションソフトウェアまで扱うライブラリ群を備えている
  • 代表的なドキュメントとライブラリの範囲は次のとおり
  • クロスプラットフォームGUIツールボックスWebサーバーが基本エコシステムに含まれる
  • 数千の追加パッケージは単一コマンドでインストールできる
    • 例として、3D graphics、Bluetooth socket connector、color maps、data structures、educational software、games、quantum-random number generator、scientific simulations、web script testingなどがある
  • #lang racket/guiの例では、GUI方言で小さな数字当てゲームを実装し、複数の言語機能をあわせて使用する

マクロで拡張される言語

  • Racketプログラマーはマクロで独自のループ構文や新しい構文を定義できる
  • 新しい構文は手続き、メソッド、クラスのように追加され、カスタム構文をRacket式や定義に書き換える規則を作ればよい
  • 小さなマクロは、他の機能では処理しにくい繰り返しコードの削減に役立つ
    • 作業実行時間を計測するtime-it構文を定義できる
    • 反復的なlambda使用を避けられる
    • マクロは通常の関数のようにモジュールからexportされる
  • マクロシステム全体では、複数のマクロが協調する構造も作れる
  • Racketは関数型言語だが、当初からclasses and objects, mixins and traitsというサブ言語を提供している
  • Javaに似たクラスシステムはマクロベースのライブラリとして実装されており、コア言語の別個のサポートなしに動作する

#langとドメイン特化言語

  • Racketは、プログラマーが各モジュールを適切な言語で記述できるようにする言語を作るための言語を志向している
  • #lang typed/racketの例では、StringNumberのunion type、occurrence typing、リストのフィルタリングを使用する
  • #lang scribble/baseの例では、PDFまたはHTML文書を生成する文書言語を扱う
  • #lang datalogの例では、parentancestorの関係を定義し問い合わせるDatalog文法を使用する
  • 新しい言語はIDEウィンドウで作成し、別のIDEウィンドウでその言語のモジュールを実行でき、設定・プロジェクトファイル・外部ツールは不要
  • Racket利用者は主に括弧構文を使うが、Datalogのようにコンマや波括弧が必要な既存の表層文法も作成できる
  • parsing packagesを使えば、任意の文法を括弧ベースの言語へマッピングし、Racketマクロシステムで通常のRacketへコンパイルできる

DrRacketと開発エコシステム

  • Racketは独自IDEのDrRacketを提供しており、識別子の上にマウスを置くと定義位置まで矢印を描く機能がある
  • Typed Racketのような代替言語を使う場合でも、DrRacketの編集支援を活用できる
  • Racketマクロは、複雑なマクロや新しい言語を作るマクロでも十分なソース情報を記録・伝播できるため、DrRacketが新言語機能を理解しているかのように動作できる
  • 主な開発支援は次のとおり
  • エコシステムのリソースには、ダウンロード、ソースコード、バグレポート、nightly snapshot builds、パッケージリポジトリが含まれる
  • 学習資料とドキュメントとして、Quick IntroductionThe Racket GuideThe Racket ReferenceAll Documentationを提供している
  • コミュニティチャンネルとしてDiscourse、Discord、Slack、Reddit、mailing lists、Mastodon、Twitter、Blog、Wiki、YouTubeがあり、TeamとContributingの文書も提供されている

1件のコメント

 
GN⁺ 2024-04-22
Hacker News のコメント
  • Racket がトップページに上がっていてうれしい。1982年から研究用途のプログラミングには主に Common Lisp を使ってきたが、最近は Racket を手に取ることが増えている。
    Racket で気に入らないところもある。コンパイラ、パッケージ管理システム、GUI IDE、Emacs バインディング、書いていて楽しい言語である点を除けば、ほぼ全部だ。
    プログラミング言語研究方面のエコシステムにはあまり関心がなく、たぶんプロジェクトを率いるコンピュータサイエンスの教授たちが最も重視している部分なのだろう。それでも彼らにはうまくいってほしい。
    だから Racket プロジェクトにただ乗りしているような気もする。好きな小さな部分だけを楽しみ、残りは無視していて、貢献もほとんどしていない。ただ、自分が書いた小さな Racket の本くらいは例外かもしれない。

    • この意見にはほぼ全面的に同意する。パッケージ管理システム、ステップ実行デバッガ付きの GUI IDE、Racket コアチームが直接メンテナンスしているクロスプラットフォーム IDE を書けること、実行可能バイナリを簡単に作れる機能のおかげで、Racket は自分の一番好きな Lisp だ。
      こうした機能は本当に便利で重要だ。Lisp は好きだが、仕事ではその作業に最適な道具である場合にしかその言語を使わない。これらの機能のおかげで、Racket は自分が実際に使用を正当化できた唯一の Lisp だった。
      コミュニティ、ツール、学習資料のおかげで、Racket は個人的に人へ勧めやすい言語だ。CL と Clojure もかなり使ってきたし好きな点もあるが、それぞれ大きな欠点があるので人には勧めない。
      自分も言語の研究寄りの部分や lang 機能にはあまり合わず、HtDP もかなり苦手だ。だがそれは、自分の好きな言語で作られた興味のないプロジェクト群にすぎず、言語そのものの欠点ではないと思っている。実際にぶつかることはほとんどないからだ。
    • https://leanpub.com/racket-ai/read
      これなら大きな貢献と言っていいと思う :)
    • CL を日常的に使っていて、研究やプログラミング言語研究の分野ではない。Racket はまだ使ったことがないのだが、CL と比べて Racket のどこが気に入らないのか、もう少し説明してもらえるか気になる。
    • プログラミング言語研究のエコシステムとは具体的に何を指しているのか気になる。Racket ディストリビューションの中で、明確にプログラミング言語研究と言えそうなのは Redex くらいしか見当たらない。
      言語自体にはメタプログラミング機能があるが、現代の言語はどれもメタプログラミングを備えている。
      コミュニティでの自分の経験では、話題にしているのはだいたい現実の問題だった。
      Racket はプログラミング言語研究や他の研究に使われるので、関連論文や学会発表で Racket が言及されることはあるが、議論を支配しているわけではない。
      例: https://racket.discourse.group/t/levin-tree-search-with-cont...
    • 大学でプログラミング言語エコシステムの授業に Racket を使ったことがあるが、その側面は自分もあまり楽しくなかった。それでも Racket は始めやすく、自分の役割は確実によく果たす。Lisp に足を踏み入れるなら、個人的には Racket がよい出発点だと思う。
      ただし Clojure はコミュニティがより大きく、しっかりしている。その代わり JVM を使うので設定が少し面倒で、微妙に気を配る点も多い。
  • Racket は非常に実用的な言語だ。学術的な変わり種に見えるなら、Bogdan Popa が Racket で何をしているかを見るとよい: https://defn.io/
    個人的には、ネイティブ GUI 付きのバイナリが必要なら Racket を使う。JSON、XML、テキストファイル形式のようなものをパースするのにもかなりよい。
    あわせて読む本として How to Design Programs、https://htdp.org/2023-8-14/Book/index.html もよい。厳密には Racket を教える本ではなく、Racket で実装された教育用言語をいくつか使うのだが、時々振り返る価値のあるアイデアがある。
    マクロシステムは CL などから来た人には奇妙に見えるかもしれないが、慣れてからは、メタプログラミングをしていても比較的正気を保ちやすかった。
    さらに有用な資料がいくつかある:
    https://www.greghendershott.com/fear-of-macros/
    https://beautifulracket.com/

    • Bogdan のところで特に目を引くものはある? ざっと見た限りでは、強く響くものはなかった。
  • Racketという言語は本当に好きだが、強いられる作業フローは受け入れがたい。Pythonでコーディングするときは、エディタでコードを書いてシェルで実行する
    Racketは起動時間が長すぎて、そのやり方があまりうまくいかない。代わりに、長時間動作する仮想マシンとREPLで対話すべきだと言われる
    しかしそうすると、作業中のコードはクリーンな状態から始まるのではなく、その時点で仮想マシンが持っている状態から始まることになる。Jupyter Notebookのようなものには優れた流れだが、大きなプログラムにはあまり合わないと思う

    • エディタでコードを書いてシェルで実行する方法も、Racketでは完全に有効。私の経験では、起動時間はPythonとかなり似ている。遅くはあるが致命的ではなく、事前にコンパイルしておけば特に問題ない。今まさに作業を終えたファイルには役に立つ
      racketの代わりにracket/base#langを使うことも大きな違いを生む。詳しくはhttps://docs.racket-lang.org/style/Language_and_Performance....にある
      「クリーンな状態」から始まらないというのは、RacketというよりCommon Lisp式のREPLに近いように見える。Racketでは通常、ファイルやモジュールを再読み込みするときにRacketを再起動する必要があり、そのため新鮮な環境になる。人々はそれに不満を言うが、私はCLよりもRacketのクリーンな状態のやり方を好む
    • 「クリーンな状態」から始まらないという部分は、ドキュメント上ではユーザーがバックアップファイルの保存を明示的に拒否できるように見える
      https://docs.racket-lang.org/drracket/drracket-files.html#(p...
      おそらく復元の提案も拒否できるはず
      「DrRacketは最初に起動するとき、残っているバックアップファイルがあるかどうかを確認し、あればバックアップファイルを復元するか提案する」
    • Smalltalkを一度使ってみるといい :-))
    • Guileが興味深いかもしれない。特にデバッグ時にはRacketよりも没入型に近く、Common Lisp(SBCL)にもより似ていると思う
    • SmalltalkとLisp Machinesの世界へようこそ。現代のIDEも、ホットリロード、作業状態の保存、単一言語で開発スタック全体を制御する機能を、まだすべてきちんとはサポートできていない
  • University of British Columbiaで学んでいたとき、コンピュータサイエンス入門科目でRacketを教えていた。素晴らしい言語だと思ったし、以前にプログラミング経験がある学生でもLispをやったことがある人はほとんどいなかったので、全員を同じスタートラインに立たせてくれた
    簡単なゲームや可視化を容易に作れるライブラリ群も印象的だった

    • 私もUBCでその授業を受けたが、まったく違う印象を持った。ひどいもので、特に命令型言語で進むその後のデータ構造とアルゴリズムの授業に備えるには、入門の学生たちを非常に不十分にしか準備できていなかったと思う
      TAをしていたとき、2年生に上がってきた学生のかなり多くがまだforループも書けず、基本的なアルゴリズムで大きく遅れていた
      関数型言語へのより深い理解は、4年生の計算理論の授業の後になってようやく生まれた
  • Racketのこれらすべての「言語」を、1つのアプリケーションにどう統合すればよいのかわからない。typed/racketracket/guiscribble/baseのような言語が見えるが、型付きのコードでGUIアプリケーションを作りつつPDFも生成したい場合、どうすればよいのか見当がつかない
    Racketのチュートリアルを何度も追ってみたが、互いに無関係に見える「言語」たちをどう結び付ければよいのか、いまだに混乱している
    個人的には、チュートリアルの各章は関係のない「言語」だけを説明していて、それらが一緒に動く様子を一度も見せていないように感じる。ある章はWebサーバーを扱うがクラスシステムは扱わず、別の章はクラスをサポートする別の「言語」を扱うが、そこでWebサーバーを書くわけではない

    • #lang行は、そのファイルをスコープとする一種のコンパイラ指示子だと考えるとよい。実際にははるかに多くのことをしているが、出発点としては悪くない。アプリケーションに型を追加したいなら、ファイル単位で1つずつ進める戦略がよい
      #lang行のほかにも、requireでライブラリを取り込めるので、1つのファイルにGUIコードとWebサーバーコードを一緒に入れることもできる。#langも一度に1つの言語にだけ制限されるわけではなく、衝突しなければその行にさらに追加できる
    • もっともな質問だと思う。大きなアプリケーションを開発するなら、ほぼすべてのコードは"racket"言語で書くことになる可能性が高い。型に強い関心があるなら、かなりの部分は"typed/racket"になるかもしれない
      すべての言語が共通の基盤を共有し、ある程度相互運用できるのは事実だが、プログラムを5つの部分に均等に分け、それぞれ別の言語を使うようなことになる可能性はまったく高くない。ドキュメントはおそらくscribbleで書くことになるだろう
      異なる言語を使えば、根本的に異なるプログラミングモデルを持つことができ、それがTyped Racketのような開発を可能にした背景でもあるが、始める妨げになるべきではない
      要するに、普通にRacketを使えばよい。本当に別の機能やプログラミングスタイルが必要だと感じたら、そのときに既に提供されている言語があるか探せばよい。もちろん、すべて私の意見だ
    • 各モジュールごとに、そのモジュールの言語を選べるようになっていると理解している
  • このウェブサイトであるHacker NewsはArcで書かれており、Racket上で動作している: https://en.wikipedia.org/wiki/Arc_(programming_language)

  • Racketの最大の問題は、言語やエコシステムではない: https://news.ycombinator.com/item?id=27531508

    • リンク先で言及されている2018年のRacket schoolの学生だった。FelleisenとButterickを含む講師全員が、教室の内外で本当に助けになり、親切だった
      仮にそのリンクの内容を完全に額面どおりに受け取り、Felleisenが特定の個人的なやり取りでTorvalds式に意地悪に振る舞うとしても、How To Design Programsを含む彼の仕事は、私の人生や他の人々の人生に非常に肯定的な影響を与えた。だから、それを活用するなと人に言うつもりはない
    • それは著名なコミュニティメンバー同士の、非常に個人的な対立である。より広いRacketコミュニティは、コアチームを含めて非常に親切だ
    • Felleisenは我慢しがたい人物だが、避けるのも簡単だ。Racket自体というより、アカデミアの病理現象に近い症状だと思う
      コミュニティには強い意見を持つ「変わり者のナード」もいて、存在感が大きく感じられる分、より苛立たしく思えることもある。だが、お金が秩序を保ってくれない多くの社会的空間が概してそうであるように、単にそういうものだ
  • Racketは私が最も好きな言語だ。高速で実用的で、堅固な基盤があり、並行性モデルも非常に優れている。Concurrent MLから借用して拡張した概念に基づいている
    ドキュメントシステムも素晴らしく、パッケージエコシステムと統合されているため、ほとんどのパッケージには相互参照付きの高品質なドキュメントがある。後方互換性も素晴らしく、現在本業で使っているPythonよりはるかに優れていると思う
    そのため、Racketは学術的すぎる、あるいは実用的ではないと言う人たちは、十分に深く掘り下げていないか、過去に教育用言語だけに触れた学生だった可能性が高いと感じる
    もちろん完璧ではない。コミュニティは小さく、ランタイムの基本メモリ使用量は多く、並列処理をするにはシステムスレッドごとにRacket VMを立ち上げる必要がある、といった問題がある。それでも、こうした点は時間とともに改善されるだろう
    ここ数年でRacketで作ったもの: ECサイト[1]、App Storeに掲載されたネイティブmacOS/iOS通知アプリ[2, 3, 4]、Apache Kafka向けのクロスプラットフォームデスクトップクライアント[5, 6, 7]、Lua用の#lang[8]。そのほかにも[9][10][11]いろいろある。かなり実用的なものだと思う
    [1]: https://defn.io/2019/08/20/racket-ecommerce/
    [2]: https://defn.io/2020/01/02/ann-remember/
    [3]: https://defn.io/2024/04/09/ann-remember-for-ios/
    [4]: https://github.com/bogdanp/remember
    [5]: https://defn.io/2022/11/20/ann-franz/
    [6]: https://defn.io/2023/10/15/ann-franz-for-windows/
    [7]: https://defn.io/2023/08/10/ann-franz-source-available/
    [8]: https://defn.io/2022/11/12/ann-racket-lua/
    [9]: https://docs.racket-lang.org/http-easy/index.html
    [10]: https://docs.racket-lang.org/deta/index.html
    [11]: https://docs.racket-lang.org/gui-easy/index.html

    • BogdanはRacketエコシステムに欠かせないgui-easyhttp-easyの作者でもある
      コミュニティフォーラムでも非常に活発で、本当に多くの有益な回答をしている
      この言語の隠れた英雄だと思うので、ぜひ言及したかった。あなたのライブラリは、何も知らないユーザーたちの生活をずっと楽にするコードを動かしている、と言える :)
      https://docs.racket-lang.org/http-easy/index.html
      https://docs.racket-lang.org/gui-easy/index.html
      https://racket.discourse.group
    • 後方互換性は本当に重要な点だと思う。Pythonを数年にわたって集中的に使ったが、2/3移行でコア開発者とコミュニティが後方互換性をどれほど気にしていないかを見て深く失望し、その後も改善されなかった
      Pythonが今日主に使われている分野のせいかもしれない。2000年ごろにあったNumeric/Numpyへの移行はまったく違っていた
      数年ごとに壊れることは、ユニコーンスタートアップや、素早く動き、文字どおり何かを壊す企業にはよいのかもしれない。だが、成熟したアルゴリズムを数年ごとに書き直す余裕がない、あるいはそれを優先事項と見なしていない人々や組織にとっても、価値あるプログラムは数多くある
  • Racket は時々使っていて、気に入っている。ただ、一部の Lisp、とりわけ Common Lisp、そしておそらく Guile も、思っていた以上に過小評価されていることに気づいた。
    もっと詳しい人に聞いてみたい。最初は実用的でも関連がありそうでも有用そうでもないのに、実際に使ってみるとプログラミングに意外と役立つ Racket の機能には何があるだろうか?

  • 約20年前、MzScheme が PLT Scheme になる前に、それを基盤言語として使う メールセキュリティの商用ソフトウェア に取り組んでいた。コードは Solaris、Linux、HP-UX で動作するクロスプラットフォームで、OS 別のコードは C で約1,000行程度だった。
    フィルタルールは Scheme 自体へコンパイルされていた。Web ベースの UI まで含めて全体のコードは約3万行で、開発者はわずか5〜6人だった。
    後に移民したあと、似ているが機能はより少ない製品を持つ会社に入ったところ、その製品は C++ で数十万行あり、開発者ももっと多かった。