README 通りにすんなり入ったので、特に書くこともないんですけどね。
2011/01/31
node.js を終了

取りあえず Ctrl + c してました。
どうやって終了するんだろうなーと思っていたのがわかったので書いておきます。
process.exit();
gauche だと (exit) だったり、python だと sys.exit() だったり、gs だと quit だったり、忘れるのでやっぱ C-c が手っ取り早いですかね。
2011/01/28
node.js + postgreSQL
CentOS と Cygwin に入れました。
python が入ってないと要求される
- node.jsとnpmのインストール - 自分の感受性くらい
- SummerWind - node.jsで遊ぶ: インストール編
- node.jsってなんだね。 - futa.ro | blog
- Cygwinや仮想化なしでnode.jsをWindowsへインストール - 自分の感受性くらい
- node.jsをWindows/cygwinにインストールして動かした - クライアント・サイド・スクリプティング with Web Standards
node_postgres の方。
(cygwin には入れてない)
ダウンロードして展開して README よろしく
- MySQLもPostgreSQLもちゃんと使える
- PostgreSQLはRyan謹製のNode.js製クライアントあり
ry's node_postgres
node-waf configure buildで入りました。
で、
npm install .すると、node_postgres 同梱の test.js も無事動きました。
record は配列の配列で返ってくるみたいですね。
lisp.js
今日 @kikuchan98 さんに「node.lisp みたいなのがあるらしいよ」と教えてもらったので検索してみた。これかな。
@kikuchan98 さんは既に node.js でいくつかモノを作られていて、一個見せてもらった。
node.js が動いてるサーバーにとある自作機器がつながっていて、Web 経由で node.js とお話して接続された機器経由でまた別のとあるモノを制御するという一品。
すげー。
もう一個はできてからのお楽しみということで教えてもらえなかった。
きっと #9LISP とかで見せてもらえるに違いない。
自分はといえば、写経とかハンズオンとかそんな状態。。
参考
2010/11/08
biwascheme on blogger
<div id="bs-console" style="border-style: dotted;"> </div> <script src="biwascheme.js"> ;; (js-call (js-eval "alert") "Hello, world !! (powerd by biwascheme)") (element-update! ($ "bs-console") "Hello, world !! (by biwascheme)") </script>↓結果↓
(chrome, firefox, operaでは動いてるっぽいですが、IEでは動いてないみたい?)
ビルド
How to build lib/biwascheme.js
You need make and Java installed.
(1) Download and unpack YUI compressor
(2) Create a shell script ‘yuicomp’ like:
#!/bin/sh
java -jar /somewhere/yuicompressor-2.4.2/build/yuicompressor-2.4.2.jar $*
(3) make
参考
- yhara's biwascheme at master - GitHub
- BiwaScheme : Scheme interpreter for browsers
- How to use BiwaScheme « Jakub Jankiewicz (jcubic) Blog
- firegoby » Blog Archive » JavaSCriptを圧縮 – yuicompressor
2010/10/08
JavaScript の継続(continuation)によるループ
Continuation を使って sum を定義してみました。
function callcc (f){ return f(new Continuation()); } function identity (x){ return x; } function sum (n){ var i = 0; var total = 0; var hop = new Continuation(); var next = callcc(identity); if (n < i){ hop(total); } else { total += i; ++i; next(next); } } sum(10); // -> 55
loop 関数にしてみました。loop 関数を使って sum と fact を定義してみました。期待通りに動いているようです。
function loop (func){ var hop = new Continuation(); var next = callcc(identity); func(hop); next(next); } function fact (i) { var acc = 1; return loop (function (hop){ if (i === 0){ hop(acc); } else { acc *= i--; } }); } fact(10); // 3628800 function sum (i) { var acc = 0; return loop (function (hop) { if (i === 0){ hop(acc); } else { acc += i--; } }); } sum(10); // 55
accum を定義。
function accum (i, pred, afunc, ifunc, seed){ var acc = seed; return loop (function (hop){ if (pred(i)) { hop(acc); } else { acc = afunc(i, acc); i = ifunc(i); }}); } function zerop (i){ return i === 0; } function dec (i){ return --i; } function mul (x, y){ return x * y; } function plus (x, y){ return x + y; } function sum (i){ return accum (i, zerop, plus, dec, 0); } function fact (i){ return accum(i, zerop, mul, dec, 1); } sum(10); // -> 55 fact(10); // -> 3628800
while を使えば良い話なんですけどね。
- vallog: Emacs で JavaScript (js2.el, js-comint.el)
- vallog: Re: javascript - にも無限リストを (遅延ストリーム pipe 編)
- vallog: ソースコードハイライト htmlize.el
2010/10/06
Emacs で JavaScript (js2.el, js-comint.el)
掲題の設定をさらしておこうかと。雑な設定ですけども。。実際の画面は上の画像の通りです。
参考にしたのはこちら。
ポイントは js2-mode-hook に以下の一行を加えていることくらいでしょうか。
(local-set-key "\C-c\C-r" 'js-send-region)region を js の repl に送るコマンドです。(require 'js-comint) (setq inferior-js-program-command "java org.mozilla.javascript.tools.shell.Main") (add-hook 'js2-mode-hook '(lambda () (local-set-key "\C-x\C-e" 'js-send-last-sexp) (local-set-key "\C-\M-x" 'js-send-last-sexp-and-go) (local-set-key "\C-cb" 'js-send-buffer) (local-set-key "\C-c\C-b" 'js-send-buffer-and-go) (local-set-key "\C-cl" 'js-load-file-and-go) (local-set-key "\C-c\C-r" 'js-send-region) )) (when (load "js2" t) (setq js2-cleanup-whitespace nil js2-mirror-mode nil js2-bounce-indent-flag nil) (defun indent-and-back-to-indentation () (interactive) (indent-for-tab-command) (let ((point-of-indentation (save-excursion (back-to-indentation) (point)))) (skip-chars-forward "\s " point-of-indentation))) (define-key js2-mode-map "\C-i" 'indent-and-back-to-indentation) ;; (define-key js2-mode-map "\C-m" nil) (add-to-list 'auto-mode-alist '("\\.js$" . js2-mode))) (setq-default c-basic-offset 4) (defun js-other-window () "Run JavaScript on other window" (interactive) (split-window-horizontally 80) (let ((buf-name (buffer-name (current-buffer)))) (js2-mode) (run-js inferior-js-program-command) (switch-to-buffer-other-window (get-buffer-create buf-name)))) ;; (define-key global-map ;; "\C-cj" 'js-other-window)
Re: javascript - にも無限リストを (遅延ストリーム pipe 編)
で、その pipe でエラトステネスの篩をやってみると以下のような感じです。
var primes = sieve(integers(2)); enumerate(primes, 10); // -> [2,3,5,7,11,13,17,19,23,29,31,function () { return filter(pred, tail(pipe));}]
JavaScript による pipe とエラトステネスの篩のソースは以下のもの。JavaScript っぽさとかないかもしれませんし、突っ込みどころも多々あるでしょうが多めに見てください。。
階乗のリストだとこうでしょうか。
function facts (pipe) { var rec = function (p, acc){ var h = head(p); var cur = 0 === h ? 1 : h * acc; return makePipe(cur, function () { return rec(tail(p), cur); }); }; return rec(pipe, 1); } enumerate(facts(integers(0)), 5); // -> [1,1,2,6,24,120,function () { return rec(tail(p), cur); }] enumerate(facts(integers(0)), 10); // [1,1,2,6,24,120,720,5040,40320,362880,3628800,function () { return rec(tail(p), cur); }
ところで
JavaScript の生みの親であるブレンダン・アイクが、実はブラウザで動く Scheme が作れると聞いて!ということでネスケに入ったなんて話もあるらしいですね。
伝統的なマクロじゃないにしろ、それっぽいものがあったら JavaScript ももっと強力だったでしょうに。
そういえば
Rhino だと Scheme 由来の継続(continuation)や let が使えるそうで。Scheme 以外で明示的に継続に触れたことが無いので、試して見ます。
(ruby にも call/cc があるんでしたっけ)
例えば、何の変哲もない、というかただ再帰するだけの deep 関数を例に取ると、
function deep (n){ var ret; if (n === 0){ ret = n; } else { ret = deep(n - 1); } print(n); return ret; } deep(10); /* 0 1 2 3 4 5 6 7 8 9 10 0 */
再帰の基底条件に達した後は、今まで潜った再帰を戻るわけですよね。そのときに n が print されている状態です。
で、継続のお決まりの例である脱出をしてみたいので、以下のように書き換えて見ます。
ポイントは、実際の再帰を内部で定義した rec 関数に任せている点と、deep の先頭で継続オブジェクトを取得している点。
function deep (n){ var cont = new Continuation(); var rec = function (n){ var ret; if (n === 0){ ret = n; cont(ret); } else { ret = rec(n - 1); } print(n); return ret; }; return rec(n); } deep(10); // -> 0print されませんね。結果である 0 だけが表示されています。この結果が意図通りのものです。
基底条件に達した時点で保存しておいた継続に結果を渡して呼び出しているので、潜った再帰はなかったことに。なかったことに、と言うと語弊があるでしょうか。まぁ、気になったら Scheme でもやってみてください。
一応確認するために、rec の下で print すると、ちゃんと再帰していることがわかります。基底条件、つまり最深部まで再帰を潜って cont に渡された値が cont が宣言された以降の処理の結果となるわけです。何を言ってるかわから(ry。
function deep (n){ var cont = new Continuation(); var rec = function (n){ print(n); var ret; if (n === 0){ ret = n; cont(ret); } else { ret = rec(n - 1); } print(n); return ret; }; return rec(n); } deep(10); /* 10 9 8 7 6 5 4 3 2 1 0 0 */
追記
あ、今回使った JavaScript の処理系はRhino 1.7 release 2 2009 03 22
です。
Emacs + Rhino + js2.el + js-comint.el 最強です。
追記2
いつも教えて頂いてます!ありがとうございます!@valvallow ジェネレータが実装されてない処理系も多いみたいですね。 とりあえず、無限リストとかの考え方は無視して典型的な JavaScript らしい書き方で書いてみました。 http://gist.github.com/613523
2010/02/18
2010/02/13
JavaScript と Scheme (とLisp)
整理されてません。メモがてら。
- WebScheme - Scheme interpreter for web applications
- Greenbear Laboratory - BiwaScheme
- Scheme on JavaScript 作りました - yukobaの日記
- わーい \(^o^)/ Scheme もどきを JS で書いたよー! - IT戦記
- Scheme in Javascript, written by Luke Gorrie
- The Little JavaScripter
- JavaScriptでつくるSchemeインタプリタの基礎の基礎(1/3):CodeZine
- Bluish Coder: Scheme Implementation in Javascript
- js-scheme - Project Hosting on Google Code
- JavaScript to Scheme Translator | Get JavaScript to Scheme Translator at SourceForge.net
- js-scheme - a Scheme interpreter written in JavaScript
- Scheme in Javascript, Learning in Action
- scm2js 〜Scheme to JavaScript Translator〜 - `(Hello ,world) - cadr group
- Compiling Scheme to JavaScript
- (PDF)Javascript to Scheme Compilation
- Joe Ganley's Lisp in JavaScript
- Javascript Lisp Interpreter
- Jisp - Lisp implementation in JavaScript
- Parenscript
- LispScript - Lisp to Javascript compiler
- Lisp in JavaScript
- Lisp Interpreter in JavaScript
- Lisp in Javascript :: Steve Lacey :: Random Thoughts
- Pico Lisp to JSON with JavaScript | ProDevTips - dev notes and tutorials
- javascript-lisp-interpreter - Project Hosting on Google Code
- manuel's cyberlisp at master - GitHub
- MOONGIFT: » Emacsで動作するJavaScriptインタプリタ「Ejacs」:オープンソースを毎日紹介
- samsonjs's elisp.js at master - GitHub
- Carpathian Cloud: Lisp Interpreter in JavaScript
2009/10/06
面白そうなJavaScriptを見つけた
CodeZineの記事を読んでたら何やら面白そうなものを発見。早速ダウンロードして読んでみた。JSだけど.NETらしいコードや名前付けで読みやすかった。(別に全て目を通したわけではないけど)
目に付いたのはStringBuilderクラス(MicrosoftAjax.debug.js)。C#でもそうだけどJSでも+演算子での文字列連結遅いもんねー。ところでJSって名前に$使えるんだね。知らなかった。
ついでにJSで気になってたところや曖昧だったところを少し試し書きしてみた。
処理系はEjacs。
乱数ってどうやるんだっけ
| // 乱数 0 ~ 10000 |
$マーク使えるんだ
| // $ aaa$bbb();
// $ $(); // called '$' |
argumentsってローカル関数の場合どうなるんだろ
| // arguments
print(pargs(arguments, 'nest level 0'));
var fun = function ()
print(pargs(fun(2, 4, 6), 'nest level 1'));
test(1,3,5,7,9); |
C#のnull結合演算子(??)みたいなのってどうだったっけ
| // null coalescing operator
null || 0;
1 || null;
null || undefined || 9;
function coalesce () /*
function arrayCoalesce(ary) /* |
厳密な比較じゃないとハマるよねーとか
| 1 == 1; |
何も関係ないけどiota
| // iota for (var i = 0, j = min || 0; |
どこで読んだか忘れたけど「星の数ほどあるJavaScriptの本の中で"唯一"の良書」と聞いて購入。基本的な言語仕様の説明である10章までを読んで満足して積んでる。
| JavaScript 第5版 posted with amazlet at 09.10.06 David Flanagan オライリー・ジャパン 売り上げランキング: 5119 おすすめ度の平均: |
2009/09/08
Ejacs(Ejax)とjs2-modeを連携させる
初めてelisp書いてみました。力技丸出しです。
C-c jでJavaScriptを書く状態を作る
バッファを上下に2分割して上はjs2-mode下はjs-console(Ejacs)を実行。
C-c j
リージョンをjs-consoleに渡して評価してもらう
JavaScriptのコードを入力
リージョンを選択し、C-c C-r
以上(w
ほんとはScheme-modeくらい評価方法が選択できたらいいんだけど取り合えずこれでいいや。
C-c jでjs2-modeとjs-consoleを起動
| (defun js-other-window ()
(define-key global-map |
リージョンを評価
| (defun js-execute-region () |
| (add-hook 'js2-mode-hook '(lambda () |
2009/08/31
SchemeとJsでしつこくYCombinator
Schemeの方はTechEd2009中に、眠くなったときや話がわからなくなった時に書いた(w
download - ycombinator.scm.txt
download - ycombinator.js.txt
2009/08/24
Jsのfunctionで暇つぶし(ejax)
またもや眠気覚ましに少し遊んでみた。
意味のあるコードではない。
いつまでたってもScheme初級者から抜け出せない私はJavaScriptよくで遊ぶ。
functionはもうちょっと短くfunくらいにならないかな。まぁ改めてみるとlambdaもなかなか冗長だな。^でいんじゃね。
ところで、ejaxとjs2-modeはやはりかなり良い。この二つが完全に連携してくれると助かるけどなー。
(ejaxはemacs lispで書かれたECMA標準に準拠したJavaScriptインタプリタ)
download - 10times.recursive.helloworld.js
普通の再帰
| (function f (n){ |
マッチポンプ的な再帰に変換。自分に自分を呼び出す自分を渡して・・・
| (function (f){ |
リテラルを一つ外にくくりだしてみる。無名関数はローカル変数の変わりになるというあれ。Schemeのletはlambdaでくくり出すのと同じだよーっていうあれ。
| (function (x){ |
出力を行う部分を関数として外に出してみる。この辺から後はとくに面白みがない。
| (function (y, action){ |
反復条件も関数として外に出してみる。pはpredicateのpということで。
| (function (y, a, p){ |
ここで再帰のたびにデクリメントされる部分を関数として外に出したらfor文ぽいよねーなどと思いながら外にだしてみる。iはincrementのiかな。
| (function (y, a, p, i){ |
2009/08/11
[js]map,iota,times
map, iotaは何度か同じようなの書いてる。
timesはNumberクラスいじったらできるんじゃね?って思ったらできた。
| // Arrayクラスのprototypeにmapを追加 for (var i = 0; i < this.length; i++) |
| // Arrayクラスにiotaクラスメソッドを追加(したつもり) var ret = []; for (var i = 0, j = init; ret.length < cnt; i++, j = j + inc) return ret;
/*
|
| // 数値(Numberクラス?)のprototypeにtimesメソッドを追加 /*
js> (10).times(function (i) { print ('hello'); }) |
2009/08/10
[JavaScript]srfiのiota
今日は少し寝不足で仕事中に激しい睡魔に襲われたので気分転換に書いた。
Arrayに非破壊的なmap追加してiotaっぽいの書いてfizzbuzzってみた。
| Array.prototype.map = function (f) function iota(cnt, init, inc) for (var i = 0, j = init; j < cnt; i++, (j = j + inc)) iota(100, 1).map(function (n){ if (modulo(3) == 0) return ret; |
[KPF]第4回勉強会をやってきた
取り急ぎ。
「SchemeとJavaScriptで数字遊び」と題してライブコーディングをやるつもりでしたが、途中でテンパってしまって自ら強制終了というなんともヒドイ醜態をさらしてきましたorz
ライブコーディングも中途半端だったので取り急ぎコードをさらします。
- 参考はこちら
| var inc = function (n) var dec = function (n) var add = function (n, m) var sub = function (n, m) var bgr = function (n, m) var sml = function (n, m) var mul = function (n, m) var div = function (n, m) function fact (n) function tailCallFact(n) function tailCallFact(n) var i = 10; (function () { var i = 10; do{ print("hello"); i--;}while(0 < i);})(); Array.prototype.each = function (f) (function (f){ (function (f){ (function (f){ function map (f, array) map(function (v) Array.prototype.map = function (f) [1,2,3,4,5].map(function(v){print(v);return v;}); |
| (define inc (define dec (define add (define sub (define bgr (define sml (define mul (define div (define fact (define tail-call-fact (do ((i 0 (+ i 1))) (let loop ((s 0)) (for-each ((lambda (f) ((lambda (f) (define fact (define tail-call-fact (define e '(define (fact n) (car e) (use srfi-1) |
2009/05/11
[JavaScript]JavaScriptの文字列を複数行で定義する方法
確かにその通りになったが、果たして必見と言うほどのことなのか良くわからない。逆にわかりにくく書きにくいのでは・・・。
文字列を'\r\n'とか書き散らして+演算子で結合するのがウザったらしいのならC#のStringBuilderクラスもどきみたいなの作ればいんじゃね。OOPLな言語なんだし(プロトタイプベースOOPL)。
2009/05/08
[JavaScript]高階JavaScript(Functional JavaScript)
JavaScriptで高階関数を使うためのライブラリ(?)らしいです。(でもJavaScriptってデフォルトで簡単に高階プログラミングできるよね?それはいいっこなし?w)
- map
- reduce
- select
- or
- some
- every
- not
- fold
- equal
- until
- zip
- right
- left
- curry
- lambda
などなどがあるようです。
mapを見るとわかりやすいですが、文字列で処理を渡したりしているみたいですね。
| map('x*x', [1,2,3,4]) |
@hamatzさんに紹介していただきました!ありがとうございました!
| @valvallow ちなみに、JavaScript で高階関数を使いたいアナタの為のライブラリもあるみたいです。 JavaScript スゲー!! http://osteele.com/sources/javascript/functional/ |