5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  
レス数が950を超えています。1000を超えると表示できなくなるよ。

【Lisp】プログラミング言語 Clojure #3【JVM】

1 :デフォルトの名無しさん:2013/09/28(土) 11:03:28.38
JVM上で動作するLisp方言「Clojure」のスレ。

Clojure - home
http://clojure.org/
http://www.try-clojure.org/

前スレ:
【Lisp】プログラミング言語 Clojure #2【JVM】
http://toro.2ch.net/test/read.cgi/tech/1318498898/
【Lisp】プログラミング言語 Clojure【JVM】
http://hibari.2ch.net/test/read.cgi/tech/1255533519/

419 :デフォルトの名無しさん:2014/08/03(日) 21:51:33.00 ID:OZgkKCQ2
「関数型がある」と「関数型プログラミングができる」と「オブジェクト指向で設計された仕様を容易にプログラミングができる」は全部違う概念だし

420 :デフォルトの名無しさん:2014/08/04(月) 05:48:01.75 ID:CjWTucg/
関数型チョットデキル

421 :デフォルトの名無しさん:2014/08/04(月) 09:39:00.71 ID:1p5oBQcp
上の qiita 見て darzana ってのに興味もった。

422 :デフォルトの名無しさん:2014/08/04(月) 10:57:17.07 ID:t7NoOLjl
>>421
俺も興味もった。
あとLightTableに移行するかそろそろ本格的に悩みどころ
ただ自分のEmacsキーバインド病が克服できなくて毎度IDEとか使うのが苦痛で困る。

423 :デフォルトの名無しさん:2014/08/04(月) 13:21:44.34 ID:+0AAjoao
>>418
Clojureは計算理論が云々という裏付けの話はしない方向にあるので、
あまりこのスレで話す話題ではないかもしれないが、
Scalaは計算理論的な裏付けをもってオブジェクト指向と関数指向の融合しているので、検証とかに発展できそうな用途がある。
http://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%A0%E3%83%80%E3%83%BB%E3%82%AD%E3%83%A5%E3%83%BC%E3%83%96
http://aofa.csce.kyushu-u.ac.jp/documents/Mochio-2014-06.pdf
http://www.slideshare.net/asami224/objectfunctional-analysis-and-design-and-programming

424 :デフォルトの名無しさん:2014/08/04(月) 13:28:42.64 ID:+0AAjoao
対して、erlangやclojureの作者は、オブジェクトが状態持つのが気に入らなかったので、別のやり方を探したのかも。

erlangの作者の考え方
http://www.infoq.com/jp/news/2010/07/objects-smalltalk-erlang
clojure作者の発表へのリンク集
http://ympbyc.hatenablog.com/entry/20130608/1370679170

OCamlは、単純に実装がうまく言ってないという雰囲気。
http://d.hatena.ne.jp/camlspotter/touch/20080906/1220723583

425 :デフォルトの名無しさん:2014/08/04(月) 13:33:24.36 ID:+0AAjoao
オブジェクト指向の世界も、最近はDDD、CQRS、MVVMなどの中で、値の流れを制御する手法もある。

DDDとかCQRSとか
https://www.ogis-ri.co.jp/otc/hiroba/technical/DDDEssence/index.html
http://msdn.microsoft.com/ja-jp/magazine/gg983487.aspx

GUIのmvcモデルも、RFPではなくともmvvmやfluxで一方通行にしてみたり
http://www.slideboom.com/presentations/591514/
http://www.infoq.com/jp/news/2014/05/facebook-mvc-flux

426 :デフォルトの名無しさん:2014/08/04(月) 13:40:42.84 ID:G6kBTzdf
>>421
申請書用のGUIとかバリデータは、別系統になるけれど作れたらいいなあ。

427 :デフォルトの名無しさん:2014/08/04(月) 20:27:27.74 ID:OlTeCvCA
>>421
LightTableにはemacsキーバインドある

428 :デフォルトの名無しさん:2014/08/04(月) 22:15:54.64 ID:t7NoOLjl
>>427
まえ使った時は移行できないくらい中途半端だったけどだいぶマシになったんだろうか?
キルリングがどのエディタ行っても対応しずらくていつも泣く

429 :デフォルトの名無しさん:2014/08/04(月) 22:53:02.13 ID:t7NoOLjl
ちとemacs 0.0.4入れてLightTableさわってみた
1:C-x C-fで新しいファイルを名前を付けて開けない(CMD-NでUntitleからsaveにするしか)
2:C-v でページダウン, M-vでペーストされて泣いた
3:ワード移動しようとしてM-fするとFind、C-M-fは無視
4:既知のkeybindを知る手段が見つからない(emacsのC-h b)
3の辺りでもう無理、それっぽくはなるけど奇病克服はミリだった
というかどのエディタもそうなんだが新規ファイル作成するときにDialog開くの止めて欲しい

430 :デフォルトの名無しさん:2014/08/05(火) 08:52:46.47 ID:vb6HFVjn
もう emacs でいいだろ、、、

