レガシーコード生産ガイド

私に教えられることなら

JavaScript

Elmでループ(末尾再帰・末尾呼び出し最適化について)

Elmで、List.mapなどを使わずに自分でループ的な処理を書きたい場合についてです。 関数型言語の手法に慣れてない人向け結論 「末尾再帰」が使えるので調べてみてください。 慣れている人向け結論 0.17現在、末尾再帰は最適化されるようです。末尾呼び出し最…

S式→JSトランスレータ再び

github.com 動作ページ まだ全然中身ないです。(ifすらない) 動機 自作SmalltalkVM NirnLeaf用に書いたパーサコンビネータの練習 jasjでちょいちょい開発してたけどnode.jsとGaucheが使える環境から離れていろいろ辛くなった ブラウザで動くと良いのでは 最…

ジャバスクリプトでLisp開発記録

10/22から作り始めてて、見返し用に開発記録を書いておくことにした。 動作サンプル なまえは、環境がNirnLeafで、言語がNirnLisp。 自作のS式→JavaScriptトランスレータjasjで書いてるので、altJSでと言ったほうがいいかもしれない。ごく薄いトランスレータ…

JavaScriptでクロージャのみでリストを作る

カッコの少ないSchemeを作る - 標高+1mの例がとてもおもしろかったのでJavaScriptでやってみた。 JavaScriptの場合f(g)(h)(car)(cdr)みたいに繋げていけたら面白そうだ。というわけでそういう構造にした。 全コード どういうレベルを対象にしていいか謎なの…

console.logの別名を作る

chromeだと普通にconsole.log.apply(this, arguments)やると怒られるので、consoleオブジェクトを渡す。 function p () { console.log.apply(console, arguments); } p("a: %d, b: %d", 1, 2); // a: 1, b: 2

MVCがよくわからないのでバインド的なものを作った

Angular.jsとか使ってるしちゃんと勉強しておこう、と思ってMVCの説明みても「つまり……どういうことだってばよ?!」っていつもなる。 何か先に頭の中にイメージができてたほうがいいかな、と思ったので散歩中に簡単なバインド(っていうのかな)の仕組みを…

JavaScript、CommonLisp、Parenscriptでの引数確認

JavaScript JavaScriptで引数が渡されているか確認するときは、暗黙の型変換に気をつけなければいけない。 function needX (x) { if (!x) { console.error("error!"); return; } console.log("x is " + x); } // 渡したと判定されて欲しい needX(""); // => …

Parenscriptでゲームを作ってみる準備をしてみる

Quicklispのインストール 公式の手順に従う。 curl -O http://beta.quicklisp.org/quicklisp.lisp # 公開鍵が無いってエラーが出た。面倒なので飛ばす # curl -O http://beta.quicklisp.org/quicklisp.lisp.asc # gpg --verify quicklisp.lisp.asc sbcl --lo…

JavaScriptで暗号化通信

特に漏れてもダメージは無いデータを扱うWebサービスを作っていて、こちらで発行したパスワードをトークンでの暗号化でやりとりする方式で認証していた。しかし平文が流れるのは流石に…と気になったのと、興味があったので、GET/POSTを公開鍵暗号方式で暗号…

演算子順位法で再実装

再帰下降構文解析の練習 - レガシーコード生産ガイドで作った四則演算の計算機を、BNFに依った演算子の定義ではなく、演算子順位法を用いて二項演算子を追加していけるようにした。 making-script-engine/calc.js at 307e233a5f3056914a15d8c77c6619616eb1f8…

atom-shellで開発ツールをオンオフする

いろいろなツールを作るのにatom-shellが便利そうなので使ってみることにした。 node-webkitだと再生できないmp3も再生できるみたいなのでatom-shellを選んだ。 まずはクイックスタートを見ながらファイルを構成する。 atom-shell/quick-start.md at master …

再帰下降構文解析の練習

githubのアカウントとリポジトリを作ってみた phaendal/making-script-engine phaendal/making-script-engine · GitHub 構文解析器生成器、を作ろうとしたけど、まったくイメージがわかない、というかわかってないことがわかったので、まずは手で再帰下降構…

構文解析器生成器に取り掛かってみる

2週間でできる!スクリプト言語の作り方 での勉強の続き。 本では著者が作った(?)Parserライブラリを使っているのだけど、JavaなのでJavaScript版が必要になる。移植は面倒そうなのと、考えてみるのが楽しそうなので自作してみることにする。(ヤクの毛刈り…

JavaScriptで字句解析

2週間でできる!スクリプト言語の作り方 という本を読みながら遊んでいる。 しばらくは使うプログラミング言語をJavaScriptともう一つに絞りたいので、JavaScriptでやってみる。 正規表現を用いた簡単な字句解析器は次のようになった var fs = require('fs')…

expressのリクエスト処理数を改善する

今作っているシステムのベンチマークをabで取ってみた。 コマンドはこう ab -t 10 -c 100 http://localhost:3000/ で、試したところ Document Path: / Document Length: 16427 bytes Requests per second: 0.07 [#/sec] (mean) Time per request: 1510588.90…

Yコンビネーター勉強前にif

//if var True = function (x) { return function (y) { return x; }; }; var False = function (x) { return function (y) { return y; }; }; var If = function (b) { return b === true ? True : False; }; function test (cond) { var result = If(cond)…

スマートフォンのスリープから復帰すると暫くSocket.ioの接続が復活しない

最初はイベントで復帰を判断して再接続すればいいだろう、ぐらいに軽く考えていたけど、思った以上にハマるポイントが多かった。 復帰の判断 android / chromeで試してたけど、resumeもpageshowもスリープからの復帰で発火されない。 いろいろ試したけど結局…

splitの動きと設計する場所

javascriptの文字列のsplitは、空文字列に使うと、状況によって空の配列か空文字列1つを含んだ配列を返す。 "".split(); // [''] "".split(""); // [] "".split(","); // [''] parseInt(""); // NaN "4,5,5,3"みたいなデータをsplitしてそれぞれparseIntして…

HaskellとJavaScript(Node.js)でテストデータ出力スクリプトを書き捨て #_poh

paizaってとこのオンラインハッカソン(結婚がどうのこうのというやつ)、JavaScriptで3問目が100%とれない。 どんなテストケースでどういう風にエラーが起きているのかわからないので、とりあえず標準入力がチャンクで区切られた時にちゃんと処理できるか確…