|
ToDo:
|
少しだけ時間が取れ始めたのでお勉強です。Clojureは面白い。
(defproject async "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:main async.core
:aot [async.core]
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.8.0"]
[org.clojure/core.async "0.3.443"]])
でcore.asyncを依存関係に入れちゃいます。
goマクロのbodyのみ>!や<!のシングルビックリマーク!使えるようです。
なのでgoマクロから呼ばれた関数でもNGでした。
ブロックするのでmainはダブル吃驚マーク!!です。
(ns async.core
(:require [clojure.core.async
:as a
:refer [>! <! >!! <!! go chan buffer close! thread
alts! alts!! timeout]])
(:gen-class))
(defn go01[ch]
(go
(println "Start 01")
(loop [i 0]
(Thread/sleep 100)
(println "Going 01!")
(if (< i 10)
(recur (inc i))
(>! ch "01")))))
(defn go02[ch]
(go
(println "Start 02")
(loop [i 0]
(Thread/sleep 50)
(println "Going 02")
(if (< i 10)
(recur (inc i))
(>! ch "02")))))
(defn -main[& args]
(let [ch (chan 2)]
(go01 ch)
(go02 ch)
(println (<!! ch))
(println (<!! ch))))
久しぶりに呑んだ。
(ns asynctimeout.core (:require [clojure.core.async :as a :refer [<!! timeout go]]) (:gen-class)) (defn bigjob[] (loop [i 0] (Thread/sleep 100) (println "loop=" i) (recur (inc i)))) (defn -main[& args] (let [t (timeout 1000)] (go (bigjob)) (<!! t) (println "Timeout")))
帰りにやられた~
threadを呼び出すと戻り値がchannelになってくれる。そのあたりがfutureとは違うようだ。
loopをforで最初作ってなぜかbig jobに入らず悩む。forだとlazy sequenceを生ずるのだよね。
(ns asyncthread.core
(:require [clojure.core.async
:as a
:refer [thread <!!]])
(:gen-class))
(defn threading[]
(loop[i 0]
(Thread/sleep 100)
(println "threading")
(if (< i 10)
(recur (inc i))
"Terminate")))
(defn -main[& args]
(let [c (thread (threading))]
(loop [i 0]
(do
(println "main" i)
(Thread/sleep 20))
(when (< i 10)
(recur (inc i))))
(println (<!! c))))
明日からはClojure - Transducersだな。
プログラミング言語 Rustが面白い。ちょっと時間があるときに齧っている。
Mac
brew install rust
で簡単にはいる。
オススメはrustup.rs - The Rust toolchain installerらしい。
curl https://sh.rustup.rs -sSf | sh
Windowsは
Installer使いました。VC++ 13or15が必要です。link.exeでLoad Moduleを作るみたい。
他のインストール方法 · プログラミング言語Rustからx86_64-pc-windows-gnu.msiを使うのがよさげだそうです。via Linux Programming / お気楽 Rust プログラミング超入門*1
でcargoであらカタはできるみたい。
cargo new foo --bin
cd foo
cargo run
あらもう
Hello, world!
ができちゃいました。
本はまだ英語版のみ
日本語でのProguraming Rustプログラミング言語Rust
The Rust Programming Languageで日本語のPDFになさった強者もいらっしゃいます。
sampleの日本語訳→Introduction | Rust by Example
*1 8/19追記
Clojureでパスカルの三角形 - Programmer's Noteに触発されてiterateで書いてみました。次の行を得るのは同じロジックになっちゃいます。
(defn nextRow[c]
(->> (partition 2 1 c)
(map (fn[[a b]](+' a b)))
(#(concat [1] % [1]))
(vec)))
(iterate (fn[a](concat a (list (vec (nextRow (last a)))))) '([1]))
+'でBuffer Over Flowを回避しました。参考→FibBuzz in Clojure · GitHub*1
*1 06/27追記
少し時間があったので久しぶりにClojureの復習
user> (defprotocol MyInterface
(method01 [this])
(method02 [this a b]))
MyInterface
user> (defrecord MyClass [prop01 prop02]
MyInterface
(method01 [this] (println prop01))
(method02 [this a b] (println (str a b prop02))))
user.MyClass
user> (->MyClass "a" "b")
#user.MyClass{:prop01 "a", :prop02 "b"}
user> (def a (->MyClass "a" "b"))
#'user/a
user> (.method01 a)
a
nil
user> (.method02 a "d" "e")
deb
nil