431 :デフォルトの名無しさん:2014/08/05(火) 09:02:27.22 ID:jeY7qdd3
lighttableは入門しやすいEditorという位置付け(バグあるけど)でいいんじゃ無いかと。

http://thinkrelevance.com/blog/2013/06/04/clojure-workflow-reloaded
https://blog.safaribooksonline.com/2013/09/11/light-table-workflow-for-interactive-clojure-development/

432 :デフォルトの名無しさん:2014/08/09(土) 07:41:21.45 ID:Zgpg5vYP
EclipseとCCWを使ってる人っている?

433 :デフォルトの名無しさん:2014/08/09(土) 16:53:25.23 ID:uQhMf/RY
おいしいclojureで紹介してあったから使ったけど3日でemacsに戻った
IDEはマウスをクリックするのが面倒臭い

434 :デフォルトの名無しさん:2014/08/09(土) 17:00:28.57 ID:3JQlMz6N
ltは64bitだと接続失敗するのが嫌

435 :デフォルトの名無しさん:2014/08/09(土) 19:30:27.34 ID:55eCMDAc
compojure と enlive と clojure.java.jdbc でwebサイト作り始めてだいぶ慣れてきたんだけど、webサイトってclojureで書いても面倒な手作業が多いんだな。それでもjavaやphpよりかはすっきりしている気がするが。
webサイトとかwebアプリ作るのって人海戦術が必要なんだなって実感した。

436 :デフォルトの名無しさん:2014/08/09(土) 19:34:59.03 ID:uQhMf/RY
javaで書いた資産を貼りつける糊だと思えば…

437 :デフォルトの名無しさん:2014/08/09(土) 19:44:43.91 ID:3JQlMz6N
html, css, js, http
これだけでもかなり面倒

438 :デフォルトの名無しさん:2014/08/10(日) 02:10:41.28 ID:LSnpUDFj
slimv.vimを使えば結構vimでも戦えると思うんだよね
でも日本語の情報が殆ど無い…

439 :デフォルトの名無しさん:2014/08/10(日) 13:01:10.31 ID:GH83A0dN
>>437
それはどの言語でも面倒
結局jspも失敗だし

440 :デフォルトの名無しさん:2014/08/10(日) 13:25:03.63 ID:SdwvqGl2
>>439
jspつかサーバサイドjavaはxml地獄が酷いからなぁ

441 :デフォルトの名無しさん:2014/08/10(日) 15:08:04.03 ID:dsPIdx92
今時のjava・webフレームワークはxmlほとんど書かなくてよくなってるよ。
そのかわりアノテーションだらけと、ルール分かってないとプログラムがどう繋がってるのかさっぱりわからない。

442 :デフォルトの名無しさん:2014/08/10(日) 15:13:04.98 ID:SdwvqGl2
>>441
その点ClojureのWebフレームワークは凄く練られてる感じする
urlマッチングも構成要素の設定も全部s式(というかclojureの通常のリテラル表記)だけどそれが凄く読みやすい。

443 :デフォルトの名無しさん:2014/08/12(火) 09:56:55.48 ID:5yaOghBO
S式DBが欲しいけど見た事ないんでMongoDBでも使うべきか

444 :デフォルトの名無しさん:2014/08/12(火) 16:07:43.04 ID:YQE+wZnr
jsonやxml、オブジェクトデータストア、グラフDBってのは聞くけど、S式っては聞かないね。
単体でも分散環境でも、lispの実行環境自体がS式のかたまりっていえるけど、
erlangだと、ETSとか名前もってるストレージがある。

lisp関連で特長的なデータベースは、問い合わせにprologやdatalogを使うみたい。
AllegroGraph
http://yuumi3.hatenablog.com/entry/20101126/1290750836
Datomic
http://hozumi.github.io/2012/03/datomic-ja.html

445 :デフォルトの名無しさん:2014/08/12(火) 16:13:53.02 ID:+sDF17YZ
>>443
DatomicならS式じゃないけどClojureのリテラルまんまだよ。
でも規模が合わないと予算が見合わないんだよね>>個人敵な実験結果では凄く良いんだけど稟議通すのだけでも至難の業

446 :デフォルトの名無しさん:2014/08/12(火) 17:30:29.71 ID:HoC4qBru
clojureとかDatomicとかを、稟議必要なシステムで使おうとしてる企業すごいな!
経営者から見たらclojureみたいなマイナー言語で実装するメリットないと思うんだが。
どこの会社?そこで働きたい

447 :デフォルトの名無しさん:2014/08/12(火) 18:01:08.56 ID:Uf5VA/xc
>>446
試用じゃないなら、せいぜい大学のゼミくらいではなかろうか

448 :デフォルトの名無しさん:2014/08/12(火) 19:37:11.26 ID:5yaOghBO
>>444
>>445
なるほど、興味深い。参考にします!

