書き直しました。
環境構築2016
homebrew
公式サイトにある通り。 /usr/localのアクセス権限を書き換えないといけなかった記憶があるが、以前インストールしていたからか特に問題なくインストールできた。
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
一応brew doctor
は走らせておいた方がいい。
emacs
Mac OS X El Capitanにはemacsがデフォルトでインストールされている。 しかし、バージョンが古いので、Homebrewで新たにインストールする。
$ brew install emacs
あとはgit clone
なりなんなりでGithub上の.emacs.dを引っ張ってくる。
Stack
$ brew install haskell-stack
$ stack setup
roswell
Homebrewでインストール。
$ brew tap roswell/roswell
$ brew install roswell
$ ros setup
あとはWikiを読んでいろいろ設定する。slime周りとか。
tmux
Homebrewでインストール。
$ brew install tmux
Go
$ brew install go
後はよしなにGOPATHを設定する。
ghq
なんかすごいやつ。まだ使っていないので良くわからない。
$ go get github.com/motemen/ghq
Open usp Tukubai
シェル芸のユーティリティ集。
$ghq get https://github.com/usp-engineers-community/Open-usp-Tukubai $ cd ~/.ghq/github.com/usp-engineers-communitu/Open-usp-Tukubai $ make install
その他
$ brew install tree $ brew install reattach-to-user-namespace
iPhoneのバックアップ時に「"Macintosh HD"ディスクへのコピーに失敗しました。不明なエラーが発生しました(-54)。」
C言語でmapとreduce
#include <stdio.h> #define ASIZE(ARRAY) (sizeof(ARRAY) / sizeof(ARRAY[0])) #define REDUCE(ARRAY, FUNC, RESULT) for (int i = 0; i < ASIZE(ARRAY); i++) RESULT = FUNC(RESULT, ARRAY[i]) #define MAP(ARRAY, FUNC, RESULT) for (int i = 0; i < ASIZE(ARRAY) || i < ASIZE(RESULT); i++) RESULT[i] = FUNC(ARRAY[i]) #define N 100 double height[N] = { 148.7, 149.5, 133.7, 157.9, 154.2, 147.8, 154.6, 159.1, 148.2, 153.1, 138.2, 138.7, 143.5, 153.2, 150.2, 157.3, 145.1, 157.2, 152.3, 148.3, 152.0, 146.0, 151.5, 139.4, 158.8, 147.6, 144.0, 145.8, 155.4, 155.5, 153.6, 138.5, 147.1, 149.6, 160.9, 148.9, 157.5, 155.1, 138.9, 153.0, 153.9, 150.9, 144.4, 160.3, 153.4, 163.0, 150.9, 153.3, 146.6, 153.3, 152.3, 153.3, 142.8, 149.0, 149.4, 156.5, 141.7, 146.2, 151.0, 156.5, 150.8, 141.0, 149.0, 163.2, 144.1, 147.1, 167.9, 155.3, 142.9, 148.7, 164.8, 154.1, 150.4, 154.2, 161.4, 155.0, 146.8, 154.2, 152.7, 149.7, 151.5, 154.5, 156.8, 150.3, 143.2, 149.5, 145.6, 140.4, 136.5, 146.9, 158.9, 144.4, 148.1, 155.5, 152.4, 153.3, 142.3, 155.3, 153.1, 152.3, }; double add(double x, double y) { return x + y; } double add3(double x) { return x + 3; } int main(void) { double sum = 0; MAP(height, add3, height); REDUCE(height, add, sum); printf("sum = %f, avg = %f\n", sum, sum / N); }
ASIZE
マクロは配列変数名を受け取り、その要素数を返す。
REDUCE
マクロは畳み込み、MAP
マクロは写像を取る。どちらも、配列変数名、関数名、結果変数名を取る。
サンプルコードは http://www.geocities.jp/m_hiroi/linux/clang03.html からお借りしました。
Ros scriptでライフゲーム
Ros scriptでライフゲーム書いた。
lifegame.ros
に実行可能権限を与えたあと、./lifegame.ros
で起動する。
Enterキーを押すと一世代進む。 正整数を入力すると、その分がアニメーション付きで進む。
iotaからunfoldをつくる Common Lisp編
まず、iotaを定義する。 簡潔にするため、オプション引数は使わない。
(defun iota (limit seed step) (if (> seed limit) nil (cons seed (iota limit (+ seed step) step))))
(> seed limit)
を一般化して、終了条件を指定できるよう変更する。
(defun func1 (pred seed step) (if (funcall pred seed) nil (cons seed (func1 pred (+ seed step) step))))
(+ seed step)
を一般化して、seedの変化を指定できるよう変更する。
(defun func2 (pred next-gen seed) (if (funcall pred seed) nil (cons seed (func2 pred next-gen (funcall next-gen seed)))))
最後に、mapcar関数と合成する。
(defun func3 (pred fn next-gen seed) (if (funcall pred seed) nil (cons (funcall fn seed) (func3 pred fn next-gen (funcall next-gen seed)))))
もっと単純に、こうしてもいい。
(defun func3 (pred fn next-gen seed) (mapcar fn (func2 pred next-gen seed)))
これでunfold関数の完成。
(defun unfold (p f g n) (if (funcall p n) nil (cons (funcall f n) (unfold p f g (funcall g n)))))