Tumgik
tnoda-clojure · 8 years
Quote
「えっ、Perlかよ」という人がいるといけないので、Clojureで構造化パーセプトロンを使った係り受け解析のサンプルコードへのリンクも張っておきます(2種類あります)。PerlもClojureもあれば8割くらいの人はカバーできそうなので、安心ですね。
だそうです。
4 notes · View notes
tnoda-clojure · 8 years
Text
#clojure 入門者向け勉強会 #mitori_clj アーカイブ
Zussar がサービス提供を終了するというので,昔 Zussar 上で開催した「#clojure 入門者向け勉強会 #mitori_clj」をアーカイブしました。 HTML だけをコピーしているのでデザインは崩れていますが,当時を懐しむには十分です。
受付終了
#clojure 入門者向け勉強会 #mitori_clj
Project Euler level 1 に相当する Problem 1-25 をみんなで解いていきます.
Tweet
開催日時
2012/ 12/6 (木) 0:00 start
参加希望者/定員
7 /12人 開催決定!
参加費
無料
開催日時
2012/12/06 00:00  〜  2013/01/22 00:00
定員
12人 
受付期間
2012/12/03 12:00  〜  2012/12/07 17:00
最少催行人数
5人
参加費
無料  
場所
どこかの会場に集まるのではなく,ネット上で非同期に開催します.Gist からでも参加者のブログからでもどこでも ok. 
住所
  参考URL
  主催者
  tnoda_ 