449 :デフォルトの名無しさん:2014/08/12(火) 21:00:18.73 ID:L4nzelPm
clojureでソフトウェア開発を行うニャンパス株式会社
http://manga-style.jp/press/?p=5652

450 :デフォルトの名無しさん:2014/08/12(火) 21:25:36.93 ID:YQE+wZnr
ここも、デザイナーからプログラマーまで使ってるとか。
http://xcoo.jp/

あとは、データ解析やってるの人が、道具として使ってる人が多いみたい。

451 :デフォルトの名無しさん:2014/08/12(火) 22:43:27.24 ID:wYq/8Bw7
最近はやりのマイクロサービス(ただのweb api)作ってサービスに組み込むのが、自社サービス利用の早道だとおもう。

452 :デフォルトの名無しさん:2014/08/12(火) 23:08:13.55 ID:wYq/8Bw7
http://www.infoq.com/jp/news/2014/07/soundcloud-microservices
http://www.slideshare.net/pcalcado/from-a-monolithic-ruby-on-rails-app-to-the-jvm

記事みたいにマイクロサービスにするとサービス内部でモデル呼び出すより、ネットワーク待ちとネットワーク負荷が増える。
そのため非同期にしたり、ネットワーク負荷に強い環境を選んだ方がいいけど、そんなに呼び出しなければなんとかなる。

453 :デフォルトの名無しさん:2014/08/13(水) 06:19:57.05 ID:vJDHFyrf
今後は、REST API作ったり、組み合わせHTMLにするところで、まとまった記事が増えそう。

Micro services on the JVM part 1 - Clojure
http://pjagielski.pl/2014/02/24/microservices-jvm-clojure/

Recommended Reading : Microservices Architectures and Clojure (A Quick Survey of Resources)
http://www.digitalcld.com/cld/recommended-reading-microservices-architectures-and-clojure/

454 :デフォルトの名無しさん:2014/08/14(木) 20:45:10.78 ID:gFPXYhlq
clojure使ってる人達って、javaをさんざん使い倒して飽きた人達なの?

455 :デフォルトの名無しさん:2014/08/14(木) 20:55:03.71 ID:H7nksnys
lispの資産をjavaで活用したいだけです

456 :デフォルトの名無しさん:2014/08/14(木) 21:03:01.29 ID:qqEX3gtd
同じくです

457 :デフォルトの名無しさん:2014/08/14(木) 21:39:26.50 ID:5nUdzJIv
Javaはほとんど使ったことがなかったけど、
Javaのライブラリが使えるのは非常に便利。

458 :デフォルトの名無しさん:2014/08/14(木) 22:07:25.79 ID:SManwhcb
Javaでプログラミングするには人生は短すぎる

459 :デフォルトの名無しさん:2014/08/15(金) 00:52:57.53 ID:KfGLwiLy
rubyやphpから移って来たという人もいるね。
日本の会社だとscalaという話が多いが。
javaからだと、replとして使い始めた人も少しいる。

460 :デフォルトの名無しさん:2014/08/15(金) 00:58:49.53 ID:KfGLwiLy
http://cemerick.com/2012/08/06/results-of-the-2012-state-of-clojure-survey/
二年前あった英語の調査だと、移行元は
Java33%, Ruby 16%, Python 15%, C# 6%で、phpやlispをメインで使ってた人は少ない。

461 :デフォルトの名無しさん:2014/08/15(金) 01:06:41.15 ID:KfGLwiLy
ただ、clojureが無くなったら代わりに
Scala 35%, Haskell 33%, Python 27%, Ruby 22%, CL 24%, Scheme 19%, Java 19%, Erlang 16% (複数選択)
使うといってるので、2割近くはlisp系をサブで使っていたりするのもしれない。

462 :デフォルトの名無しさん:2014/08/15(金) 02:58:49.14 ID:OYLuvNRz
PHPは童貞といっしょで恥ずかしくて書けないだけ

463 :デフォルトの名無しさん:2014/08/15(金) 08:05:56.09 ID:2TUn/svM
Clojure って、あるモジュールの、一部の挙動だけ変えたい、みたいな時どうするの?
ruby, perl だと継承して上書きしたり、mixin みたいに外から上書きしたりできるけど。
Clojure でも可能なのかな。

464 :デフォルトの名無しさん:2014/08/15(金) 13:21:51.10 ID:KfGLwiLy
改変してclojarsに上げるというのをよく見かける。ここには、redefの例も。
https://groups.google.com/forum/#!msg/clojure/HP3-HVR2UY0/bgQnEpvEKO4J

multimethodは、遅いけど継承っぽいことは出来る。
http://adambard.com/blog/structured-clojure-protocols-and-multimethods/

465 :デフォルトの名無しさん:2014/08/15(金) 13:34:43.42 ID:l0DJtVhW
関数型があるし継承なんていらんやん

466 :デフォルトの名無しさん:2014/08/15(金) 15:11:36.23 ID:7E4CoX1e
>>463
そのモジュールのソースコードに手を入れられないって事が前提なんだよね?

