Skip to content

Instantly share code, notes, and snippets.

View killme2008's full-sized avatar
🎯
Focusing

dennis zhuang killme2008

🎯
Focusing
View GitHub Profile
@killme2008
killme2008 / tm.clj
Created September 19, 2015 14:57
《计算的本质》第五章,clojure 模拟图灵机。
(ns cljcomputionbook.tm
(:require [clojure.string :as cs]))
;;磁带
(defrecord Tape [left middle right blank]
Object
(toString [tape]
(pr-str tape)))
(defmethod print-method Tape [tape writer]
@killme2008
killme2008 / counter.exs
Created October 23, 2015 03:25
Elixir gen server example
defmodule Counter do
use GenServer
def start_link(init_value \\ 0, opts \\ []) do
GenServer.start_link(__MODULE__, init_value, opts)
end
## client apis
def get(c) do
GenServer.call(c, {:get})
end
@killme2008
killme2008 / CounterSupervisor.exs
Created October 23, 2015 03:46
Elixir supervisor example
defmodule CounterSupervisor do
use Supervisor
def start_link(v \\ 0) do
Supervisor.start_link(__MODULE__, v)
end
@counter_name Counter
#supervisor callback
def init(v) do
@killme2008
killme2008 / unless.exs
Created October 23, 2015 03:55
Elixir macro example
defmodule MyUnless do
defmacro unless(clause, then_clause, else_clause \\ nil) do
quote do
if !unquote(clause) do
unquote(then_clause)
else
unquote(else_clause)
end
end
end
@killme2008
killme2008 / blank.exs
Created October 23, 2015 04:03
Elixir protocols example
defprotocol Blank do
@doc "Returns true if data is considered blank/empty"
@fallback_to_any true
def blank?(data)
end
defimpl Blank, for: Any do
def blank?(_), do: false
end
@killme2008
killme2008 / my_sigis.exs
Created October 23, 2015 04:14
Elixir custom sigis example
defmodule MySigils do
def sigil_i(string, []), do: String.to_integer(string)
def sigil_i(string, [?n]), do: -String.to_integer(string)
end
@killme2008
killme2008 / y_z_combinator.exs
Created October 28, 2015 06:18
y and z combinator in elixir
y = fn (f) ->
(fn (x) ->
f.(x.(x))
end).(
fn (x) ->
f.(x.(x))
end)
end
z = fn (f) ->
@killme2008
killme2008 / unfold.clj
Last active November 2, 2015 23:21
unfold in clojure as Stream.unfold in elixir
(defn unfold
"Creates a lazy sequence based on start accumulator and step functon.
The step function transform the state as below:
step(value) -> [current-value, next-accumulator]
For example:
(unfold 5 (fn [n]
(when-not (zero? n)
[n (dec n)])))
"
@killme2008
killme2008 / chain.exs
Created November 8, 2015 08:04
Elixir process chain test.
defmodule Chain do
def counter(pid) do
receive do
n ->
send pid, n+1
end
end
def create_processes(n) do
last = Enum.reduce 1..n, self(), fn (_, pid) ->
@killme2008
killme2008 / pipe.exs
Created November 20, 2015 02:09
Clojure thread macro '->>' in elixir
defmodule Pipe do
defmacro a|>b do
pos = tuple_size(b) -1
Macro.pipe(a, b, pos)
end
defmacro __using__(_extras) do
quote do
import Kernel, except: [|>: 2]
import Pipe