ラベル JavaScript の投稿を表示しています。 すべての投稿を表示
ラベル JavaScript の投稿を表示しています。 すべての投稿を表示

2011/01/31

node.js で google closure library (node-goog)

こちらを読んでいて、node.js で closure 動かないのかなーと思ったら、それっぽいのがあったので入れてみました。

README 通りにすんなり入ったので、特に書くこともないんですけどね。

JavaScript 第5版

node.js を終了



取りあえず Ctrl + c してました。
どうやって終了するんだろうなーと思っていたのがわかったので書いておきます。
process.exit();

gauche だと (exit) だったり、python だと sys.exit() だったり、gs だと quit だったり、忘れるのでやっぱ C-c が手っ取り早いですかね。






2011/01/28

node.js + postgreSQL

node.js 自体のインストールは特に問題なく。
CentOS と Cygwin に入れました。

python が入ってないと要求される

node_postgres の方。
(cygwin には入れてない)
  • MySQLもPostgreSQLもちゃんと使える
ダウンロードして展開して README よろしく
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 とかで見せてもらえるに違いない。

自分はといえば、写経とかハンズオンとかそんな状態。。

参考


JavaScript Patterns

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

参考



JavaScript 第5版

2010/10/08

JavaScript の継続(continuation)によるループ

ちょっと試してみました。JavaScript の処理系は Rhino(Rhino 1.7 release 2 2009 03 22) です。

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 を使えば良い話なんですけどね。

JavaScript 第5版

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)


Emacsテクニックバイブル ~作業効率をカイゼンする200の技~

Re: javascript - にも無限リストを (遅延ストリーム pipe 編)

PAIP(実用 Common Lisp (IT Architects’Archive CLASSIC MODER))に載ってる pipe は JavaScript でもいけそうだなぁと思って書いてみました。わりと強引に書きました。JavaScript には Lisp/Scheme のマクロのように引数の評価を遅らせるような機能(?)がないので、しかたなく呼び出し側で無名関数で包みました。よくないスタイルですが、取りあえず動くので良いんじゃないでしょうか。他に何か良い方法があれば、教えていただけると助かります。

で、その 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);
// -> 0
print されませんね。結果である 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


実用 Common Lisp (IT Architects’Archive CLASSIC MODER)

2010/02/18

test js

JavaScript 第5版
pre
pre class js







test post from wlw (js)

JavaScript 第5版

alert('Hello, JavaScript');




Test Test

test (js)

JavaScript 第5版
alert('Hello, JavaScript');



Test


Test

2010/02/13

JavaScript と Scheme (とLisp)

「Lispってどんな言語なの?」「世界でもっとも実装される言語。」

整理されてません。メモがてら。



The Little Schemer, 4th EditionJavaScript 第5版計算機プログラムの構造と解釈

2009/10/06

面白そうなJavaScriptを見つけた

WS000021

AJAX Client Library for ADO.NET Data Services

CodeZineの記事を読んでたら何やら面白そうなものを発見。早速ダウンロードして読んでみた。JSだけど.NETらしいコードや名前付けで読みやすかった。(別に全て目を通したわけではないけど)

 

目に付いたのはStringBuilderクラス(MicrosoftAjax.debug.js)。C#でもそうだけどJSでも+演算子での文字列連結遅いもんねー。ところでJSって名前に$使えるんだね。知らなかった。

 

ついでにJSで気になってたところや曖昧だったところを少し試し書きしてみた。

処理系はEjacs

 

 

乱数ってどうやるんだっけ

// 乱数 0 ~ 10000
parseInt(Math.random()*10000);
// 8503

 

$マーク使えるんだ

// $
function aaa$bbb ()
{
  return "called 'aaa$bbb'";
}

aaa$bbb();
// called 'aaa$bbb'

 

// $
function $ ()
{
  print("called '$'");
};


$();

// called '$'

 

argumentsってローカル関数の場合どうなるんだろ

// arguments
function test ()
{
  var pargs = function (args, msg)
  {
    var ret = [];
    ret[args.length] = msg;
    for (var i = 0; i < args.length; i++)
    {
      ret[i] = args[i];
    }
    return ret;
  };

 

  print(pargs(arguments, 'nest level 0'));

 

  var fun = function ()
  {
    return arguments;
  };

 

  print(pargs(fun(2, 4, 6), 'nest level 1'));
  return 'end test';
};

 

test(1,3,5,7,9);
/*
1,3,5,7,9,nest level 0
2,4,6,nest level 1
end test
*/

 

C#のnull結合演算子(??)みたいなのってどうだったっけ

// null coalescing operator
null | 1;
// error

 

null || 0;
// 0

 

1 || null;
// 1

 

null || undefined || 9;
// 9

 

