先日、「vimのgaucheの出力をウィンドウ分割して表示」というエントリーで、vimでgaucheでの開発をする時の事とか書いたけど、ちょっとした事に気が付いた。
先日の形だとインタラクティブモード(gosh -i)の設定が意味をなしてないので、毎回式が評価されるように(表現あってる?)してみた。
いや、単純にgoshを起動する時にファイル名を渡すのではなくてパイプ(リダイレクション)で渡すようにしただけなんすけどね。修正したのを一応再掲。
今度はヴィジュアルモードで選択した部分の評価を表示させたいなぁ。チト調べてみよう。
fun! GoshRunAll()
" とりあえず保存をする。あと現在のファイル名を保存しておく
w%
let fname = expand("%")
" 5行のバッファを「gosh_out」という名前でウィンドウの下に作る
below 5new gosh_out
" 前の出力があるかも知れんので削除する
execute ":0,%delete"
" goshを起動する。pathは設定してない。(!!!ここを直した)
execute "r !gosh -i <".fname
" 出力結果を保存しておく
w /path/to/gosh_out
endfun
nmap <c-s> :call GoshRunAll()<cr>
地味ーにschemeやってます。全然身になってないですが><。こういうのは諦め悪くやるのが良いかなっと。
最近「プログラミングGauche」も買い風呂場とかでチマチマ読んでます。ところで、やっぱりエディタはEmacsとの相性が良いらしくて、読んでるだけで便利そうで「schemeを効率よく勉強するのはEmacsやるのがいいのかなぁ?」とか思って、何回か試してみるんですがvimに慣れているものでどうもダメだ。
しかも、Emacsに慣れてしまうとvimを使った時にEmacsのキーを連打してしまう。んじゃ、vimでどこまでイケるかやってみようかという経過をメモ代わりにエントリー。
まだ、schemeを理解してないってのもあるんだけど、カラースキームとかにはあんまり不満がないのでデフォルトで入ってるschemeのカラースキームでOK(オイ)。他に以下のような物があるらしいです。慣れてきたらインストールしてみようと思う。
んで、結局何をしたいかと言うと、goshの結果を新しいウィンドウ(バッファ)に出力を表示したいって事です。以下のような、MzSchemeのインターフェースを追加する方法を書いている方がいたのだけど、やりたいのはgaucheの結果を取りたいのだ。(あと、vimのコンパイルとか面倒だった。)
多分、普通は以下リンクのように「:!gosh %」とか外部コマンド扱いで現在編集しているファイルをgoshに送るというのが普通なのかも知れないけど、Emacsみたいにショートカット一発でバッファに出したいなぁと。出力が長いと見れなくなるし、あとカーソル移動とかもできないので結果のコピペとかも面倒。
例えば、「プログラミングGauche」の中にあるデバッグコード出力する例にすると。
(define (fact n)
(if (= n 0)
1
(* n #?=(fact (-n 1)))))↑こんなのを普通に「:!gosh %」するとこんな感じになる↓。あ、ちなみに「%」は現在編集しているファイルのパスを入れるって事らしいです。
実行すると…。
なので、vimスクリプトでどうにかなるかなっと、書いた事もないvimスクリプトをいじってみた。
fun! GoshRunAll()
" とりあえず保存をする。あと現在のファイル名を保存しておく
w%
let fname = expand("%")
" 5行のバッファを「gosh_out」という名前でウィンドウの下に作る
below 5new gosh_out
" 前の出力があるかも知れんので削除する
execute ":0,%delete"
" goshを起動する。pathは設定してない。
execute "r !gosh -i ".fname
" 出力結果を保存しておく
w /path/to/gosh_out
endfun
nmap <c-s> :call GoshRunAll()<cr>これをschemeファイルを編集する時に読み込まれるvimスクリプトに入れておく、syntaxとかftpluginあたりの奴に入れたらいいと思う。今回はCtrl-Sキーでgoshに送り込むように設定しておいた。んで、実際Ctrl-Sで起動してみる。
無事出来るようになった。便利!
多分、もっとスマートな方法があるんだろうけど自分的にはこれで十分満足。ただ気になるのはEmacsと違って、スクラッチバッファ的な物がないので(俺が知らないだけかもだけど)、ファイルのような処理にしなければならないのがちとイマイチ。
後は、ヴィジュアルモードで選択した場所だけをgoshに送って評価とかしたいな・・・vimscriptやろうかなぁ・・・。うーん。誰かプラグインとか配布してないのかしらん。
え~っとschemeで四則演算ですが、いきなりちょいビビッてます。
これはschemeがどうこうと言うよりも自分の数学(算数?w)とかの素養が余りない事が原因かと思われまする。これから数学とか再勉強してみようかなー。ちょっと遅いかな。
さて、四則演算(+-*/)って奴です。単純に(算術記号 数字 数字)ってのが基本形。S式って呼ばれてるみたい。
違う書き方すれば(命令 引数 引数 …)って事かな。多分演算子も関数って事なんだろう(多分)。色々インタラクティブシェルに入力して試してみた流れをメモ。
gosh> (+ 1 2) 3
ハイ、1+2=3 って答えね。フム。
gosh> (+ 1 2 5) 8
計算する要素というか引数は複数入れられるっと。色々やってみんべ。
gosh> (* 2 3) 6 gosh> (/ 6 2) 3 gosh> (* 3 3 5 6) 270 gosh> (/ 1248 24) 52
少数ってどうなるんだろうか。
gosh> (+ 1.1 3.3) 4.4 gosh> (+ 1.2 3) 4.2 gosh>(* 24.2 3) 72.6
少数もそのまま書けるね。更に少数表記(.どっと)と整数表記の混在でもOKっと。
gosh> (/ 14 3) 14/3 gosh> (/ 2 4 3) 1/6
なるほど~分数表記なのね。素敵。ってことは?
gosh> (/ 1/2 1/3) 3/2
おお!分数の表記を引数にも取れるのか。
gosh> (/ 3.3 333) 0.00990990990990991
むむ。少数が含まれているのは分数だったとしても少数表記になるのね。(当たり前かw)
gosh> (+ 1) 1 gosh> (- 1) -1 gosh> (/ 1) 1 gosh> (* 1) 1 gosh> (/ 4) 1/4 gosh> (/ 2.3) 0.4347826086956522
引数が一個の場合は「1」との演算になるみたい。上記のように少数で行うと少数表記になるようだ。
gosh> (+) 0 gosh> (-) Error: comile Error: procedure - requires at least one argument: (-) gosh> (/) Error: comile Error: procedure - requires at least one argument: (/) gosh> (*)
ん?減算(-)と除算(/)だけエラーになる。引数が無しでも実行できるのは個人的には衝撃的だな~。という事は?
gosh> (- 0 0) 0 gosh> (- 0) 0
これはOKだ。んじゃ除算は?
gosh> (/ 0 0) #<nan> gosh> (/ 0) #i1/0
おおお?なんぞこれ。と言うわけでちょっと調べてみた。
#i1/0 は正の無限大です。”#i” は非正確数であることを明示するプリフィクスです (cf. Scheme:非正確な整数)。このような特別な数は他に負の無限大 (#i-1/0) と NaN (#i0/0) があります。 (なお、ここでの「無限大」は数学的な無限大の概念ではなくて、「計算機上で表現しきれないほど大きな数」という意味なので、常に非正確数です。正確な無限大はGaucheにはありません。)
おおおう。無限大かいな!その後ちょいと調べてみた結果処理系によって表示される表記が違うみたいだ。まぁ。NaNだの#i1/0 って表示されてもビビらないようにだけ心に留めよう。
いやー。どうしましょう。^^;
これ以上難しい数学になったら着いていけるか?心配。w