2016-07-01から1ヶ月間の記事一覧

Vim script の lambda にローカル変数をキャプチャする機能が実装された

Vim

Vim の patch 7.4.2119 で Vim script の lambda に『ローカル変数をキャプチャする』機能が実装されたました。 github.com function! s:main() let value = 2 " lambda 内から外部のローカル変数が参照できる let PlusValue = { x -> x + value } echo Plus…

Vim script の lambda で可変長引数を受け取る

Vim

Vim script の lambda で可変長引数を受け取る場合は特に引数を定義する必要はなく、a: を参照すれば通常の関数と同様に取得できます。 " 通常の関数引数の a: と同じように使える " a:000 に渡された引数が保存されている let Even = { -> filter(copy(a:00…

Vim script の lambda は過剰に引数を渡してもエラーにならない

Vim

Vim script の lambda では定義した引数以上の引数を渡してもエラーになりません。 " 過剰に引数を渡してもエラーにならない echo { a, b -> a + b }(1, 2, 3, 4) " => 3 これは次のような場合に有効です。 let Odd = { value -> value % 2 != 0 } " filter(…

Ruby で画像を半分に分割

横に長い画像を半分に分割したかったので Ruby の mini_magick を使って書いてみた。 require "mini_magick" def cut_image src left = MiniMagick::Image.open src return left, nil if left[:width] < left[:height] width = left[:width] / 2 right = Min…

Vim script で stacktrace 書いてみた

Vim

[関連] github.com これを Vim script だけでどこまで出来るかやってみた [コード] let s:V = vital#of("vital") let s:S = s:V.import("Palette.Scriptnames") function! s:call_stack() try throw 'abc' catch /^abc$/ return split(matchstr(v:throwpoint…

Vim script の lambda で Yコンビネータ

Vim

Vim script の lambda では変数がキャプチャ出来ないので無理やりですが。 let Y = { f -> function({ f -> call(f, [f] + a:000) }, [f]) } let Fact = Y({ f, x -> x == 1 ? 1 : f(f, x-1) * x }) echo Fact(5) " => 120 [使用した vim のバージョン] 7.4.…

Vim script の lambda 内で定義した変数のスコープ

Vim

Vim script の lmabda 内で変数を定義した場合、スコープがどうなるのかを調べてみました。 また、変数の定義には execute() を利用します。 [ローカル変数] function! s:main() let F = { a -> [execute("let l:val = a"), l:val][-1] } " or let F = { a -…

Vim script の lambda でクロージャ

Vim

Vim script の lambda ではローカル変数を変数をキャプチャできないので、function() で変数を束縛することで実装してみました。 [実装イメージ] function! Counter() let value = 0 function! Closure(local) let a:local.value += 1 return a:local.value …

Vim script の execute() 時に実行結果を出力する

Vim

さて、Vim script の execute({コマンド}) ですが、引数に渡した『コマンド』の出力結果をキャプチャして返します。 " echo の出力結果を返す。 echo execute("echo 42") この時に当然ですが、"echo 42" のコマンドを実行しただけでは何も出力されません。 "…

Vim script の lambda でローカル変数をキャプチャする

Vim

どうせなら l: を使ってやるかーという感じでやってみました。 function! s:main() let a = 3 let F = function({ local, b -> [extend(l:, local), a + b][-1] }, [l:]) echo F(2) " => 5 let a = -2 echo F(5) " => 3 endfunction call s:main() lambda 内…

Vim script の lambda 内で複数の式を実行する

Vim

Vim script の lambda 内で複数の式を評価したい場合、リストを使うと比較的簡単に実現する事が出来ます。 let F = { a, b -> [execute("echo a", ""), execute("echo b", ""), a + b][-1] } echo F(3, 5) " => 3 " 5 " 8 しかし、もうちょっとスマートな回…

Vim script の lambda で外部変数をキャプチャしたかった

Vim

Vim script の lambda で外部の変数を参照したかったのですが、どうやらこれはエラーになるみたいです。 function! s:main() let a = 3 let F = { b -> a + b } echo F(2) " => E121: 未定義の変数です: a endfunction call s:main() まあ :function で定義…

Vim script の lambda は :call で呼び出すことが出来ない

Vim

Vim script の lambda をいろいろと試していたんですが、どうやら :call で呼び出せない模様。 call { x -> execute("echo x", "") }(10) " E121: 未定義の変数です: x " E15: 無効な式です: x -> execute("echo x", "") " E475: 無効な引数です: { x -> exe…

Vim script の lambda 内で Exコマンドを実行する

Vim

さて、Vim script に lambda が実行されたんですが、lambda 内では式しか定義することが出来ないので、Exコマンドを直接呼び出すことは出来ません。 " Error let F = { x -> echo x } [execute() を利用する] こういう場合は execute() を経由して Ex コマン…

Vim 7.4.2044 でついに Vim script に lambda が実装された!!!

Vim

前々から ML では話題になってたんですが、Vim 7.4.2044 ついに Vim script に lambda が実装されました!! 実装されたのは2〜3日前なんですが体調が死んでたのでブログかけなかった Vim script の lambda は { 引数 -> 式 } という風に定義します。 詳しく…

precious.vim で範囲外のハイライトが無効になるようになった

Vim

precious.vim で範囲外のハイライトが無効になるような pull request を頂きました。 github.com べんり。 もし、この機能を無効にしたいのであれば以下のように設定してください。 let g:precious_enable_switchers = { \ "*" : { \ "outer_region" : 0 \ }…

C++ でフィボナッチ数列をメモ化してみた

C++

そういえば書いたことがなかったかも?と思ったので C++ でフィボナッチ数列をメモ化してみました。 ポイントはメモ化したデータをグローバル領域に置きたくなかったので関数オブジェクト化してメモ化したデータはメンバ変数で保持するようにしました。 [コ…

Vim の +job を使ってみる

Vim

前回からの続きです。 secret-garden.hatenablog.com 前回書き忘れましたが今回使用する Vim は Vim 7.4-2028 になります。 +channel +timer +job が追加された流れについて前回を参照してください。 ちなみにわたしも全部を把握しているわけではないのでと…

ruboty-vimhelp つくった

ruboty から vim を help できる ruboty-vimhelp をつくりました。 github.com ruboty :help {keyword} で Vim の help が出力されます。

パソコンぶっ壊れた

と、思って2時間ぐらいいじって治らなくて、1時間ぐらい放置してたから勝手に直った… 何だったんだ…

Vim の +timer を使ってみる

Vim

そろそろいいかなと思ってまとめてみた。 [+chancel と +job と +timer] さて、今まで Vim で外部コマンドの非同期処理と言えば、vimproc.vim を使用してコマンドを実行し、CursorHold でプロセスを監視するのが一般的でした。 しかし、今年の頭に Vim 本体…

Vim で Ex コマンドの出力結果を取得する関数が追加された

Vim

Vim 7.4.2008 で Ex コマンドの出力結果を取得する execute({command} [, {silent}]) 関数が追加されました。 echo execute("version") " 出力結果 VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jul 10 2016 11:36:59) 適用済パッチ: 1-2015 Compiled by w…

Vim で :message の内容を削除するする

Vim

Vim 7.4.1735 から :message の内容を削除する機能が追加されました。 メッセージの内容を削除したい場合、 :message clear とすることですべてのメッセージを削除する事が出来ます。

ruboty-tanzaku つくった

つくりました。 github.com 使い方 > ruboty tanzaku ねがいごと ┏┷☆ ┃ね┃ ┃が┃ ┃い┃ ┃ご┃ ┃と┃ ★━┛

Riot.js で短冊ジェネレータつくった

今日は七夕!ってことで Riot.js の練習も兼ねて簡単な短冊ジェネレータをつくってみました。 ソースコードはここら辺。 ちなみに元サイトはここを参照しました。 Riot.js 自体そんなに難しくないのでたたき台は 2時間もかからないぐらいでサクッとつくる事…

C++14 でYコンビネータ

C++

#include <iostream> int main(){ auto Y = [](auto f){ return [=](auto... args){ return f(f, args...); }; }; auto f = Y([](auto f, int n)->int{ return n == 1 ? 1 : n + f(f, n-1); }); std::cout << f(10) << std::endl; return 0; } /* output: 55 */ 多相ラ</iostream>…

heroku で .env を適用させる

さて、heroku でサーバ側の環境変数を適用させる場合、 $ heroku config:set RACK_ENV=production と、言う風に config:set で設定する事が出来ます。 しかし、多くの環境変数を設定する場合、毎回手打ちするのはめんどくさいですよね。 そういう場合、.env …

Vim 7.4.1989 から filter() と map() で関数参照が受け取れるようになった

Vim

Vim 7.4.1989 から filter() と map() で関数参照が受け取れるようになりました。 github.com これにより map(list, Funcref) という風に Funcref を呼び出すことが出来ます。 この時に v:key と v:val は Funcref(v:key, v:val) というように引数に渡されま…

Ruboty で RUBOTY_NAME を無視するプラグインをつくった

最近 Ruby で拡張することができる Bot フレームワークの Ruboty にはまっています。 Ruboty については以下に詳しく書かれています Ruboty って何?どうやって動かすの? Hubot と何が違うの?どっちを使えばいいの? #ruboty #chatops - Qiita [RUBOTY_NAM…

Ruby の正規表現で名前付きキャプチャするときの注意

Ruby の正規表現で名前付きキャプチャを行う時、Regexp#match ではなくて Regexp#=~ を使用することで『ローカル変数』として定義することも出来ます。 /(?<hour>\d{2}):(?<minus>\d{2}):(?<second>\d{2})/ =~ "11:22:33" p hour # => "11" p minus # => "22" p second # => "33" </second></minus></hour>…