function coalesce ()
{
  var arg = arguments;
  for (var i = 0; i < arg.length; i++)
  {
    if (arg[i])
    {
      return arg[i];
    }
  }
};

/*
coalesce(1,2,3,4)
1
coalesce(null, 1, 2, 3)
1
coalesce(null, undefined, 1, 2, 3)
1
*/

 

function arrayCoalesce(ary)
{
  return ary || [];
};

/*
arrayCoalesce(null)
1,2,3
arrayCoalesce(undefined)
1,2,3
arrayCoalesce([])
arrayCoalesce([1])
1
*/

 

厳密な比較じゃないとハマるよねーとか

1 == 1;
// true
1 === 1;
// true
1 == '1';
// true
1 === '1';
// false
true == 1;
// true
true === 1;
// false
true == '1';
// true
true === '1';
// false
false == 'false';
// true
false === 'false';
// false

 

何も関係ないけどiota

// iota
function iota (max, min, inc)
{
  var ret = [];

  for (var i = 0, j = min || 0;
       j <= max || 0;
       i++, j = j + inc || 1)
  {
    ret[i] = j;
  }
  return ret;
};

 

 

どこで読んだか忘れたけど「星の数ほどあるJavaScriptの本の中で"唯一"の良書」と聞いて購入。基本的な言語仕様の説明である10章までを読んで満足して積んでる。

JavaScript 第5版
JavaScript 第5版
posted with amazlet at 09.10.06
David Flanagan
オライリー・ジャパン
売り上げランキング: 5119
おすすめ度の平均: 4.0
4 言語としてのJavaScriptに一番踏み込んだ本
5 JavaScriptのバイブル本
4 JavaScripterに捧げる本
5 JavaScriptを理解したいのならだまされたと思って読んでください
2 初心者には難しいです

2009/09/08

Ejacs(Ejax)とjs2-modeを連携させる

WS000009

初めてelisp書いてみました。力技丸出しです。

 

C-c jでJavaScriptを書く状態を作る

バッファを上下に2分割して上はjs2-mode下はjs-console(Ejacs)を実行。

WS000010

C-c j

WS000011

リージョンをjs-consoleに渡して評価してもらう

JavaScriptのコードを入力

WS000012

リージョンを選択し、C-c C-r

WS000013 

 

以上(w

ほんとはScheme-modeくらい評価方法が選択できたらいいんだけど取り合えずこれでいいや。

 

C-c jでjs2-modeとjs-consoleを起動

(defun js-other-window ()
  "Run JavaScript on other window"
  (interactive)
  (split-window)
  (let ((buf-name (buffer-name (current-buffer))))
    (js2-mode)
    (js-console)
    (switch-to-buffer-other-window
     (get-buffer-create buf-name))))

 

(define-key global-map
  "\C-cj" 'js-other-window)

 

リージョンを評価

(defun js-execute-region ()
  "Execute region"
  (interactive)
  (let ((buf-name (buffer-name (current-buffer))))
    (copy-region-as-kill (point-min)(point-max))
    (let ((js-code (car kill-ring)))
          (switch-to-buffer-other-window "*js*")
          (js-console-exec-input (car kill-ring))
          (js-console-display-output (switch-to-buffer-other-window buf-name))
          )))

 

(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-execute-region)
                ))

2009/08/31

SchemeとJsでしつこくYCombinator

しつこいことにまたもや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){
   if (0 < n)
   {
     print("Hello, world !");
     f(n - 1);
   }
})(10);

 

マッチポンプ的な再帰に変換。自分に自分を呼び出す自分を渡して・・・

(function (f){
   f(f, 10);
})(function (f, n){
      if (0 < n)
      {
        print("Hello, world !");
        f(f, n - 1);
      }
    });

 

リテラルを一つ外にくくりだしてみる。無名関数はローカル変数の変わりになるというあれ。Schemeのletはlambdaでくくり出すのと同じだよーっていうあれ。

(function (x){
   (function (f){
      f(f, x);
    })(function (f, n){
         if (0 < n)
         {
           print ("Hello, world !");
           f(f, n - 1);
         }
       });
})(10);

 

出力を行う部分を関数として外に出してみる。この辺から後はとくに面白みがない。

(function (y, action){
   (function (x){
      (function (f){
         f(f, x);
       })(function (f, n){
            if (0 < n)
            {
              action(n);
              f(f, n - 1);
            }
          });
    })(y);
})(10, function (v){
      print("Hello, world !");
    });

 

反復条件も関数として外に出してみる。pはpredicateのpということで。

(function (y, a, p){
   (function (x){
      (function (f){
         f(f, x);
       })(function (f, n){
            if (p(n))
            {
              a(n);
              f(f, n - 1);
            }
          });
    })(y);
})(10, function (v){
      print("Hello, world !");
    }, function(c){
      return 0 < c;
    });

 

