動的言語の時代の終わり

過去数か月間、私は主にScala(仕事用)とHaskell(魂用)でプログラミングを行ってきました。 しかし今週は、Ruby(仕事用)とClojure(魂用)についてもう少しおしゃべりしました。



Rubyはすぐにバランスを崩しました。 いいえ、「既存のコードに小さな機能を追加する」という観点からでも、それを書くことができます。 単体テストを追加し、古いコードで実行し、編集を行い、テストを再度実行するだけです。できたら完了です。 しかし、さらに何かを掃引することは、すでに困難になりつつあります。



しかし、私のお気に入りのプロジェクト、Clojureのお気に入りのプロジェクトについては...ああ、Clojure! 新鮮な空気の息吹! 機能が整った肥沃な土地、不変のデータ構造、その他すべて。 構文がどれほど美しいか、そして感度がどれほど賢いか。 mapおよびreturn mapを受け入れる関数のすべての本質。 また、SQLジェネレーター、データベースアクセスレイヤー、HTMLパーサー、およびURLルーターは、プロセッサクロックによって前後に追いかけられるマップの魅力的な写真です。



久しぶりにClojureに戻ることは、まるで家にいるような感じです。 それはプログラマを刺激するだけです。 しかし、なんらかの理由で、今回は別の予期せぬ感情を感じました:不確実性。



Clojureとの対話は次のように見えました。



-ああ、私の光、Clojure! この驚くべき不変のデータ構造とリクエストのマップをありがとう。 何が入っているのか聞いてもいいですか?

「それは明らかではありませんか?」 HTTPリクエストがあります。

-はい、もちろん。 しかし、どのような形で? どんな種類のキーがあり、その意味は何ですか?

「それは明らかではありませんか?」 HTTPリクエストがあります。

-はい、もちろん。 回答については、ソースとドキュメントを読みました。

-はい、読んで理解してください。

-読んだ。 そして、attrおよびf変数とは何ですか? そして、wrap-params関数を呼び出すと、どのキーがマップに追加されますか?

「それは明らかではありませんか?」

-忘れて。 こことここにデバッグ出力を追加します。



これはすべて生産性に影響します。 ライブラリ関数を呼び出すたびに、覚えていない限り、その使用方法を理解するためにソースコードを掘り下げる必要があります。 呼び出し後に受信した各マップには、その処理を理解するためにデバッグ出力が必要です。



はい、Clojureは強力なものです。 しかし、この力は制御不能であり、ベクターを持たず、助言を与えることができる誰かがいなければ、破壊することしかできません。 そして、私は今哲学的な概念について話しているのではなく、コードについて話しているだけです。 RubyのメタプログラミングやClojureのマップに苦しんでいない人はどれくらいいますか? 私たち自身は、私たちの苦しみの犠牲者であり加害者でもあります。



例は次のとおりです。ドメイン固有言語(DSL)は問題を解決する方法ですか、それとも別の方法で問題を作成しますか? ClojureのDSLの破壊力について話しましょう。 ClojureプログラマーはDSLが大好きで、言語構造によりDSLが使用されやすくなります。 しかし、私はここで何かが間違っていると思います。 たとえば、このようなHTMLジェネレーターを想像してみましょう。 代わりにここにいます



<span class="foo">bar</span>

      
      







:



[:span {:class "foo"} "bar"]









, DSL HTML? : HTML. , , DSL, ( ) , HTML , ?



enlive yesql , .



DSL, , , DSL , . bidi, URL-. , «». , GET /notes. bidi :



(def my-routes
  ["/notes" :index-handler])




:



(bidi/match-route my-routes "/notes")

;; {:handler :index-handler}

;; Success!



. , :



GET /

GET /notes

GET /notes/:id

POST /notes

POST /notes/:id



! - Ctrl+F , , , , , :



(def my-routes
  ["" {"/" :home-page-handler
       "/notes"
         {:get  {"" :index-handler}
          :post {"" :create-handler}
          ["/" :id] {:get  {"" :show-handler}
                     :post {"" :update-handler}}}}])


, , ? , ?





: . , , . . « ». ? . , , ?







(Gradual typing)

: Typed Racket, Typed Clojure, TypeScript, Typed Lua. Python "type hints"



, . , , - .



, , . -, , . Clojure , ? ? .



, , , - «, », . ?



, — . , , , . .





, , , , ? ! - !



, . , , - . - , , . — .



, , . , , ?



hlint Haskell ( ) . , . , :







, . , , - ? , ?





, , , .



Scala , , Solr. , Solr null . , , , Clojure. . . , , , . -. : , isItPorn() null?



: . , , null .



2 Scala. . , . .



. . , . !



Ruby , , Clojure . . .



: , Ruby - . , , , . — - . .





: . . . , ( -), , . , .



. — , Clojure, . , , .



, , , . . , . , Elm Crystal , Haskell Scala. .



, , , . — -, . , , «, !». , , — , ? , ? .



«, ». , . , , . , , . , - . , .



All Articles