Clojureのデータ構造は抽象をもとに設計されているため、どのような抽象があるのか把握しておくことは重要です。

PythonからいいところをひとつもってこれたのでClojureからももってくる。 Clojureでは数珠つなぎで処理する場所はわかりやすくThreaded Macroを使って書くことが多い。 これはわかりやすいのでCommon Lispでも実装しておく。 (defmacro -> (x &optional form &rest more) (cond ((not (null more)) `(-> (-> ,x ,form) ,@more)) ((not (null form)) (if (listp form) `(,(first form) ,x ,@(rest form)) (list form x))) (t x))) (defmacro ->> (x form &rest more) (cond ((not (null more)) `(->> (->> ,x ,form) ,
「コンパイラ: 原理と構造」の型推論をClojureで書いた コンパイラ: 原理と構造 という本を読んだ。最近は本の内容を3秒ほどで忘れてしまうので、 少しでも記憶を定着させるため手を動かすことにした。 大昔に決定性有限オートマトンを作ったり、 LALR構文解析器を作ったりするプログラムを(Common Lispのマクロとして) 書いたことがあるので字句解析と構文解析はすっ飛ばして、 いきなり型推論をするプログラムを書くことにした。型推論を書くのは初めてだ。 本ではSML#を使っているが、「最も稼げる言語はClojure」という噂を聞いたので Clojureで書いてみることにした。Clojureを書くのも初めてだ。 できあがったもの user> (type-inf-defs '((def fdec (fn p (tuple (- (get p 0) 1) (get p 1)))) (def
こんにちはこんにちは!!あやぴーです。 最近の仕事ではF#を使ったり、Clojureを使ったりすることが多いのですが、今日は久しぶりにClojureの話を書きます。 Clojureでテスト書くときに一緒に使うライブラリ何使ってますか? テスト対象が依存する関数をモックしたい - mockfn 複雑なデータ構造のdiffを簡単に知りたい(あるいはデータ構造の比較を簡単にやりたい) - matcher-combinators モックした関数が取る引数をスマートに制限したい - mockfn & matcher-combinators まとめ Clojureでテスト書くときに一緒に使うライブラリ何使ってますか? アプリケーションでユニットテストレベルのテストを書くとき、どういうライブラリを一緒に使っていますか?Kaocha?Midje?test.check?shrubbery?Flare? 今回
これは Clojure Advent Calendar 2018 6日目の記事です。 こんにちは。インフラエンジニアの @notake です。 ヤマハルーターRTX1210に接続されているDHCPクライアントの一覧が必要になったため、リース情報を吸い出すためにClojureを活用した話を書きたいと思います。 記号 本記事では複数種類のターミナルを扱いますので、区別できるよう記号を定義します。 $: LinuxまたはmacOSのターミナルに入力するコマンドです。 >: ヤマハルーターの通常ユーザーで入力するコマンドです。 #: ヤマハルーターの管理者権限で入力するコマンドです。 user=>: ClojureのREPLです。 ヤマハルーターにSSHする ルーターから情報を吸い出すには、当然ながら何かしらの手段でルーターに接続する必要があります。 ヤマハルーターに接続するには、シリアルポートを
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? この記事は Clojure Advent Calendar 2019 18 日目の記事です。二年前に書いたキメるClojure高速開発が未だに読まれている気配があるので、情報を最新化し、現時点での意見をまとめようと思います。 当時の意見は特に Clojure 開発の高速性に注目し、短いスパンで進める個人開発に特に向いているというものでした。一方で経験にないため憶測でしたが、チームで進める中規模以上の開発にはあまり向かないのではないかと考えていました。しかし現在はチームとして Clojure を使って開発を行っているため今回はその観点から
Java (JVM)環境でのClojureとJavaScript環境でのClojureScriptを組み合わせると、典型的なWebアプリケーションのサーバサイドもフロントエンドもほぼ同等の言語で開発できるというのはClojureの魅力のひとつですが、日本語でも英語でも入門者向けにそのようなフルスタックなClojure開発のしかたを解説するリソースはまだ多くないようです。 今回は国内Clojurianの間でも人気のサーバサイドフレームワークDuct、ClojureScriptのReactラッパーReagentを基礎としたフレームワークre-frameを利用して、REST API + SPAという構成でTODOアプリを開発する例をご紹介します。 ビルドツールとしてサーバサイドの開発にはLeiningen、フロントエンドの開発にはshadow-cljsを使うことにします(開発/実行環境としてJa
【他言語版へのリンク記事】簡易LISP処理系の実装例【各言語版まとめ】 この記事は,Clojureによる二種類の原初LISP評価器("McCarthy's Original Lisp")の実装をまとめたものです. コンスセル未対応版 ClojureはS式入出力を扱うプログラミング言語のため,LISP評価器の実装自体は容易ですが,他のLISP系言語と異なりリスト構造はコンスセルに基づくものではなく,ドット対表現も利用できません.この版では,リスト構造を基本データ構造としつつ,『原初LISP評価器の機能に相当するClojureの機能のみで原初LISP評価器を定義』しています.具体的には次の通りです. 実装は' seq? = cons first rest cond defnを使用 機能はquote atom eq cons car cdr cond lambdaを提供 S式入力はClojure
はじめに FizzBuzzの実装のため、色々とリファレンスや技術記事を調べ、読み込んでいったのですが、 剰余を求める関数が『rem』『mod』と複数存在していることを知り、その違いについて戸惑ってしまいました。 今回は、これら2つの関数の違いについて調べたことを書きます。 remとmodの違いとは 結論から先に述べます。 remとmodでは、剰余の正負の符号決定のされ方が異なっており、 remでは被除数、modでは除数と同じ符号となるように剰余が計算されます。 そもそも負の数が割り算にでてくるってどういうこと? "そもそも負の数を割る、負の数で割るってなんなんだ!" という方は、 下記サイトが参考になりましたので、ぜひ御覧ください。 私も数学に明るくないため、今回FizzBuzzを実装するまで知りませんでした。 負の数の割り算と余り ~整数と余りの問題【数学まるかじり】 remとmodで、
はじめに ClojureはJavaなど他の言語にはないユニークな機能が色々と備わっています。そのなかでも一際特徴的に思えるのがマクロです。マクロは強力な機能に思える反面、Clojure初学者にとっては少々難しい機能に思うので、初歩的な内容を整理してみました。かくいう私もClojure初学者です。 はじめの一歩 簡単なサンプル マクロを新しく定義するには defmacro を使います。次のマクロは引数で渡されたフォームの評価前と後にコンソール出力を行います。 (defmacro with-log [form] (list 'do (list 'println "Start") form (list 'println "End")))
ClojureといえばREPL駆動開発(REPL-driven development)によるインタラクティブで高速な開発スタイルが大きな強みですが、その開発体験(DX; developer experience)をより良くするためにClojure開発環境の特性を反映した"reloaded workflow"というものが知られています。 このワークフローを実現するためのライブラリの組み合わせや設定のしかたは多様ですが、本記事では最もオーソドックスなtools.namespace + Integrant/Component/mountでの構成例をご紹介します。 サンプルコードlagenorhynque/reloaded-workflow-examplesは適宜参考に、ご自身の開発スタイルに合ったプロジェクト構成やエディタ設定をぜひ考えてみてください(お気に入りの構成が見つかったらプロジェクト
この記事は Kafka Advent Calendar 2021 の11日目の記事です。 前回の記事で紹介した Kafka Streams アプリケーションをClojureで書いてみました。 Jackdawという Kafka Streams の Clojure ラッパーライブラリを使っています。 テスト環境構築 手軽に手元で試したいので、Kafka の Quick start に従い環境構築します。
システムエンジニアやプログラマーは、問題解決に取り組むことが主な仕事ですが、 直面する問題解決に取り組む中で、過去に似たような問題に出会っていたことに気が付くことがよくあると思います。 この記事では、問題を別の問題に置き換えて考えることを言語化した、計算理論の世界の「還元」という概念を紹介しようと思います。 紹介の中で使うコードは、今の仕事で使っているClojureで書きました。(Clojureがわからなくても内容は理解できると思います) また、個人的な解釈を含むので、誤っている場合があります。個人的な解釈については、「~ていそうです」「~と思いました」「~な気がします」みたいな表現になっています。 1. 還元(reduce) 還元(reduce)とは、ある計算問題Aを別の計算問題Bに変換することです。 問題解決においては、 「この問題(A)って要はあの問題(B)なのでは?」 「あの問題(
まとめ Clojureの速度が気になったのでJuliaを使ってみたが、Clojureが忘れられず、partitionやreductionsをJuliaで書いていた。そこに手間をかけるのであれば、Clojureの高速化にひと手間かけても良いのではないかと考えた。 しかし、シーケンスの平均値を取る操作を長いベクタに対して行った際、その実行時間を満足いくまで縮めることができなかった。更に縮めるためには恐らくデータ構造を変える必要があり、それはClojureの良さを殺してしまうように思われるので、やはりJuliaを使おう思う。 5000万個のランダム値に対する平均を取る操作の比較が下記。Clojureが4.7秒に対し、Juliaは0.37秒。素のPythonが26秒で、Numpyは0.39秒。Common Lispは大体1.75秒。
はじめに Clojure を触り始めて半年ほどが経ちました。 とはいっても、私の所属はインフラチームなので、他のソフトウェアエンジニアの方々と比べると Clojure に触れる機会は少し少なめです。会社で使用しているメイン言語は Clojure ですが、インフラエンジニアは多種多様な知識やツールを使うので、相対的に Clojure でバリバリコーディングするタスクは少なくなるのです。 そんなこんなで、放っておくとせっかく覚えた Clojure のことをいつの間にか忘れてしまいそうなので、時々自分から学びに行かなくてはと思っていたところ、会社の Clojure つよつよエンジニアの方から Transducer について教えていただく機会がありました。 せっかくなので、そこでお聞きした話をベースに、自分でも改めて Transducer について調べてまとめてみることにしました。あくまで Tra
Free モナドを使うと Functor f からモナド則を満たす Free f が得られる。 Freer Monads, More Extensible Effects の Freer1 モナドを使うと、 Functor であることすら必要とせずモナドが得られると聞いたので Scheme (Gauche)で実装してみた。 (ちなみに、 Freer モナドの定義は2013年ごろに話題になった Operational モナドと同一である。 Operational モナドを知っている人にはこの記事で得られるものは少ないかもしれない。 Operational については例えば Freeモナドを超えた!?operationalモナドを使ってみようなどを参照。元論文はさらに Operational モナドの効率的な実現法や Extensible Effects との組み合わせについて扱っている) F
$ gigue > (+ 1 2) 3 > (define (mul x y) (* x y)) > (mul 2 3) 6 > (define a (mul 1 2)) > (- 10 a) 8 > (define (square x) (* x x)) > (print (square 3)) 9 > (define x 'kuke) > (print x) kuke > (load "./examples/sum.scm") > (print (sum 1 2)) 3 > (define x (lambda () (print 'hoge))) > x {[] [print hoge] 0xc820014300} > (x) hoge > (define p (list 1 2 3)) > (car p) 1 > (cadr p) 2 > (caddr p) 3 機能 +, -, *
この記事はLisp Advent Calendar 2016の3日目の記事です. 2日目の記事は「R7RS-largeについて」でした. 本記事はProject EulerのProblem1〜5のネタバレを含みます.ご注意ください 初めに 今までLISPは食わず嫌い的に敬遠していたのですが,最近大学の授業でSchemeを使う機会があり,いざちゃんと勉強してみると結構面白くて,ずぶずぶと沼にハマっていく音が聞こえてきました.ちなみに最近LoL本買っちゃいました😉 Schemeを最初に触ってから1ヶ月くらい経ったあたりでなんとなくProject Eulerを解いていたので,この記事ではそのコード片を紹介したいと思います.なお,本記事のコードは全てGitHubにあげています(今後も継続的にcommitしていく予定です). kagemiku/project-euler (カレンダーに登録してから
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く