ここで再帰のたびにデクリメントされる部分を関数として外に出したらfor文ぽいよねーなどと思いながら外にだしてみる。iはincrementのiかな。

(function (y, a, p, i){
   (function (x){
      (function (f){
         f(f, x);
       })(function (f, n){
            if (p(n))
            {
              a(n);
              f(f, i(n));
            }
          });
    })(y);
})(10, function (v){
      print("Hello, world !");
    }, function(c){
      return 0 < c;
    }, function (j){
      return j - 1;
    });

2009/08/11

[js]map,iota,times

download - map.iota.times.js

 

map, iotaは何度か同じようなの書いてる。

timesはNumberクラスいじったらできるんじゃね?って思ったらできた。

 

// Arrayクラスのprototypeにmapを追加
Array.prototype.map = function (f)
{
  var ret = [];

  for (var i = 0; i < this.length; i++)
  {
    ret = f(this[i]);
  }
  return ret;
};

 

// Arrayクラスにiotaクラスメソッドを追加(したつもり)
Array.iota = function (cnt, init, inc)
{
  init = init || 0;
  inc = inc || 1;

  var ret = [];

  for (var i = 0, j = init; ret.length < cnt; i++, j = j + inc)
  {
    ret[i] = j;
  }

  return ret;
};

 

/*
js> Array.iota(10)
0,1,2,3,4,5,6,7,8,9


js> Array.iota(10, 10)
10,11,12,13,14,15,16,17,18,19


js> Array.iota(10, 2, 2)
2,4,6,8,10,12,14,16,18,20
*/

 

// 数値(Numberクラス?)のprototypeにtimesメソッドを追加
Number.prototype.times = function (f)
{
  var ret = [];
  for (var i = 0; i < Math.abs(this); i++)
  {
    ret[i] = f(i);
  }
  return ret;
};

/*
js> (10).times(function (i)
{
  print (i);
});
0
1
2
3
4
5
6
7
8
9
,,,,,,,,,

 

js> (10).times(function (i) { print ('hello'); })
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
,,,,,,,,,
js>
*/

2009/08/10

[JavaScript]srfiのiota

今日は少し寝不足で仕事中に激しい睡魔に襲われたので気分転換に書いた。

download

 

Arrayに非破壊的なmap追加してiotaっぽいの書いてfizzbuzzってみた。

Array.prototype.map = function (f)
{
  var ret = [];
  for (var i = 0; i < this.length; i++)
  {
    ret[i] = f(this[i]);
  }
  return ret;
};

function iota(cnt, init, inc)
{
  var ret = [];
  init = init || 0;
  inc = inc || 1;

  for (var i = 0, j = init; j < cnt; i++, (j = j + inc))
  {
    ret[i] = j;
  }
  return ret;
}

iota(100, 1).map(function (n){
                   var ret = n;
                   var modulo = function (divider)
                   {
                     return n % divider;
                   };

                   if (modulo(3) == 0)
                   {
                     ret = "fizz";
                   }
                   if (modulo(5) == 0)
                   {
                     ret = "buzz";
                   }
                   if (modulo(15) == 0)
                   {
                     ret = "fizzbuzz";
                   }

                   return ret;
                 });

[KPF]第4回勉強会をやってきた

取り急ぎ。

「SchemeとJavaScriptで数字遊び」と題してライブコーディングをやるつもりでしたが、途中でテンパってしまって自ら強制終了というなんともヒドイ醜態をさらしてきましたorz

ライブコーディングも中途半端だったので取り急ぎコードをさらします。

 

download

 

 

var inc = function (n)
{
  return ++n;
};

var dec = function (n)
{
  return n - 1;
};

var add = function (n, m)
{
  return m == 0
    ? n
    : inc(add(n, dec(m)));
};

var sub = function (n, m)
{
  return m == 0
    ? n
    : dec(sub(n, dec(m)));
};

var bgr = function (n, m)
{
return m == 0
    ? true
    : (n == 0
       ? false
       : bgr(dec(n), dec(m)));
};

var sml = function (n, m)
{
  return m == 0
    ? false
    : (n == 0
       ? true
       : sml(dec(n), dec(m)));
};

var mul = function (n, m)
{
  return m == 0
    ? m
    : add(n, mul(n, dec(m)));
};

var div = function (n, m)
{
  return sml(n, m)
    ? 0
    : inc(div(sub(n, m), m));
};

function fact (n)
{
  return n == 0
    ? 1
    : n * fact(--n);
}

function tailCallFact(n)
{
  var recur = function (m, ret)
  {
    return m == 0
      ? ret
      : recur(m - 1, m * ret);
  };
  return recur(n, 1);
}

function tailCallFact(n)
{
  var recur = function (m, ret)
  {
    return [ret, m == 0
      ? ret
            : recur(m - 1, m * ret)];
  };
  return recur(n, 1);
}