詳細情報
みんなで Clojure を勉強していきましょう. Clojure は産まれて 5 年の新しいプログラミング言語で,周りを探してみても使っている人を見つけるのは難しいです.そこで,住んでいる場所に関係なくゆっくりまったり一緒に Clojure を勉強していければと思います. ハッシュタグ #mitori_clj すすめかた Project Euler (http://projecteuler.net/) の Problem 1-25 を分担して解いていきます.問題を解いたら担当者は解答を Web 上で公開して,他の参加者からのレビューコメントを待ちます.さらに自分で問題を解くだけでなく,他の参加者の解答にもコメントし,おたがいの知識・スキルを共有していきます. 一週間の流れ 毎週各参加者に 1 問ずつ問題が割り当てられます. 1) 担当発表 ... 主催者が各参加者に 1 問ずつ問題を割り当てます .(水曜夜) 2) 解答作成 ... 各参加者が解答と解説を作成し,gist などに公開します.(木〜月 2:00 締切) 3) 相互レビュー ... 各参加者が他の参加者の解答にコメントします.各解答に必ず 1 件以上コメントしましょう.(各解答の公開時点〜水曜) 4) 解答更新 ... 各参加者はコメントが有用だと思ったら自身の解答をアップデートしましょう.(随時) スケジュールと担当
{a "ponkore", b "tnoda_", c "emanon001", d "ypsilon_takai", e "bouzuya", f "plaster", g "kohyama"}
第1週 12月10日(月)2:00 締切 → {a 1, b 2, c 3} 第2週 12月17日(月)2:00 締切 → {a 4, b 5, c 6, d 7, e 8, f 9, g 10} 第3週 12月24日(月)2:00 締切 → {a 11, b 12, c 13, d 14, e 15, f 16, g 17} 第4週 1月7日(月) 2:00 締切 → {a 18, b 19, c 20, d 21, e 22, f 23, g 24} 第5週 1月14日(月)2:00 締切 → {a 25} 第6週 1月21日(月)2:00 締切 → 予備日 1 第7週 1月28日(月)2:00 締切 → 予備日 2 第8週 2月4日(月)2:00 締切 → 予備日 3 よくありそうな質問と解答 Q. 解答の URL を他の参加者に知らせるにはどうしたらいいですか? → このページのコメント欄に URL を記入してください.ツイッターアカウントをお持ちの場合は, #mitori_clj ハッシュタグでツイートしてください. Q. Gist 以外で解答を公開してもいいですか? → 解答の公開には gist をおすすめしますが,他のサイト (Qiita など) でも ok です.Gist をおすすめする理由は 1) 版管理ができる, 2) コメントに markdown を使える,の 2 つが大きいのですが,個人ブログでもどこでも,コードを書けて,コメントをつけられるところならどこでもかまいません. Q. 他の参加者の解答にどのようにコメントしてよいか分かりません. → コメントはどのようなものでも有用なものです.一番簡単なコメントは :+1: でしょう.また,解答の分からない部分について質問するようなコメントでも ok です. Q. clojure.jar 以外のライブラリを使って解答を作成してもいいですか? → もちろん ok です.ただし,Leiningen でインストールできるもの,すなわち,Maven などのリポジトリに jar ファイルが公開されているものに限ります.外部ライブラリを利用した場合は,Leiningen の dependency information を明記してください.たとえば,
[org.clojure/math.combinatorics "0.0.3"]
のような感じです.解答が他の人への便利ライブラリ紹介になっているのは素敵です. Q. Google 先生に教えてもらった解答をコピペしてもいいですか? → もちろん ok です. Q. 難しい問題に当たってしまって解けないときはどうすればいいですか? → 正解にたどりつかなかったばあいでも,途中までの答案と,どのように解こうとして駄目だったのかを書いて部分点を狙いにきてください.相互レビューフェイズで誰かからヒントをもらえるかもしれません. Q. 仕事が忙しいので締切に間に合いません. → コメント欄で知らせてください.その週の問題と担当はスキップになります.スキップされた問題については,次週再割り当てが行われます.スキップされたからといって次週の課題が増えるわけではなく,基本的に 1 問/人・週のペースは維持されます. Q. 問題文が英語で意味がわかりません. → 和訳サイトをどうぞ: http://odz.sakura.ne.jp/projecteuler/ Q. どうして Project Euler なのですか? → http://tnoda-clojure.tumblr.com/post/37201219341/project-euler Q. 他の人��担当分を解いてしまっていいですか? → はい.ただし,担当している人が解答を公開してからにしてください.月曜 2:00 の締切を過ぎても担当者が解答を公開しない場合は,その問題について他の人が解いてしまっても ok です.コメント欄等で他の参加者に知らせれば,その時点で相互レビューの対象にすることにしましょう. Q. どうして #mitori_clj という名前なのですか? → https://twitter.com/tnoda_/status/279587943948103680 → https://twitter.com/tnoda_/status/279701151966969856 Q. 私参加者ではないのですが,ちょっとコメントしたいです. → 解答が Gist に公開されているのであれば,Gist の利用規約の範囲内でコメントするのは自由です.コードレビューで気になったことがあれば,どんどんコメントしてくだだい. 使用言語 日本語・Clojure 1.4.0 お問い合わせ この勉強会についてのお問い合わせは,このページのコメント欄か,Twitter で @tnoda_ まで.ご意見ご希望がありましたらお気軽にお問い合わせください. 研究へのデータ利用のご協力のお願い このページで募集を行なっている勉強会(以下,本勉強会)で得られたデータは @tnoda_ のプログラミング教育研究の資料として利用されます.また,本勉強会について国内・国外の学術会議ならびに勉強会で発表する際に,参加者の解答や解説・コメント・ツイートなど本勉強会の関連情報について,個人を特定できない形で利用または引用することがあります.ご協力よろしくお願いします.止むを得ない理由によりこの研究に協力できない場合には,コメント欄にてお知らせください.
受付終了
コメント
41
tnoda_ (2012/12/04 21:37)
削除
よくありそうな質問と解答を更新しました.
tnoda_ (2012/12/06 00:03)
削除
厳正な抽選 ( http://ideone.com/yEHUyS ) の結果,第一週の担当スロットを決定しました.まだ,最少催行人数に逹していないので勉強会が開催されるかどうか不確定ですが,明日以降に参加表明される方は,第二週から解答に参加してもらおうと考えています. 万が一,5 人集まらなかったときには申し訳ありませんが流会になります.
tnoda_ (2012/12/07 22:26)
削除
厳正な抽選 ( http://ideone.com/uoC8tT ) の結果により,今週木曜以降に参加された方々も合わせて,担当問題を決めました.「詳細情報」の「スケジュールと担当」をご確認ください.
tnoda_ (2012/12/07 22:27)
削除
よくありそうな質問と解答に「他の人の担当分を解いてしまっていいですか?」を追加しました.
tnoda_ (2012/12/07 23:08)
削除
Problem 2 解きました https://gist.github.com/4233420
kohyama (2012/12/08 04:20)
削除
10日までに 7番の解答を書かなきゃと思って素数列作ってたのは内緒です.
ponkore (2012/12/08 22:48)
削除
Problem1 解いたのをアナウンスするのを忘れてました。すでにコメントをいくつかいただいております。https://gist.github.com/4233289
emanon001 (2012/12/09 00:26)
削除
すみません、僕もこちらでアナウンスをするのを忘れていました。 / Problem 3 解きました https://gist.github.com/4239310
kohyama (2012/12/09 15:06)
削除
Problem 10 です. https://gist.github.com/4243539 ちょっと早いですが, 来週海外出張に出てしまうのでご容赦.
bouzuya (2012/12/09 18:04)
削除
Problem 1. bouzuya の解答。リンクを一箇所に集約するために張っておきます。https://gist.github.com/4234063 
tnoda_ (2012/12/12 11:13)
削除
Problem 3 素数列を使わずに解いてみました. Clojure 速いです. https://gist.github.com/4239310#comment-622443
tnoda_ (2012/12/12 12:48)
削除
ちょっと早いですが,第2週の担当を確定させます.{a 4, b 5, c 6, d 7, e 8, f 9, g 10} でよろしくお願いします.Zusaar に書いてあったものから変更はありません.
tnoda_ (2012/12/12 15:11)
削除
Problem 5 解きました. https://gist.github.com/4259078
ypsilon_takai (2012/12/13 20:25)
削除
Problem 7 解きました。 っていうか、解きなおしました。 https://gist.github.com/4258237
bouzuya (2012/12/13 23:57)
削除
Problem 8 解きました。誤って削除したので再投稿。https://gist.github.com/4276901
ponkore (2012/12/14 22:55)
削除
Problem 4 解きました。https://gist.github.com/4285505 #mitori_clj
tnoda_ (2012/12/15 15:32)
削除
[詳細情報更新]月曜2:00の締切を待たなくてもコメントok. ということがはっきり分かるように,「一週間の流れ」の文面を修正しました.
plaster (2012/12/15 16:40)
削除
Problem 9 解きました。 https://gist.github.com/4291907
emanon001 (2012/12/15 18:10)
削除
Problem 6 解きました。 https://gist.github.com/4292285 #mitori_clj
tnoda_ (2012/12/19 16:24)
削除
第3週の担当を確定させました.{a 11, b 12, c 13, d 14, e 15, f 16, g 17} 予定通りです.
kohyama (2012/12/19 19:30)
削除
Problem 17 です. https://gist.github.com/4335755
ypsilon_takai (2012/12/19 21:02)
削除
Problem 14 解きました。 https://gist.github.com/4275609
tnoda_ (2012/12/20 13:06)
削除
Problem 12 解きました. https://gist.github.com/4342901
bouzuya (2012/12/22 11:02)
削除
Problem 15 解きました。https://gist.github.com/4356980
emanon001 (2012/12/22 18:15)
削除
Problem 13 解きました。 https://gist.github.com/4358164 #mitori_clj
plaster (2012/12/23 02:47)
削除
Problem 16 解きました。 https://gist.github.com/4357479
ponkore (2012/12/23 22:53)
削除
Problem 11 を解きました。https://gist.github.com/4363494 ※今度はオッケーです。混乱させてしまい申し訳ありませんでした。
ypsilon_takai (2012/12/27 12:22)
削除
担当の確定がまだ出ていないようですが、Problem 21 です。 https://gist.github.com/4284814
kohyama (2012/12/27 18:23)
削除
同じく Problem 24 です. https://gist.github.com/4371543
tnoda_ (2012/12/27 23:07)
削除
第4週 1/7〆の担当は当初予定通り確定です.{a 18, b 19, c 20, d 21, e 22, f 23, g 24}
tnoda_ (2012/12/28 13:03)
削除
Problem 11 の別解コメントを別の gist に移しました. https://gist.github.com/4394295
tnoda_ (2012/12/28 13:12)
削除
「よくありそうな質問と解答」に「Q. 私参加者ではないのですが,ちょっとコメントしたいです.」を追加しました.
plaster (2013/01/03 23:05)
削除
あけましておめでとうございます。Problem 23 解きました。 https://gist.github.com/4443424
bouzuya (2013/01/04 18:24)
削除
Problem 22 を解きました。https://gist.github.com/4451081
tnoda_ (2013/01/05 13:53)
削除
Problem 19 解きました.本年もよろしくお願いします. https://gist.github.com/4459823
ponkore (2013/01/06 00:08)
削除
Problem 18 を解きました。本年もよろしくお願いします。 https://gist.github.com/4461915
emanon001 (2013/01/06 18:31)
削除
Problem 20 を解きました。今年もよろしくお願いします。 / https://gist.github.com/4466138
ponkore (2013/01/09 23:36)
削除
Problem 25 を解きました。https://gist.github.com/4493455
tnoda_ (2013/01/09 23:59)
削除
.@ponkore #25 解答ありがとうございます.担当分はこれで全て終了ですので,みなさま,今一度コメントをよろしくお願いします.
tnoda_ (2013/01/22 10:47)
削除
各 gist でのコメント・議論は open で続いているのですが,当初予定の 25 問を消化しましたので,ひとまず,勉強会としての #mitori_clj は close したいと思います.すべての参加者のみなさまに感謝です.ありがとうございました.
shinseitaro (2013/01/27 08:32)
削除
みなさんのコードでたくさん勉強させてもらいました。ありがとうございました!
コメントする
管理者用メニューへ 受信メッセージ
参加者
7
tnoda_ Clojure を始めて半年の初心者ですが,よろしくお願いします.
ponkore Project Euler、13以降ほったらかしているので、これを機会に参加することにしました。よろしくお願いします。
emanon001 年末を Clojure さんと二人ですごすために、ここいらで仲良くなっておきたいです。(最近全く触っていない……)
bouzuya 参加したつもりになっていた。
plaster 2年くらい前に挫折して以来の再挑戦です。よろしくおねがいします。
ypsilon_takai 周りにはClojureな人はいませんね…初めの方を解いたのはClojureを始めたばかりのころなので、解きなおしてみます。
kohyama よろしく御願いします.
キャンセル
0人
4 notes · View notes
tnoda-clojure · 8 years
Text
Google Code Jam 2016 Qualification Round B: ホットケーキ返し
https://code.google.com/codejam/contest/6254486/dashboard#s=p1
問題
N 枚のホットケーキが重ねられてホットケーキの山ができているが,それぞれのホットケーキは表を向いていたり,裏を向いていたりする。ここで,ホットケーキの重なっている様子を,表 (+), 裏 (-) でそれぞれあらわす。たとえば,
-++--
は,上から順に,裏,裏,表,表,裏,と重っている様子を示す。
さて,ここで,ホットケーキの山を裏返して全てのホットケーキを表向きにしたいが,なるべく少ない回数で全て表向きにしたい。最小何回の裏返しで全てのホットケーキが表向きになるか? ただし,ホットケーキを裏返しにするときには,途中のホットケーキだけを裏返すことができず,上から i 枚目 (i <= N) までのホットケーキを全て裏返すこととする。たとえば,
--+--
は,途中の 3 枚目だけを裏返すことはできず, 3 枚目を裏返そうとすると, 1–3 枚目までの全てが裏返って,
++---
となる,このあと, 1–2 枚目を裏返して,1–5 枚の全てを裏返すと全て表になるので,計 3 回が最小操作回数となる。
解き方
表と裏が入れ替わる回数を数えればよい
ただし,一番底が裏になっていれば +1
Clojure での解答例
(defn solve [s] (let [ps (partition-by identity (reverse s)) z (count ps)] (if (= \- (ffirst ps)) z (dec z)))) (loop [i 1 ss (-> *in* java.io.BufferedReader. line-seq next)] (when ss (println (format "Case #%d: %d" i (solve (first ss)))) (recur (inc i) (next ss))))
実行例
$ java -cp clojure-1.8.0.jar clojure.main tnoda.gcj2016.qual/src/tnoda/gcj2016/qual/B.clj < B-large.in > clj-large.out
余談
問題を読んだ瞬間に (partition-by identity) が思いついたのですが, clojure-1.8.0.jar を持っていくのを忘れたので,本番では Python で提出しました。 Python のほうが若干コードが長くなっているのですが,どちらにしても一瞬で書けるので,この程度の問題なら,誤差の範囲です。
3 notes · View notes
tnoda-clojure · 9 years
Link
明日 1/17 (日) 夕方 18:00 から渋谷で Clojure の meetup があります。今回は Kevin Lynagh が Clojure の話をしてくれるそうです。 Kevin は世間では 携帯電話自作の人 として有名ですが, Clojure では cljx の人として有名です。今回は BoxBox という Clojure/ClojureScript 製プロダクトの話を聞けるそうです。たぶん私も参加します。
0 notes
tnoda-clojure · 9 years
Text
本の紹介: Carin Meier, Living Clojure, O'Reilly, 2015.
毎年一つ新しいプログラミング言語を学ぶのに、今年はこの本で Clojure を学んでみませんか?
Living Clojure
posted with amazlet at 16.01.04
O'Reilly Media (2015-04-14)
Amazon.co.jpで詳細を見る
本の紹介
Clojure を学習するのに、 4clojure や Clojure Katas といった koan スタイルのコンテンツを利用するのが効果的です。これらの koan は、自動採点システムにより、自分で手を動かしながら Clojure を学習できるので、単に本を読み進めるのに比べて飽きが少なく継続して学習を進めるとができます。また、基礎的な内容から応用まで、順序立てて学習することができるので、途中で落伍する危険性も小さくなります。
しかし、いくら koan がよくできているからといっても、最低限のプログラミング言語に関する知識は必要です。そんな、「最低限のプログラミング言語に関する知識」をコンパクトにまとめたのが、ここで紹介する本、 Living Clojure です。Java や Ruby といった他のプログラミング言語の経験があれば、この本を読んで Clojure の koan に挑むために必要な知識を得るのに、時間はかからないでしょう。
本書が特徴的なのは、プログラミング言語に関する知識だけでなく、その学習計画を提示している点です。本書の Part II では、7 週間にわたる 4Clojure と Wonderland Clojure Katas を使った学習計画案が記されています。 7 週間といっても毎日 8 時間学習するわけではなく、週 2-5 時間のメニューなので、毎日 30 分ずつ進めることもできますし、一週間分を週末にまとめて勉強する、という方法でも使えます。 独学のときに困る「何をどのような順番で学べばよいのか」という点についての指針となります。
本書が Clojure 入門者向けに koan への十分な取っ掛りを提供する一方で、 Clojure によるアプリケーション/システム開発で問題となるような課題やその解決策については記載が省かれています。このため、入門者にとっては寄り道することなく 7 週間のプログラムを最短で終わらせることができる一方で、Clojure への長期投資を考えている開発者にとってはもの足りない内容ともいえます。また、Lisp の経験があったり関数プログラミングに熟練したりしているプログラマにとっては、説明が冗長と考えられるかもしれません。そのような方には、 Chas Emerick, Clojure Programming, O'Reilly, 2012. で Clojure を始められることをお勧めします。
個人的な意見ですが、本書のサンプルコードのスタイルについて、一部、私の好みでないところがあります。本書を永久保存版として、今後、 Clojure を書くときにコードを参考にするリファレンスとして使うのではなく、あくまでも、 koan に挑むための前提知識を得るための本と割り切って読んで、終わったら、他に Clojure を学習したそうにしている人を見つけて本書を譲るのがよいでしょう。
対象読者
プログラミングの経験有りの Clojure 未経験者
できれば、Java の経験があることが望ましい
Clojure で何か開発する予定は無いが、一年に一つ学ぶプログラミング言語として、今年は Clojure を学習したいプログラマ
非対象読者
Clojure 経験者
Clojure を単に学習するだけでなく、業務で使いたいと考えているプログラマ
プログラミング未経験者
5 notes · View notes
tnoda-clojure · 9 years
Text
Clojure チートシート (1) リテラル
Clojure 1.8.0-RC3
JDK 1.8.0_66
Clojure をはじめて 1 時間目くらいの方向け
リテラル
リテラルの表
種類 例 備考 整数 42 0xff 012 3r12 Java の long 浮動小数点数 3.14 6.02e23 Java の double 任意精度10進整数 42N   任意精度10進浮動小数点数 0.0000001M Java の java.math.BigDecimal 分数 22/7   文字 \a \b \c Java の char   \o141 \o142 \o143     \☃ \u2603     \space \newline     \formfeed \return     \backspace \tab   null nil Java の null 論理値 true false Java の boolean 文字列 "clojure" Java の java.lang.String キーワード :kw :foo.bar/kw     ::nsed-kw ::alias/kw  
整数
Clojure の整数は Java の long である。
10 進整数
例. 42
16 進整数
例. 0xff
0x ではじまるリテラルは 16 進整数
8 進整数
例. 012 => 10 進整数の 10
0 ではじまるリテラルは 8 進整数
10 進,16 進,8 進以外の整数
例. 3r12
ArB で「A 進数で B」という意味になる。上の例は 3 進数で 12 なので 10 進数に直すと 5 となる。
最大で 36 進数までに対応している。
Java の long より大きい精度が必要な場合は, Clojure の BigInt を使うこともできる。 10 進整数リテラルの末尾に N を追加すると BigInt となる。 整数が Java の long で表現できる範囲内でも BigInt となる。また, 10 進整数リテラルが Java の long で表現できる範囲を越えていると, N がついていなくても BigInt となる。
任意精度 10 進整数
42N
10000000000000000000000000000000000000000000000000N
10000000000000000000000000000000000000000000000000
Clojure には Java の int, short に相当するリテラルが無い。 プログラム中でどうしても Java の int, short が必要となった場合には int 関数または short を使って long の 10 進整数を int または short に変換する。
(int 42) ;=> int (short 42) ;=> short
Java のように数字をアンダースコア (_) でつなげることはできない (e.g. 1_000_000 はエラー). また, 0b ではじまる Java の 2 進数表記も使えないので,2 進数表記���必要なときは変わりに 2r... を使う。
浮動小数点数
Clojure の浮動小数点数は Java の double である。
浮動小数点数
3.14
浮動小数点数(指数表記)
6.02e23
Clojure には Java の float に相当するリテラルが無い。 プログラム中でどうしても Java の float が必要となった場合には float 関数を使って double の 浮動小数点数を float に変換する。
(float 3.14) ;=> float
任意精度の 10 進浮動小数点数が必要な場合は, Java の java.math.BigDecimal を使うこともできる。 浮動小数点数リテラルの直後に M を追加すると BigDecimal となる。
任意精度 10 進浮動小数点数
3.14M
6.02e23M
分数
整数でスラッシュ (/) をはさんだリテラルは分数となる。分数は約分され,約分の結果が整数になる場合,その分数リテラルは整数となる。
分数
22/7
66/9 => 22/3
60/6 => 10
文字
Clojure の文字は Java の char である。 文字の前にバックスラッシュ (\) を置くと文字リテラルとなる。 \o ではじめることで 8 進数表記もできる。
文字リテラル
\a, \b, \c
文字リテラル(8 進数表記)
\o141, \o142, \o143
Clojure の文字リテラルにはユニコード文字を使うこともできる。また, (\u) ではじまるコードポイントによる指定も可能である。Clojure で利用できるユニコードのバージョンは,Clojure で利用する JVM のバージョンに依存する。 JDK 1.8.0 の場合は Unicode Standard バージョン 6.2.0 となる。
文字リテラル(ユニコード)
\☃
文字リテラル(ユニコードコードポイント)
\u2603
空白文字のリテラルについては,次の名前つきリテラルをつかうこともできる。
文字リテラル(空白文字用)
\space, \newline, \formfeed, \return, \backpace, \tab
文字列
Clojure の文字列は Java の java.lang.String である。ダブルクォテーションで囲まれたリテラルは文字列リテラルとなる。
"abc" "ab\nc"
Clojure の文字列は,文字列中に改行文字列を含めることができる。
"きこえ...    ますか..."
は,
"きこえ...\n   ますか..."
と書くのと同じである。
キーワード
コロン (:) で始まるリテラルはキーワードとなる。キーワードの名前空間はデフォルトでは nil となる。キーワードリテラルにスラッシュ (/) を含む場合はスラッシュの前をキーワードの名前空間として扱う。ただし,名前空間名がエイリア���の場合はコロンを 2 つに増やす (::) 必要がある。コロン 2 つではじまるキーワードがスラッシュを含んでいない場合,すなわち,名前空間で修飾されていない場合は,そのキーワードが存在する名前空間で修飾される。
キーワード
:kw
名前空間修飾キーワード
:foo.bar/kw => foo.bar 名前空間の :kw キーワード
名前空間修飾キーワード(名前空間名がエイリアスの場合)
:baz/kw => (alias 'baz 'foo.bar) されている場合 foo.bar 名前空間の :kw キーワード
現在の名前空間のキーワード
::kw
数字やスラッシュ (/) ではじまるキーワードを作ることもできるが,避けたほうがよい。
非推奨キーワード
:42
:/foo/bar/baz
リテラルっぽいものの表
種類 例 備考 正規表現 #"(\d+)-(\d+)-(\d+)" Java の java.util.regex.Pattern ベクタ [1 2 3]   マップ {:a 1 :b 2 :c 3}   セット #{:foo :bar :baz}   関数 #(zero? (rem % 3))  
正規表現
Clojure の正規表現は Java の java.util.regex.Pattern である。文字列と似ているが,ダブルクォテーションで囲った文字列の直前に # を追加すると正規表現リテラルとなる。正規表現リテラルは文字列リテラルではないので,Java で文字列から Pattern オブジェクトにコンパイルするときとは異なり,バックスラッシュ (\) をエスケープする必要はない。
#"(\d+)-(\d+)-(\d+)"
ベクタ (Vector)
角かっこ ([...]) で囲むとベクタになる。各要素は 1 文字以上の空白文字で区切る。空白文字にはカンマ (~,~) を使うこともできるが, Clojrue では単にスペース ( ) 一文字を使うことが多い。ベクタが長くなる場合は,見易さのため,改行で要素を区切るのもよい。
[1 2 3] [1,2,3] [1, 2, 3] [1 2 3 4 5 6 7 8 9]
ベクタ・マップ・セットの要素としては,リテラルのほかに,フォームも利用できる。
[(+ 1 2) (- 3 4) (* 5 6)] [3 -1 30]
リテラルを使わずに vector 関数を使って書く方法もある。
(vector 1 2 3) ;= [1 2 3]
マップ (Map)
波カッコ ({}) で囲むとマップになる。キー 1,キー 1 に相当する値,キー 2, キー 2 に相当する値,… のように,キーと値とを交互に並べる。各要素を 1 文字以上の空白文字で区切るところはベクタと同じ。ベクタと同じく,空白文字にはスペース 1 文字を使うことが多いが,キーと値のペアを一組として,その区切りにカンマ (,) を入れて見易くする場合もある。また,キーと値のペアを改行で区切って見易くすることも多い。
{:a 1 :b 2 :c 3} {:tokyo 13503810, :osaka 8847600, :fukuoka 5092990} {:tokyo 13503810 :osaka 8847600 :fukuoka 5092990}
リテラルを使わずに array-map 関数,あるいは, hash-map 関数を使って書く方法もある。
(array-map :a 1 :b 2 :c 3) ;= {:a 1, :b 2, :c 3} (hash-map :a 1 :b 2 :c 3)
セット (Set)
マップと似ているが,波カッコ ({}) で囲ってその前に # をつけるとセットになる ( #{ ... } ). セットの各要素を 1 文字以上の空白文字で区切って波カッコの中に並べる。
#{:foo :bar :baz}
リテラルを使わずに hash-set 関数を使って書く方法もある。
(hash-set :foo :bar :baz) ;= #{:foo :bar :baz}
関数リテラル
カッコで囲ってその直前に # をつけると関数リテラルになる ( #( ... ) ).
#(zero? (rem % 3))
は,
(fn [x] (zero? (rem x 3)))
と書ける。ネストした関数リテラルを書くことはできない。
9 notes · View notes
tnoda-clojure · 9 years
Link
VimConf 2015 での @ujm の発表スライド, Clojure を Vim で書くときに役立つプラグインの最新情報が整理されている。 @ujm は neoclojure プラグインの作者でもあるので, Vim プラグイン開発者にも役立つ情報満載のスライドである。
1 note · View note
tnoda-clojure · 9 years
Link
この記事には Clojure で core.typed を使おうとしたときに感じることがまとめられているので, core.typed を使うかどうか考えている人は,一通り読んでみると良いでしょう。 core.typed によってもたらされる型システムの安心感は何物にも代え難いのですが, core.typed 導入による不便もあるので,利得と損失とどちらが大きいかを考えて導入するべきです。 CircleCI のチームは両者を比較して core.typed を使うのをやめています。
この記事でも指摘されている core.typed を使うときの不便なところには,
コンパイルが遅くなる
Scala みたいになる
だったら始めから Scala でよいのでは?
Clojure 言語を全てサポートしているわけではない
たとえば comp 関数を扱えない
普通サードパーティのライブラリは core.typed サポートしていない
楽をしようと思って使うライブラリに,自分で型情報を付加するつらみ
があります。
CircleCI のチームは代替策として Prismatic Schema を使うことにしたそうです。 Prismatic Schema は型検査をするのではなく,データ型のバリデーションをするライブラリです。 この記事で指摘している core.typed の不便なところもなく,使いたいところだけに schema を書けるので,段階的な導入にも向いています。
私は, core.typed よりも Prismatic Schema のほうが好みです。
4 notes · View notes
tnoda-clojure · 9 years
Link
この動画を見て ClojureScript React Native という「黒魔術 on 黒魔術」に魅了されていまい,ダークサイドに堕ちるかどうかの瀬戸際に立っています。
1 note · View note
tnoda-clojure · 9 years
Link
よい。日本語なのでおすすめ。
Clojure の開発環境をつくる方法はいくつかあるので,好みのものを選べばよいが,何を選んでよいのか分からないという場合は,とりあえずこのページを見て Cursive (IntelliJ のプラグイン) をインストールして IntelliJ 環境を作るのがよい。
Cursive は本来は有償だが,今のところ試用期間中ということで無償で使える。有償になる際は RubyMotion 並の価格になるという噂を聞いたが確かではない。
0 notes
tnoda-clojure · 9 years
Link
本日の Datomic 案件です。 Datomic free に依存しています。SIer でチャットツールとして使われているようです。
なお、導入したチャットツールはこちらです!https://t.co/9pauo1ym9Cスタンドアロンjarが提供されているので導入簡単だった!自プロジェクトのサーバーにたてられるので、SIer的にも安心!
— しょぼちむ@接待 (@syobochim) September 2, 2015
1 note · View note
tnoda-clojure · 9 years
Link
本日の Datomic 案件です。
1 note · View note
tnoda-clojure · 9 years
Text
Java の List を Clojure の List にするはなし
Clojure の特長の一つに Java との親和性の高さがあります。 Clojure のプログラム中では Java のオブジェクトやメソッドを Clojure の関数やコレクションと同じくらい簡単に扱うことができるのです。この親和性の高さを支えているのが Java のコレクションと Clojure のコレクションとの相互運用性です。
この記事では、Java のコレクション 1 を Clojure プログラム中で扱う方法について解説します。 Scala についてはねこはる先生が Java の List を Scala の List にするはなし をまとめていますので、合わせてご覧ください。
Java の List を Clojure で使う
Java の List を Clojure で使うのは簡単です。 Java の List は シーケンスっぽい ので、 map や filter などのシーケンス関数にそのまま渡すことができます。何もしなくてもそのまま使えます。
user> (def xs (doto (ArrayList.) (.add 1) (.add 2) (.add 3))) #<Var@32364687: [1 2 3]> user> (class xs) java.util.ArrayList user> (->> (map #(* % 7) xs) (filter odd?) (reduce +)) 28
Java の Set や Map なども同様にシーケンスっぽいので、何もしなくてもそのままシーケンス関数で使うことができます。
user> (import 'java.util.TreeSet) java.util.TreeSet user> (def ys (doto (TreeSet.) (.add 1) (.add 4) (.add 11))) #<Var@3536d41f: #{1 4 11}> user> (class ys) java.util.TreeSet user> (count (filter odd? ys)) 2
Java の List を Clojure のベクタにする
Java のコレクションを Clojure のコレクションに変換するには into が便利です。空の Clojure コレクションを用意して、それに Java のコレクションを注ぎ込むだけです。
user> (class xs) java.util.ArrayList user> xs [1 2 3] user> (def v (into [] xs)) #<Var@33e27fc6: [1 2 3]> user> (class v) clojure.lang.PersistentVector user> (def q (into clojure.lang.PersistentQueue/EMPTY xs)) #<Var@4c04b2d7: <-(1 2 3)-<> user> q <-(1 2 3)-< user> (class q) clojure.lang.PersistentQueue
変換先の Clojure コレクションがベクタかセットである場合は、 into の代わりに vec, set 関数をそれぞれ使うこともできます。
user> xs [1 2 3] user> (class xs) java.util.ArrayList user> (def v' (vec xs)) #<Var@44584fa5: [1 2 3]> user> v' [1 2 3] user> (class v') clojure.lang.PersistentVector user> (def s' (set xs)) #<Var@420215a4: #{1 3 2}> user> s' #{1 3 2} user> (class s') clojure.lang.PersistentHashSet
Clojure の List を Java の List にする
Clojure のリスト、ベクタ、セット、キュー、シーケンスは j.u.Collection の読取専用メソッドを全て実装しているので、リードオンリーで扱う限りは Java のコレクションに変換しなくても j.u.Collection オブジェクトとして使えます。 Java のコレクションに変更する場合でも、 Clojure のコレクションを Java コレクションのコンストラクタにそのまま渡すだけで変換できます。
user> (comment "Clojure のベクタから Java のリストへ") nil user> (def jl (ArrayList. [1 2 3 5 7 8 9])) #<Var@52efcd0: [1 2 3 5 7 8 9]> user> (class jl) java.util.ArrayList user> (comment "Clojure のベクタから Java のセットへ") nil user> (def js (TreeSet. [1 1 2 3 4 4 4 9])) #<Var@6f53ce56: #{1 2 3 4 9}> user> (class js) java.util.TreeSet
くわえて、Clojure のマップは j.u.Map を実装しているので、そのまま Java のマップのコンストラクタに渡すことができます。
user> (import 'java.util.HashMap) java.util.HashMap user> (def jm (HashMap. {"foo" 1, "bar" 2, "baz" 1})) #<Var@bbc8803: {"bar" 2, "baz" 1, "foo" 1}> user> (class jm) java.util.HashMap
おわりに
Java のコレクションがシーケンスっぽいこと
Java のコレクションは into で Clojure のコレクションに変換できること
Clojure のコレクションは Java コレクションのコンストラクタで Java のコレクションに変換できること
をみてきました。この特長のおかげで、Java のコレクションインタフェースを理解した「お行儀のよい」ライブラリであれば Clojure で簡単に扱うことができます。
Footnotes:
1
`java.util.*` のコレクションクラス
5 notes · View notes
tnoda-clojure · 9 years
Text
シーケンスっぽい?
map や filter, reduce などのシーケンス関数にシーケンスではないのものを渡すと,暗黙のうちに内部で seq が呼ばれてシーケンスではないものシーケンスに自動変換されます。この機能は便利で,たとえば,ベクタやマップなどのコレクションをそのままシーケンス関数に渡すことができて, seq 一回分コード量が減ります。
Pure Clojure でコードを書いている場合は通常はシーケンスっぽいものはだいたいシーケンスに変換できるので問題は起きません。しかし, seq がシーケンスに変換できないものを渡してしまうと IllegalArgumentException が発生するので,とりわけ Java のオブジェクトをシーケンス関数に直接渡す場合などには,何がシーケンスに変換できて,何ができないのかを覚えておく必要があります。
ソースコードで確認する
そこで clojure.org を調べてみたのですが, seq がシーケンスに変換できる対象範囲についてのドキュメントが見つかりません。もちろん seq の docstring にもそれらしい記述がありません。このようなときに役に立つのが Clojure のソースコードです。 seq に相当する部分のソースコードは GitHub の https://github.com/clojure/clojure/blob/a752736c1a14dce31e2f1cc30adde741328b4b12/src/jvm/clojure/lang/RT.java#L503-L530 にあるので見てみましょう。
static public ISeq seq(Object coll){ if(coll instanceof ASeq) return (ASeq) coll; else if(coll instanceof LazySeq) return ((LazySeq) coll).seq(); else return seqFrom(coll); } static ISeq seqFrom(Object coll){ if(coll instanceof Seqable) return ((Seqable) coll).seq(); else if(coll == null) return null; else if(coll instanceof Iterable) return chunkIteratorSeq(((Iterable) coll).iterator()); else if(coll.getClass().isArray()) return ArraySeq.createFromObject(coll); else if(coll instanceof CharSequence) return StringSeq.create((CharSequence) coll); else if(coll instanceof Map) return seq(((Map) coll).entrySet()); else { Class c = coll.getClass(); Class sc = c.getSuperclass(); throw new IllegalArgumentException("Don't know how to create ISeq from: " + c.getName()); } }
まず, seq() から見ていきましょう。この部分は簡単でシーケンスであれば,それをそのまま返すだけのメソッドです。すなわち,
ASeq のインスタンスであれば ASeq として返す
LazySeq のインスタンスであれば LazySeq.seq() してシーケンスとして返す
わけです。もし, seq に渡されたオブジェクトがシーケンスでない場合は, seqFrom() によりそのオブジェクトに対応するシーケンスが作られます。すなわち,
Seqable のインスタンスであれば, Seqable.seq() でシーケンスを作る
null はそのままシーケンスになる
Iterable のインタンスであれば, chunkIteratorSeq() でシーケンスを作る
配列であれば, ArraySeq.createFromObject() でシーケンスを作る
CharSequence であれば, StringSeq.create() でシーケンスを作る
Map のインスタンスであれば,いったん entrySet() にしてからもう一度 seq を呼ぶ
そして entrySet() が返す Set は Iterable を継承しているので,最終的には chenkIteratorSeq() が呼ばれて結局シーケンスになる
わけです。
おわりに
seq がシーケンスに変換できる「シーケンスっぽい」オブジェクトの種類について調べてみました。シーケンスっぽいオブジェクトとは,
元からシーケンスになっているもの
通常のシーケンス (ASeq)
遅延シーケンス (LazySeq)
シーケンスに変換可能なもの
Clojure の Seqable
Clojure の nil (Java の null)
j.l.Iterable
配列
j.l.CharSequence
j.u.Map
となります。これら以外のもの seq すると IllegalArgumentException です。
Clojure でよく使うデータ型のうち,
文字列
Clojure の文字列は j.l.String で, j.l.String が j.l.CharSequence を実装しているのでシーケンスっぽい
コレクション (リスト,ベクタ,セット,マップ,キュー)
Clojure のコレクションは全て Seqable なのでシーケンスっぽい
レコード
Clojure のレコードは Seqable なのでシーケンスっぽい
なので,数値,文字,真偽値,関数以外の値はだいたいシーケンスっぽいと思っていて問題ありません。なので, map や filter, reduce で IllegalArgumentException に悩まされることは無いでしょう(ただし,バグを埋め込んだ場合を除く)。
この記事を書いたときのバージョン
Clojure 1.7.0
7 notes · View notes
tnoda-clojure · 9 years
Text
Clojure 無料相談のお知らせ ※2015.8月末実施分まで
最近お問い合せの多い Clojure についての無料相談を個人事業として実施します.みなさまこの機会にぜひ Clojure をご検討ください.
実施要領
初回限定 1 時間の Clojure 導入相談を承ります.ご相談の結果,Clojure を導入する,見送る,引き続きご相談いただくなどのご判断は全てお客さまのご意向にお任せします.サービスの売り込みはいたしませんので,安心してご利用ください.
対象
Clojure の新規導入をご検討中の企業様(恐れ入りますが Clojure を既に導入済の企業様はご遠慮ください)
相談内容
プロジェクトにおける開発言語選定
社内標準技術への採用検討
Clojure に関する研究開発
日程
無料相談受付期間
2015年8月17日 (月) – 2015年8月26日 (水)
無料相談実施期間
2015年8月20日 (木) 2015年8月24日(月) 2015年8月27日(木)–2015年8月31日 (月) の平日 10:00–20:00
好評につき 8/20 (木), 8/21 (金) 実施分の受付を終了しました (8/18)
好評につき 8/24–8/26 実施分の受付を終了しました (8/24)
場所
別途ご相談(お客さま事業所内,あるいは Skype/Hangouts でのご相談も可)
想定フォーマット
Clojure についての概説 (20分)
導入をご検討中のプロジェクト企画についてのヒアリング (20分)
Clojure 導入のメリット・デメリットについての検討,または,代替案についてのディスカッション (20分)
成果物
無し
無料の範囲について
1 時間分の相談料金が無料となります.
無料とならない範囲について
交通費実費を別途申し受けます.
原則として京都駅を起終点とする普通席特急利用の往復運賃
ただし,京都市内および大阪市内は交通費無料とします.
神戸市内,または,東京23区内は,日程によっては交通費無料となる場合があります.別途お問い合わせください.
おことわり
無料相談中の録音,録画はお断りします.
開発中案件のご相談はお受けしません(別途,有料でのご対応となります).
NDA の手交が必要となる場合は,事前に文面案をご提示ください(文面の確認にお時間を頂戴する場合があります).
Clojure の採用が最適解であると判断できない場合,別のプログラミング言語をご案内することがあります.ご案内する可能性のあるプログラミング言語は,Scala, Go, Python, R, Ruby, C++11, Java 8 となります.
その他,お問合せ多数の場合や,私個人の判断によりご相談をお受けできない場合がございます.あらかじめご了承ください.
免責事項
本無料相談は細心の注意を払い実施しますが,お伝えする情報の最新性,正確性,有用性,確実性,安全性,適合性,合法性について一切の保証を与えるものではありません.
お問い合わせ
私の Twitter アカウント @tnoda_ 宛に DM をお送りください.お客さまアカウントのフォローが必要な場合はお手数ですがメンションにてその旨をお知らせください.折り返し,私の LinkedIn プロフィール URL をお伝えしますので,以降,LinkedIn のメッセージ機能を使って連絡させていただければ幸いです.私のレジュメも LinkedIn 上で公開しておりますので、こちらでご確認ください.本ページに記載の事項についてのご質問は,8/26 (水) までページ下部の Disqus フォームででも受け付けておりますので,ご利用ください.
1 note · View note
tnoda-clojure · 9 years
Text
小さいベクタの代替としてのレコードの活用
Table of Contents
1. ベクタのメモリ消費
2. 代替策としてのレコードの提案
2.1. 余談
3. タプルとの比較
4. おわりに
5. 付録: jol の利用
Clojure のベクタは persistent なデータ構造でありながら高速に操作できる優れたコレクション型です。一方で,要素数が少ないときでもそこそこのメモリを消費するという弱点もあります。この弱点を解消するために,Clojure 1.8 ではタプル導入が議論されています(たとえば,CLJ-1517 など)。
Clojure 1.8 でタプルが導入されるとベクタのメモリ効率が向上するので嬉しいのですが,それまで待てない場合の代替策として,この記事ではレコードの利用を提案します。この記事では,ベクタがどの程度メモリを消費するかを確認したあとで,ベクタのメモリ使用量とレコードのメモリ使用量とを例を挙げて比較します。最後に,レコードと予想されるタプル実装とについて,メモリ使用量を比較検討します。
ベクタのメモリ消費
簡単な例として整数 2 要素のベクタ, [1 2] がどのくらいメモリを消費するかを確認してみます。確認のために,OpenJDK の jol を利用します。
user> (import 'org.openjdk.jol.info.GraphLayout) org.openjdk.jol.info.GraphLayout user> (.toPrintable (GraphLayout/parseInstance [1 2])) clojure.lang.PersistentVector@18fa7545d object externals: ADDRESS SIZE TYPE PATH VALUE 7400f9d70 24 clojure.lang.PersistentVector$Node .root (object) 7400f9d88 16 java.util.concurrent.atomic.AtomicReference .root.edit (object) 7400f9d98 144 [Ljava.lang.Object; .root.array [null, ...] 74013eef0 24 java.lang.Long .tail[0] 1 740155780 24 java.lang.Long .tail[1] 2 7b40a3e88 24 [Ljava.lang.Object; .tail [1, 2] 7b40a4008 40 clojure.lang.PersistentVector (object)
この実行例では,jol の結果から不要な行を削除して見易くしています。 clojure.lang.PersistentVector である [1 2] が使用しているメモリは,結果表の SIZE 列の数値を足し合わせたものになります。すなわち,
user> (+ 24 16 144 24 24 24 40) 296
なんと 296 バイトです。膨張の主因は .root.array に確保されている空の Object[32] です。これは Clojure のベクタが木構造でデータを管理するときに使うもので,ベクタの要素数が増えたときに威力を発揮するのですが,要素数 2 では文字通り無用の長物になってしまいます。
Clojure 1.8 のタプルで解決しようとしているのはこの問題で,ベクタの要素数が小さいときには Tuple という別クラスを作って Object[32] を作らないようにするという改善が入る予定です。
代替策としてのレコードの提案
Clojure 1.8 でタプルが入るとして,それまでの間にメモリを節約したい場合はどうすればよいのでしょう。いくつか手段はあるのですが,Clojure でお手軽に使える方法として,この記事ではレコードの利用を提案します。たとえば, [1 2] と同じく整数 2 要素の場合は,
user> (defrecord Pair [^int x ^int y]) user.Pair user> (Pair. 1 2) {:x 1, :y 2}
の Pair のようなレコードを定義します。ベクタと同様に jol でメモリ使用量を確認すると,
user> (.toPrintable (GraphLayout/parseInstance (Pair. 1 2))) user.Pair@1d4de3e7d object externals: ADDRESS SIZE TYPE PATH VALUE 7978568f0 32 user.Pair (object)
32 バイトになりました。ベクタの約 1/10 と省メモリです。
余談
レコード Pair インスタンスのメモリ使用は 12 + 4 + 4 = 20 を切り上げて 24 バイトでは? と思う方がいらっしゃるかもしれませんが, 12 + 4 + 4 + 4 + 4 = 28 を切り上げて 32 バイトになるので 32 バイトであっています。 追加されている + 4 + 4 が何かという話はまたの機会に。
タプルとの比較
先に挙げたレコード Pair のメモリ使用ととタプルのメモリ使用を比較してみます。現在のところタプル実装は仕様が固まってはいないのですが, CLJ-1517 の議論で提案されている Tuple4 1 を想定してみます。 Tuple4 が採用された場合, [1 2] のメモリ使用量は, 12 + 4 + 4 + 4 + 4 + 24 + 24 = 76 を切り上げて 80 バイトになると想定されます。レコード Pair が 32 バイトだったので,タプルが導入されてもレコード Pair のほうがメモリ効率だけを考えると優れています。
おわりに
小さいベクタのメモリのオーバーヘッドが大きいことを確認し,消費メモリを少なくしたいときのベクタの代替としてレコードを提案しました。整数 2 要素のベクタの場合,レコードに置き換えるとメモリ消費が 1/10 近くになることがあることを示しました。また,レコードと想定されるタプル実装とについてメモリ使用量の比較を行い,タプルが導入された後でも,レコードによりメモリ消費を改善できる可能性があることを示しました。
付録: jol の利用
jol を利用するために,この記事の例では dependencies に
[org.openjdk.jol/jol-core "0.3.2"]
を追加して REPL を起動しています。
Footnotes:
1 Tuple0 から Tuple4 までの 5 つのクラスをまとめて一つのクラスにしようという提案
2 notes · View notes
tnoda-clojure · 9 years
Link
GitHub でこの 1 ヶ月に人気だった Clojure プロジェクトへのリンク。月例で眺めて初見のものがあればチェック。
1 note · View note