Object.create(null)

TypeError: Cannot convert object to primitive value

プログラミング

Atom パッケージ開発のすゝめ

Kyoto.js 13 で飛び入り LT チャンスがあったのでやりました. Atom で VJ をするパッケージの発表があったのでそれに乗っかった形です. kyoto.js.org kyotojs.connpass.com これは当日 Atom で Markdown を書いてそのまま発表したものをスライドとして体裁を…

近況

ご飯炊けるまでに最近やってることとか書きます. System Fω の実装 js-sandbox/system-f-omega at master · susisu/js-sandbox · GitHub 前回やった System F の続き. 簡単に説明すると System F に加えて型レベルの関数 (type operator とか type construct…

型無しラムダ計算での不動点オペレータの導出

公式は覚えるものではなく, 必要に応じて導出するものだよ (?) 不動点オペレータ 不動点オペレータ (大抵 fix という名前, コンビネータ計算の文脈では Y とも) は Haskell では以下のように定義される関数である. fix f = f (fix f) つまり, fix f は関数 f…

JavaScript 処理分岐どう書く問題

JavaScript で (バリアント的な) 複数の可能性がある値について処理を分岐するときに, どのように書くのが良いかという話. ここでは具体例として簡単な数式の計算プログラムを考えます. 数式を表すクラスは以下の通り. // literal class Lit { constructor(v…

5分で伝えたかった Curry–Howard 同型対応

伝えたかった LT をしました. connpass.com やたら枚数が多い割に密度が高くなってしまっている言い訳をさせてもらうと, なかなか話がまとまらなくて, 結局直前に急いで作った結果, 時間配分をまったく考えていない感じになってしまいました. 当日 System F …

npm script の実行順のメモ

npm@4.5 時点. 適当に書いていると (主に prepublish/prepare/prepublishOnly あたりで) 落とし穴に嵌ることがありそうなので. npm install (引数なし) preinstall install postinstall prepublish prepare prepublish は npm@5 以降では prepublishOnly と…

Unicode の East Asian Width 特性値を取得したりするライブラリを作った

また作った報告になってしまい恐縮ですが, 作りましたにゃん. github.com East Asian Width (EAW) とは 参考: UAX #11: East Asian Width 東アジアの文字幅 - Wikipedia 元は Unicode の文字を旧来の文字セット (Shift-JIS や EUC-JP など) にマップする際に…

Atom 1.17 beta の Dock のメモ

詳しくはこちらのブログ記事を参考にしてください (1.16 のリリース記事ですが, 下の方に 1.17 beta についても書いてあります). blog.atom.io 1.16 以前のイメージ Workspace Left Panel(Tree View) Pane 1 Text Editor 1 Text Editor 2 Pane 2 Settings Te…

Atom のカーソル上下移動を改良するパッケージを作った

相変わらず Atom の環境を整備し続けています. というわけでまたパッケージを作りました. atom.io カーソルを上下に動かしたとき, デフォルトではこんな感じに全角文字などが間に入るとカーソルの水平位置がぐちゃぐちゃと動いてしまいます (水平位置を文字…

パーサコンビネータを高速化した

例のアレです. 式年遷宮したときの話はこちら. github.com 最初は軽い気持ちで細々とした最適化をしていたんです. switch を if に変えるとかいう小手先のアレで 10 % も高速化してウケてる— ボノボ (@susisu2413) 2017年3月13日 インライン化も同時にしてた…

Markdown のテーブルをいい感じに編集する Atom パッケージを作った

相変わらず既存のものが……だったので作りました. 以前 SyaroNote で Ace 向けに作ったものをベースに色々改良しています. atom.io 動作はこんな感じです. 他にも行の挿入や, 左・右・中央揃えの切り替えなどが簡単にできます. Markdown のテーブルの編集にお…

Sublime Text から Atom へ乗り換えチャレンジ

なぜ JavaScript を書いているときにやたらと React のスニペットが表示されるようになって*1, これが大変迷惑だったためです. destroy を補完するために destroy と入力する必要があるのクソでしょ— susisu (@susisu2413) 2017年2月16日 pic.twitter.com/8…

ラムダ計算での代数的データのエンコード的な話

Grass で遊んでたらラムダ計算熱が復活してきたので. 以下は特に断りのない限り call-by-value の型無しラムダ計算です (謎の ML 風文法で書いてあるけど, まあわかると思うので適当に読んで下さい). Church encoding と Scott encoding 関数 (ラムダ抽象) …

Haskell 書いてる (た)

なぜ プログラミング言語は何が使えるのと聞かれたとき, 「JavaScript, ActionScript と, あと Haskell が少しわかります」みたいな答え方をしていたのですが, 最後に Haskell でまともに何かを書いたのが 2013 年頃で *1, 最近の開発フローとかをまったく理…

Haskell 開発環境構築 on macOS

stack が GHC やパッケージの管理をまとめて行ってくれるので, ふつうは stack だけインストールすれば良さそう. とはいえ本当にこれで良いのかよくわかっていないので, おすすめがあれば教えて下さい. stack https://docs.haskellstack.org/en/stable/insta…

Unicode と JavaScript の文字列について

パーサコンビネータ を作っていたとき, 最近流行りの (?) 絵文字が変数名として使えるような言語を作る場合に, 正しくコード中の扱うにはどうしたら良いかなどを考えていたら, Unicode と JavaScript の文字列に関する理解が得られたので, ここに共有します.…

2016年に作ったもの

一年は長いのか短いのか, その一年で作ったものは多いのか少ないのか, そんなことを考えながら (考えていない) 今年作ったものを振り返りドヤ顔するだけの記事. ( ゚д゚ )彡 est 統計計算用簡易スクリプト言語. github.com 実験データを集計するのに awk で計…

String.fromCodePoint が遅かった

発端 ある日, 私は文字列の先頭を切り出すために次のような関数を書いていました. https://github.com/susisu/loquat-core/blob/dcd37f885b5f5b1b0dfdc0e15680375a16239318/lib/utils.js#L97-L113 function unconsString(str, unicode) { if (unicode) { con…

Node.js でコンソールアプリを作る

この記事は OUCC Advent Calendar 2016 の 21 日目の記事です. www.adventar.org こんにちは, @susisu2413 です. みなさんは JavaScript でコンソールアプリを作りたくありませんか? 私は作りたいです. この記事では Node.js (+ NPM) を使って JavaScript で…

npm view をいい感じに整形してくれるやつを作った

ググってもいい感じのが無さそうだったので作りました (既にあったら教えてください). npm i -g npm-sum github.com なにこれ npm にはパッケージの情報を取得する npm view (あるいは show, info, v) というコマンドがありますが, これは全ての情報を含む巨…

tailRecM とパーサコンビネータ

TL; DR tailRecM は, Alternative あるいは MonadPlus でもあるパーサ (ParsecT) において, 再帰的なパーサの定義をする際にも有効. パーサコンビネータは便利 例として文字列リテラルのパーサを書いてみます. BNF で書くと (character はいい感じにやるとし…

パーサコンビネータライブラリを式年遷宮した

パーサコンビネータライブラリ loquat の v2 をとりあえず prerelease しました. フルスクラッチで式年遷宮したのでリポジトリも以前のものとは別になっています. github.com そもそも何をするライブラリなのかみたいな説明は上のリポジトリを見てください. …

ジェネレータを有効活用し隊

こいつ LT ばっかりやってんな. Kyoto.js 11 というイベントで JavaScript のジェネレータについて LT をしました. JS 界隈の色々な話が聞けてよかった(小学生並みの感想). kyotojs.connpass.com 補足説明など スライド中では .next() メソッドをいかにも単…

入れ子になった do 記法の展開

例えば JavaScript で let x = (() => { let y = foo; return bar(y); })(); を let y = foo; let x = bar(y); と書き換えても良かったり *1, Perl で my $x = do { my $y = foo; bar($y); }; を my $y = foo; my $x = bar($y); と書き換えても良かったりす…

遅延評価と健康

というタイトル詐欺で, 遅延評価でパーサコンビネータを高速化した話をしました. 健康になるのはプログラムです. パーサコンビネータを題材にしていますが, 要するに今回の話は, 遅延評価といえば無限リストなどが挙げられがちだが, 単に効率化のためにも使…

Node.js で V8 のプロファイラを使う

余談 どうでもいいようなことを投稿するための「小ネタ」カテゴリを作った. 誰もお前に聞いてないとか, そういう感想歓迎です. 本編 node foobar.js の代わりに, node --prof foobar.js みたいにすると isolate-0x***-v8.log みたいなファイルができる. これ…

GitHub の緑化を二年続けて思ったこと

一年継続したといった記事を見て, そういえば二年継続していたら何か書こうかなと思っていたのを思い出したので, 書きます. github.com 2014年の10月2日からなので二年とちょっとですね. 良かったこと 当然ですがアウトプットの量が増えているはずです. 面倒…

式年遷宮メモ

ES6 以降で書きなおしたい 読みやすさ モジュールごとに package 分けたい 各モジュール (ファイル) が肥大化しすぎて扱いにくい テストのファイル分割したい 関数ごとにファイルわけないとひどい (現状) エラーメッセージの localization 機能追加 正規表現…

DOM オブジェクトを canvas に描画する方法について

方法1: SVG の foreignObject を使って HTML を埋め込む 参考: Drawing DOM objects into a canvas - Web APIs | MDN SVG の <foreignObject> という要素内に描画したい HTML 要素を埋め込み, それを ctx.drawImage() とかで canvas に描画するという流れ. 利点は, 描画する</foreignobject>…

任意サイズテトリスを JS / HTML Canvas に移植した

こちらから遊べます → dotris 昔Flash で作ったもの (なんと最初のバージョンは 5 年も前らしい) を JS / HTML Canvas に移植しました. 最新の Firefox か Chrome ならとりあえず動くと思います. 2016年7月31日追記: たぶん flag 変更しなくても大丈夫になり…