467 :デフォルトの名無しさん:2014/08/15(金) 15:20:20.29 ID:qWbEfk/6
>>466
どの言語であっても、とりあえず動いていたら、その機能自体のソースコードには手を入れたくない

468 :デフォルトの名無しさん:2014/08/15(金) 22:20:40.43 ID:TIrh0e3z
>>467
どこの発展途上国の整備士だよwww

469 :デフォルトの名無しさん:2014/08/15(金) 22:24:42.21 ID:qWbEfk/6
>>468
鉄道の信号インフラで40年前に書いたアセンブラがいまだに現役で稼働してるのにメンテできる人間が引退してしまった国の整備士です

470 :デフォルトの名無しさん:2014/08/15(金) 22:57:30.63 ID:8BWzrSgf
>>463
どういう状態とかコードでその機能使いたいのかイマイチわからん。
object指向言語の場合インジェクションとかで必要になるケースはあるけどclojureでそういう事する必要性感じたこと無いんだが。

471 :デフォルトの名無しさん:2014/08/17(日) 16:50:12.38 ID:Zw9zZO1f
clojureで、マクロ関数呼び出しの中でifやletなどのマクロ関数のシンタックスに従わないステートメントを入れたい場合、#みたいな何かクオートするものを付ける必要があるんでしょうか?
今、enliveのdeftempleteでこまってて
(deftemplate some-page "public/some-page.html" [condition value]
(if condition
'([:#hoge] (content "hoge")
'([:#gehe] (content "gehe")))
↑いいかげんだけど、こんなことがやりたいんだけど、マクロに入る前にifが評価されるような仕組みってあるのかな〜?
プログラミングClojure第2版には書いてなかったとおもうんだけどなぁ

472 :デフォルトの名無しさん:2014/08/17(日) 17:17:04.64 ID:Zw9zZO1f
↑調べたとところ、無理でした。
マクロのマクロを書かないとダメかも

473 :デフォルトの名無しさん:2014/08/17(日) 21:45:39.55 ID:fVh2eGMw
http://d.hatena.ne.jp/sy-2010/touch/20110408/1302243154
これは、参考になるかな?

474 :デフォルトの名無しさん:2014/08/17(日) 21:58:50.26 ID:fVh2eGMw
あとは、defmacroではなく、defnぐらいじゃダメなん?

475 :デフォルトの名無しさん:2014/08/18(月) 02:55:55.46 ID:2INT0ULh
マクロはコンパイル時に処理されるのに引数のconditionの内容は実行時にわかるんだからムリじゃね

476 :デフォルトの名無しさん:2014/08/18(月) 07:55:45.78 ID:Zm5JvuSQ
conditionが定数って事かと思ったけど、それなら悩むはずもなく

477 :デフォルトの名無しさん:2014/08/18(月) 09:17:10.73 ID:xQ9PYIZO
結局ほとんどの場合コードは手に入るから、改変するのがいいのか、、、
それだと、その後のセキュリティ対応とかバグフィックスとか、自分で追従してく必要があるから現実てきじゃないけど。
望む挙動するような柔軟性を実装してp-r するのが今の流れなんだろうな。

478 :デフォルトの名無しさん:2014/08/18(月) 10:04:47.48 ID:FxPIiMhs
え、deftemplate二つ作って関数で振り分けすれば済む話じゃないの…
使ったことないから分からんけど

479 :デフォルトの名無しさん:2014/08/18(月) 13:13:34.45 ID:iY7TED8z
deftemplate複数だと重複部分がいやなんですよ
あ、そうだ。テンプレートを入力してテンプレートをはくdeftemplateがあればいいのか!フィルターみたいにつかう

480 :デフォルトの名無しさん:2014/08/18(月) 14:16:58.49 ID:2INT0ULh
重複が嫌ならマクロを使おうと思ってしまうlisp脳

481 :デフォルトの名無しさん:2014/08/19(火) 01:55:21.95 ID:aPIs3Yjx
>>471
enliveのサンプルでこんなのあるけどやりたいことできるんじゃないの
(deftemplate microblog-template "net/cgrand/enlive_html/example.html"
[title posts]
[:title] (content title)
[:h1] (content title)
;;; koko
[:div.no-msg] (if (empty? posts)
identity
(substitute nil))
[:div.post] (clone-for [{:keys [title body]} posts]
[:h2 :a] (content title)
[:p] (content body))
[[:a (attr? :href)]] (set-attr :title "it's a link"))

482 :デフォルトの名無しさん:2014/08/27(水) 00:12:03.04 ID:VHuSWHvx
http://blog.cognitect.com/blog/2014/8/6/transducers-are-coming

読んでみたけど何のことやらさっぱり
transform + reducer で transducer なのはわかったけど

483 :デフォルトの名無しさん:2014/08/27(水) 01:46:11.68 ID:NgR5SA5u
Understanding Clojure Transducers Through Types
http://conscientiousprogrammer.com/blog/2014/08/07/understanding-cloure-transducers-through-types/

Clojure's Transducers are Perverse Lenses (self.haskell)
http://www.reddit.com/r/haskell/comments/2cv6l4/clojures_transducers_are_perverse_lenses/

型が決まる場合に限定すると、こういう説明が出来るらしい。
それはそれで前提知識が必要だけど。

484 :デフォルトの名無しさん:2014/08/27(水) 23:08:38.23 ID:13naRB3B
Clojure というか、関数型というか、とにかく副作用の無い関数と、変更不可の value を使ったプログラミングは楽しいんだけど、いざ、ruby とか perl とかの一般的な変数を変更しながら適当に組める世界へ戻ると、あー、楽だわーってなる。

Clojure はなんか、俳句とか短歌とかそういう制限内での表現を楽しむようなそんな感覚なんだよね。もちろん超個人的な印象でしかないチラシの裏だけど。

拙者に才能が無いだけでござるかwww否定できぬwwww

485 :デフォルトの名無しさん:2014/08/28(木) 06:24:50.44 ID:dvSjenwP
Haskellみたくガチガチじゃないんだから適度にdefればいいよ。
Clojureは凄く楽だよ

486 :デフォルトの名無しさん:2014/08/28(木) 10:17:58.59 ID:TNwY21bF
reduceって畳み込みのことだよね?

487 :デフォルトの名無しさん:2014/08/28(木) 17:53:40.70 ID:z8VcNRtv
副作用なしでやろうと思っても、配列の要素とか普通に変更されるしな…
変更不可の配列くらいデフォルトで用意してほしかったり

488 :デフォルトの名無しさん:2014/08/28(木) 18:12:09.74 ID:Gw1dAD8r
>>487
javaの生配列や生要素食わせたらそりゃそうできるのは普通の事じゃんよ

489 :デフォルトの名無しさん:2014/08/28(木) 20:23:21.88 ID:EjGlzjxq
配列なんてめんどくさいもん、パフォーマンスが必要でもない限り使いたくない

490 :デフォルトの名無しさん:2014/08/28(木) 20:40:22.09 ID:z8VcNRtv
>>489
数学の記述をそのままコーディングしたいときに使いたい

491 :デフォルトの名無しさん:2014/08/28(木) 20:44:38.20 ID:ZFv6krbe
>>486
yes

492 :デフォルトの名無しさん:2014/08/28(木) 20:50:22.93 ID:ZFv6krbe
http://www.slideshare.net/mobile/mikeranderson/2013-1114-enter-thematrix
https://github.com/mikera/core.matrix

行列計算のためにイミュータブルな配列用意するって他の言語でもあまり聞かないような。

493 :デフォルトの名無しさん:2014/08/28(木) 20:55:32.77 ID:ZFv6krbe
無いは嘘だな。使われないといった方が正しいか。
core.matrixだとイミュータブル、ミュータブルな演算があった。

494 :デフォルトの名無しさん:2014/08/28(木) 23:49:46.31 ID:q1Nilail
構文クオート`
アンクオート~
スプライシングアンクオート~@
がdefmacro以外の場所で使えるとは思わなかった。
defmacro以外の場所で使われているソース見たとき何してるのかさっぱり分からなかった。

495 :デフォルトの名無しさん:2014/08/29(金) 00:25:56.65 ID:gwJnPSQu
hiccupのselect-optionsでこういうのを書きたいとき
(hiccup.form/select-options [["aaa" "key1"]
["bbb" "key2"]
["ccc" "key3"]] "key2")

すでにoptionのリストがマップで用意されているときに
(def m {:key1 "aaa"
:key2 "bbb"
:key3 "ccc"})

上記のselect-optionsを書くのは2度手間で愚かしいから、
mを3つのベクタ
["aaa" "key1"] ["bbb" "key2"] ["ccc" "key3"]
に展開してくれるマクロってないかな?って探してみたけどなさそうで、
まあ、リストに入った形で作るのは簡単だけど、この場合はリストが邪魔になる。
自分でマクロつくるのも局所的でダサい感じがするので、どうしようかな〜って悩んだんだけど、こんな感じで出来た。

(hiccup.form/select-options `[~@(map (fn [[k v]] [v (name k)]) m)] "key2")

496 :デフォルトの名無しさん:2014/08/29(金) 00:54:43.30 ID:ZNTD6qKu
>>494
Schemeとかはリストつくるときに使ったりするけどClojureだとあんまり出番なさそう

497 :デフォルトの名無しさん:2014/08/29(金) 00:59:13.84 ID:n2eqBKYr
Reducer=関数を畳み込んでseqに対する処理のまとまりをつくる
transducer=reduceを再利用するために弄る道具
という認識でおk?

498 :デフォルトの名無しさん:2014/08/29(金) 10:02:46.86 ID:FcRVFksi
畳み込まれて弄られてみたい

499 :デフォルトの名無しさん:2014/08/29(金) 13:45:05.03 ID:SalYkWyb
transducerってhaskellの部分関数適用っぽいよね

Prelude> let chiceOdd = filter odd
Prelude> let double x = x*x
Prelude> let doubleSeq = map double
Prelude> doubleSeq [1,2,3,4,5]
[1,4,9,16,25]
Prelude> chiceOdd $ doubleSeq [1,2,3,4,5]
[1,9,25]
Prelude> sum $ chiceOdd $ doubleSeq [1,2,3,4,5]
35
Prelude>

500 :デフォルトの名無しさん:2014/08/29(金) 15:30:50.58 ID:VZ6uxtiu
deffooというマクロを作って、ひとつのファイルの中で
(deffoo bar ...)
(deffoo baz ...)
とやると、
・関数 handle-foo-bar と handle-foo-baz
・変数 foo-handlers = {:bar handle-foo-dar, :baz handle-foo-baz }
が定義されるようなマクロを作りたい。
後者は別のマクロを作って(define-foo-handlers)みたいにファイルのどこかに書くことにしてもいいけど
deffooの引数を再び手で列挙しなくていいようにしたい。

こういうのってできる?

501 :デフォルトの名無しさん:2014/08/29(金) 18:06:15.82 ID:SalYkWyb
>>500
(defn handler-name [exp]
(symbol (str 'handle-foo- (first exp))))
(defn destruct [exp]
[(handler-name exp)
(second exp)
(rest (rest exp))])

(defmacro deffoos [& exps]
`(do ~@(for [exp exps]
(let [[fname args body] (destruct exp)]
(list* 'defn fname args body)))
(def foo-handlers ~(reduce (fn [dict exp]
(assoc dict
(keyword (first exp))
(handler-name exp)))
{} exps))))

>(deffoos
(bar [x] (print x) (print x))
(baz [y] (print y) ))

>((:bar foo-handlers) 1)
11
nil
>((:baz foo-handlers) 2)
2
nil

502 :デフォルトの名無しさん:2014/08/29(金) 20:01:57.54 ID:ttFFbJAa
rein repl するとエラー出るんですがどうしたら良いんでしょう
環境はwindows7
ttps://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein.bat
からlein self-installして
lein versionは
Leiningen 2.4.3 on Java 1.8.0_20 Java HotSpot(TM) Client VM
です

503 :デフォルトの名無しさん:2014/08/29(金) 20:32:24.74 ID:SalYkWyb
>502
コマンドプロンプトに出てきたエラーをコピペしよう

504 :502:2014/08/29(金) 20:43:54.98 ID:ttFFbJAa
C:\Users\owner\Documents\Lisp\clojure>lein repl
nREPL server started on port 61020 on host 127.0.0.1 - nrepl://127.0.0.1:61020
Exception in thread "nREPL-worker-0" java.lang.NoSuchMethodError: clojure.tools.nrepl.StdOutBuffer.l
ength()I
at clojure.tools.nrepl.middleware.session$session_out$fn__7630.doInvoke(session.clj:43)
at clojure.lang.RestFn.invoke(RestFn.java:460)
at clojure.tools.nrepl.middleware.session.proxy$java.io.Writer$ff19274a.write(Unknown Source
)
at java.io.PrintWriter.write(Unknown Source)
at java.io.PrintWriter.write(Unknown Source)
at clojure.core$fn__5471.invoke(core_print.clj:191)
at clojure.lang.MultiFn.invoke(MultiFn.java:231)
at clojure.core$pr_on.invoke(core.clj:3392)
at clojure.core$pr.invoke(core.clj:3404)
at clojure.lang.AFn.applyToHelper(AFn.java:154)
at clojure.lang.RestFn.applyTo(RestFn.java:132)
at clojure.core$apply.invoke(core.clj:624)
at clojure.core$prn.doInvoke(core.clj:3437)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.core$apply.invoke(core.clj:624)
at clojure.core$println.doInvoke(core.clj:3457)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.main$repl_caught.invoke(main.clj:158)
at clojure.tools.nrepl.middleware.interruptible_eval$evaluate$fn__7569$fn__7582.invoke(inter
ruptible_eval.clj:76)
at clojure.main$repl$fn__6634.invoke(main.clj:259)
at clojure.main$repl.doInvoke(main.clj:257)
at clojure.lang.RestFn.invoke(RestFn.java:1096)
at clojure.tools.nrepl.middleware.interruptible_eval$evaluate$fn__7569.invoke(interruptible_
eval.clj:56)
at clojure.lang.AFn.applyToHelper(AFn.java:152)

505 :502:2014/08/29(金) 20:45:46.44 ID:ttFFbJAa
at clojure.lang.AFn.applyTo(AFn.java:144)
at clojure.core$apply.invoke(core.clj:624)
at clojure.core$with_bindings_STAR_.doInvoke(core.clj:1862)
at clojure.lang.RestFn.invoke(RestFn.java:425)
at clojure.tools.nrepl.middleware.interruptible_eval$evaluate.invoke(interruptible_eval.clj:
41)
at clojure.tools.nrepl.middleware.interruptible_eval$interruptible_eval$fn__7610$fn__7613.in
voke(interruptible_eval.clj:171)
at clojure.core$comp$fn__4192.invoke(core.clj:2402)
at clojure.tools.nrepl.middleware.interruptible_eval$run_next$fn__7603.invoke(interruptible_
eval.clj:138)
at clojure.lang.AFn.run(AFn.java:22)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

506 :502:2014/08/29(金) 20:46:25.91 ID:ttFFbJAa
REPL-y 0.3.2, nREPL 0.2.0-beta5NoSuchMethodError clojure.tools.nrepl.StdOutBuffer.length()I clojure
.tools.nrepl.middleware.session/session-out/fn--7630 (session.clj:43)NoSuchMethodError clojure.tools
.nrepl.StdOutBuffer.length()I clojure.tools.nrepl.middleware.session/session-out/fn--7630 (session.
clj:43)
Error loading namespace; falling back to userException in thread "nREPL-worker-1" NoSuchMethodError
clojure.tools.nrepl.StdOutBuffer.length()I clojure.tools.nrepl.middleware.session/session-out/fn--7
630 (session.clj:43)NoSuchMethodError clojure.tools.nrepl.StdOutBuffer.length()I clojure.tools.nrep
l.middleware.session/session-out/fn--7630 (session.clj:43)java.lang.NoSuchMethodError: clojure.tools
.nrepl.StdOutBuffer.length()I
#<Namespace user> at clojure.tools.nrepl.middleware.session$session_out$fn__7630.doInvoke(sess
ion.clj:43)

at clojure.lang.RestFn.invoke(RestFn.java:460)
at clojure.tools.nrepl.middleware.session.proxy$java.io.Writer$ff19274a.write(Unknown Source
)

507 :502:2014/08/29(金) 20:47:05.82 ID:ttFFbJAa
at java.io.PrintWriter.write(Unknown Source)
at java.io.PrintWriter.write(Unknown Source)
at clojure.core$fn__5471.invoke(core_print.clj:191)
at clojure.lang.MultiFn.invoke(MultiFn.java:231)
at clojure.core$pr_on.invoke(core.clj:3392)
at clojure.core$pr.invoke(core.clj:3404)
at clojure.lang.AFn.applyToHelper(AFn.java:154)
at clojure.lang.RestFn.applyTo(RestFn.java:132)
at clojure.core$apply.invoke(core.clj:624)
at clojure.core$prn.doInvoke(core.clj:3437)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.core$apply.invoke(core.clj:624)
at clojure.core$println.doInvoke(core.clj:3457)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.main$repl_caught.invoke(main.clj:158)

508 :502:2014/08/29(金) 20:47:31.29 ID:ttFFbJAa
at clojure.tools.nrepl.middleware.interruptible_eval$evaluate$fn__7569$fn__7582.invoke(inter
ruptible_eval.clj:76)
at clojure.main$repl$fn__6634.invoke(main.clj:259)
at clojure.main$repl.doInvoke(main.clj:257)
at clojure.lang.RestFn.invoke(RestFn.java:1096)
at clojure.tools.nrepl.middleware.interruptible_eval$evaluate$fn__7569.invoke(interruptible_
eval.clj:56)
at clojure.lang.AFn.applyToHelper(AFn.java:152)
at clojure.lang.AFn.applyTo(AFn.java:144)
at clojure.core$apply.invoke(core.clj:624)
at clojure.core$with_bindings_STAR_.doInvoke(core.clj:1862)
at clojure.lang.RestFn.invoke(RestFn.java:425)
at clojure.tools.nrepl.middleware.interruptible_eval$evaluate.invoke(interruptible_eval.clj:
41)
at clojure.tools.nrepl.middleware.interruptible_eval$interruptible_eval$fn__7610$fn__7613.in

509 :502:2014/08/29(金) 21:43:00.05 ID:ttFFbJAa
voke(interruptible_eval.clj:171)
at clojure.core$comp$fn__4192.invoke(core.clj:2402)
at clojure.tools.nrepl.middleware.interruptible_eval$run_next$fn__7603.invoke(interruptible_
eval.clj:138)
at clojure.lang.AFn.run(AFn.java:22)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
user=>

510 :502:2014/08/29(金) 21:45:44.73 ID:ttFFbJAa
未定義のaを入力すると

user=> a
Exception in thread "nREPL-worker-3" java.lang.NoSuchMethodError: clojure.tools.nrepl.StdOutBuffer.l
ength()I
at clojure.tools.nrepl.middleware.session$session_out$fn__7630.doInvoke(session.clj:43)
at clojure.lang.RestFn.invoke(RestFn.java:460)
at clojure.tools.nrepl.middleware.session.proxy$java.io.Writer$ff19274a.write(Unknown Source
)
at java.io.PrintWriter.write(Unknown Source)
at java.io.PrintWriter.write(Unknown Source)
at clojure.core$fn__5471.invoke(core_print.clj:191)
at clojure.lang.MultiFn.invoke(MultiFn.java:231)
at clojure.core$pr_on.invoke(core.clj:3392)
at clojure.core$pr.invoke(core.clj:3404)

511 :デフォルトの名無しさん:2014/08/29(金) 22:28:36.86 ID:gwJnPSQu
よくわかんないけど、
lein new hoge
してみて動く?

動かないんなら、インストールがいけてないんじゃない?

512 :502:2014/08/29(金) 22:36:13.28 ID:ttFFbJAa
C:\Users\owner\Documents\Lisp\clojure>lein new hoge
Generating a project called hoge based on the 'default' template.
The default template is intended for library projects, not applications.
To see other templates (app, plugin, etc), try `lein help new`.
と表示されて、フォルダとその中身は生成されました

513 :デフォルトの名無しさん:2014/08/29(金) 22:59:13.58 ID:y3Bk7XLE
C:\Users\owner\.m2かC:\Users\owner\.lein の中身一度消した方がよくね?

514 :502:2014/08/29(金) 23:18:03.96 ID:ttFFbJAa
.leinないのself-installsいがいと.m2を削除後
new hogeで生成されたフォルダを削除してからもう一回すると
C:\Users\owner\Documents\Lisp\clojure>lein new hoge
(Retrieving org/clojure/tools.nrepl/0.2.3/tools.nrepl-0.2.3.pom from central)
(Retrieving org/clojure/pom.contrib/0.1.2/pom.contrib-0.1.2.pom from central)
(Retrieving org/sonatype/oss/oss-parent/7/oss-parent-7.pom from central)
(Retrieving clojure-complete/clojure-complete/0.2.3/clojure-complete-0.2.3.pom from clojars)
(Retrieving org/clojure/tools.nrepl/0.2.3/tools.nrepl-0.2.3.jar from central)
(Retrieving clojure-complete/clojure-complete/0.2.3/clojure-complete-0.2.3.jar from clojars)
Generating a project called hoge based on the 'default' template.
The default template is intended for library projects, not applications.
To see other templates (app, plugin, etc), try `lein help new`.
C:\Users\owner\Documents\Lisp\clojure>
と出ました
hogeの中身は生成されました

515 :デフォルトの名無しさん:2014/08/29(金) 23:32:51.55 ID:y3Bk7XLE
>>514
それエラーじゃないので
.m2に必要なライブラリが無いのでダウンロードして実行しましたってメッセージ
.leinが無いはずないのだけど(leiningenが作る)
.leinにはlein self-installの時にleiningenの本体が入る
.m2はmavenのローカルリポジトリ
lein versionだといくつ?
うちは2.0.0で正常動作してる、もしbetaとか入ってるようならlein.batのバージョン設定部分を
SET LEIN_VERSION=2.0.0
とかしてからlein self-installしなおしてみるのも手かも

516 :デフォルトの名無しさん:2014/08/29(金) 23:41:13.55 ID:gwJnPSQu
lein new hoge できたんか!
じゃあ
cd hoge
lein repl
で動く?

だめなら、インストールがいけてないんじゃね?

517 :502:2014/08/29(金) 23:49:13.63 ID:ttFFbJAa
>>515
「.leinないの」は「.lein内の」のうち間違いです
C:\Users\owner\Documents\Lisp\clojure>lein version
Leiningen 2.4.3 on Java 1.8.0_20 Java HotSpot(TM) Client VM
>>516
C:\Users\owner\Documents\Lisp\clojure>cd hoge

C:\Users\owner\Documents\Lisp\clojure\hoge>C:\Users\owner\Documents\Lisp\clojure\lein.bat repl
(Retrieving org/clojure/clojure/1.6.0/clojure-1.6.0.pom from central)
(Retrieving org/clojure/clojure/1.6.0/clojure-1.6.0.jar from central)
nREPL server started on port 63616 on host 127.0.0.1 - nrepl://127.0.0.1:63616
REPL-y 0.3.2, nREPL 0.2.3
Clojure 1.6.0
Java HotSpot(TM) Client VM 1.8.0_20-b26
Docs: (doc function-name-here)
(find-doc "part-of-name-here")
Source: (source function-name-here)
Javadoc: (javadoc java-object-or-class-here)
Exit: Control+D or (exit) or (quit)
Results: Stored in vars *1, *2, *3, an exception in *e

user=>
こうなりました

518 :デフォルトの名無しさん:2014/08/29(金) 23:52:13.95 ID:SalYkWyb
>517
動いてね?

519 :502:2014/08/29(金) 23:58:12.16 ID:ttFFbJAa
>518
newで作成したフォルダ以外の
場所をカレントディレクトリとして起動すると>504
のようなメッセージが表示されます
これで正常なんでしょうか?

263 KB
新着レスの表示

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50
名前: E-mail (省略可) :


read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)