var i = 10;
do { print ("hello"); i--; }while(0 < i)

(function () { var i = 10; do{ print("hello"); i--;}while(0 < i);})();

Array.prototype.each = function (f)
{
  for(var i = 0; i<this.length; i++)
  {
    f(this[i]);
  }
};

(function (f){
   f(f, 10);
})(function (f, n){
      if (0 < n)
      {
        print ("hello");
        f(f, n - 1);
      }
    });

(function (f){
   f(f, 10);
})(function (f, n){
      if (0 < n)
      {
        print("hello");
        f(f, n - 1);
      }
    });

(function (f){
   f(f, f, 10);
})(function (f, n){
      if (0 < n)
      {
        print("hello");
        f(f, n - 1);
      }
    });

function map (f, array)
{
  for (var i = 0; i < array.length; i++)
  {
    array[i] = f(array[i]);
  }
  return array;
}

map(function (v)
    {
      print(v);
      return v;
    },
    [1, 2, 3, 4, 5]);

Array.prototype.map = function (f)
{
  for (var i = 0; i < this.length; i++)
  {
    this[i] = f(this[i]);
  }
  return this;
};

[1,2,3,4,5].map(function(v){print(v);return v;});

 

(define inc
  (lambda (n)
    (+ n 1)))

(define dec
  (lambda (n)
    (- n 1)))

(define add
  (lambda (n m)
    (if (zero? m)
        n
        (inc (add n (dec m))))))

(define sub
  (lambda (n m)
    (if (zero? m)
        n
        (dec (sub n (dec m))))))

(define bgr
  (lambda (n m)
    (cond
     ((zero? n) #f)
     ((zero? m) #t)
     (else (bgr (dec n)(dec m))))))

(define sml
  (lambda (n m)
    (cond
     ((zero? m) #f)
     ((zero? n) #t)
     (else (sml (dec n)(dec m))))))

(define mul
  (lambda (n m)
    (if (zero? m)
        0
        (add n (mul n (dec m))))))

(define div
  (lambda (n m)
    (if (sml n m)
        0
        (inc (div (sub n m) m)))))

(define fact
  (lambda (n)
    (if (zero? n)
        1
        (* n (fact (- n 1))))))

(define tail-call-fact
  (lambda (n)
    (letrec ((iter (lambda (n ret)
                     (cons
                      ret
                      (if (zero? n)
                          '()
                          (iter (- n 1)
                                (* n ret)))))))
      (iter n 1))))

(do ((i 0 (+ i 1)))
    ((= i 10))
  (print "hello"))

(let loop ((s 0))
  (if (< s 10)
      (begin
        (print "hello")
        (loop (+ s 1)))))

(for-each
(lambda (i)
   (print "hello"))
'(1 2 3 4 5))

((lambda (f)
   (f f 10))
(lambda (f n)
   (if (< 0 n)
       (begin
         (print "hello")
         (f f (- n 1))))))

((lambda (f)
   (f f 10))
(lambda (f n)
   (if (< 0 n)
       (begin
         (print "hello")
         (f f (- n 1))))))

(define fact
  (lambda (n)
    (if (zero? n)
        1
        (* n (fact (- n 1))))))

(define tail-call-fact
  (lambda (n)
    (letrec ((iter (lambda (x ret)
                     (if (zero? x)
                         ret
                         (iter (- x 1)(* x ret))))))
      (iter n 1))))

(define e '(define (fact n)
             (if (zero? n)
                 1
                 (* n (fact (- n 1))))))

(car e)
(caadr e)
(cdadr e)
(caddr e)

(use srfi-1)
(map
(lambda (n)
   (cond
    ((zero? (modulo n 3)) "fizz")
    ((zero? (modulo n 5)) "buzz")
    ((zero? (modulo n 15)) "fizzbuzz")
    (else n)))
(iota 100 1))

2009/05/11

[JavaScript]JavaScriptの文字列を複数行で定義する方法

WS0750

確かにその通りになったが、果たして必見と言うほどのことなのか良くわからない。逆にわかりにくく書きにくいのでは・・・。

文字列を'\r\n'とか書き散らして+演算子で結合するのがウザったらしいのならC#のStringBuilderクラスもどきみたいなの作ればいんじゃね。OOPLな言語なんだし(プロトタイプベースOOPL)。

 

2009/05/08

[JavaScript]高階JavaScript(Functional JavaScript)

WS0703


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])
  → [1, 4, 9, 16]

@hamatzさんに紹介していただきました!ありがとうございました!

@valvallow ちなみに、JavaScript で高階関数を使いたいアナタの為のライブラリもあるみたいです。 JavaScript スゲー!! http://osteele.com/sources/javascript/functional/