emueの日記

学んだことを書いていきます(主にClojure)

lein replで便利な技 (Clojure)

毎回忘れるのでメモ。

ファイルの再読み込み

律儀にrequireですると、

(require '[foo.bar :refer :all] :reload)

長くて面倒だからuseを使うと、

(use 'foo.bar :reload)

複数ファイルを読み込む時は、

(use 'foo.bar 'foo.baz :reload)

みたいにスペースで区切れば良い。
'や[]を忘れやすいから要注意。

また、一気に複数ファイルを読み込んでくれるtools.namespaceというライブラリもあるらしい。

参考

replの名前空間を変える

in-nsを使う。

foo.bar=> (in-ns 'foo.baz)

実はnsでもできる

foo.bar=> (ns foo.baz)

'はいらない。

参考

ネストしたメソッドから外側の変数を参照したいができない(Ruby)

ダメな例

def twice(x)
  def inner(y)
    return x + y
  end
  return inner(x)
end
> twice(2)
NameError: undefined local variable or method `x' for main:Object

Rubyではdefしたらスコープが切り替わるため、defの外側のスコープを参照できない。
参考: Ruby のネストしたメソッドと、変数のスコープ | すぐに忘れる脳みそのためのメモ

解決策

def twice(x)
  inner = lambda {|y|
    return x + y
  }
  return inner.call(x)
end
> twice(2)
=> 4
> twice(3)
=> 6

ブロックをlambdaでオブジェクト化し、それをローカル変数に代入する。callメソッドで呼び出すときの引数がブロック変数に渡される。関数じゃないけど第一級関数みたいでおもしろい。
参考: 楽しいRuby第4版 p417-p420

innerはアローを使って次のようにも書ける

 inner = ->(y) {
    return x + y
  }

こっちは無名関数みたい。
参考: Matzにっき(2010-06-16)

まとめ

ネストしたメソッドはRubyではあまり意味がない。代わりにブロックを使う。

小数の10進数を2進数で表す方法

基本情報技術者試験に向けて勉強していて、小数の10進数を2進数で表す問題があった。整数部分は知っていたけど、小数部分については知らなかったのでメモ。

例)7.75_{(10)}を2進数で表わせ 。

まず整数部分と小数部分に分けて考える。

整数部分の7について

1になるまで2で割ってき余りを記録していく。図のように書くのが簡単。 f:id:syndiotactic:20170801192644j:plain:w300
そして図の矢印のように記録した順と逆に余りをならべて 7_{(10)}=111_{(2)}

小数部分の0.75について

小数部分に2をかける。出てきた数の整数部分を記録し、再び小数部分に2をかける。この操作を出てくる数が1になるまで繰り返す。図のように書くのが簡単。 f:id:syndiotactic:20170801192654j:plain:w300
そして図の矢印のように記録した順に並べて 0.75_{(10)}=0.11_{(2)}

以上より7.75_{(10)}=111.11_{(2)}

今日したこと

Vimの勉強

新たに学んだコマンド

  • インデント >G
    すごく便利そう!
  • 別ファイルを開く :e ファイルのパス
    パスを./とするとカレントディレクトリ内のファイルの一覧が表示される。
  • 次の行に挿入 o
    A<return>と同値
  • 行内で前方検索+カーソル移動 f<文字>
    ;で次へ行く、,で前に戻る、後方検索はF
    後方検索の場合;,の向きが逆になる。(当たり前?)
  • 削除して挿入 s
  • 文書で前方検索+カーソル移動 /<文字>
    nで次へ行く、Nで前に戻る、後方検索は?
  • 置換 :s/対象の文字列/置換後の文字列
    &で次へ行く
  • 文書で置換 :%s/対象の文字列/置換後の文字列
    最後に/gをつければ全部置換される。最後に/cをつければ1つずつ置換される。
    参考 vim 文字列置換 基本的な事 - Qiita  

毎日やること

実践Vimを5TIPSずつする。121TIPSあるから25日後には終わっているはず。

今日したこと

今週のお題「好きなアイス」: パルム

deinのインストー

リポジトリ
GitHub - Shougo/dein.vim: Dark powered Vim/Neovim plugin manager

vimrcの設定を参考にした。自動インストールが便利。
Vim入門(1): Vimのプラグインを管理するdein.vimの使い方 | Simplie Post

VimClojureのインストー

参考にした。
Markdown記法まとめ(見出し、段落、改行、水平線、強調、引用、コード)[1/3] - はしくれエンジニアもどきのメモ

deinを使ってのVimClojureのインストールはvimrcに

call dein#add('vim-scripts/VimClojure')

を追加して再起動。シンタックスがついて見やすくなった。

clojureの勉強

contains?はListに対しては使えない。

(def a-set #{:a :b :c})
(def b-list '(:a :b :c))
(class a-set)  ;=>  clojure.lang.PersistentHashSet
(class b-list)  ;=>  clojure.lang.PersistentList
(contains? a-set :c)  ;=>  true
(contains? b-list :c)  ;=>  IllegalArgumentException contains? not supported on type: clojure.lang.PersistentList  clojure.lang.RT.contains

vimの勉強

新たに学んだコマンド
先頭挿入 : I
やり直し : ctrl + r
入力補完 : ctrl + p