Object.create(null)

TypeError: Cannot convert object to primitive value

プログラミング

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 変更しなくても大丈夫になり…

HTML canvas のビットマップ操作のメモ

未だに Flash 脳の私は canvas の操作をする時に「BitmapData のあのメソッドと同じことをしたい」と考えるのですが, canvas の API はパッと見では必要最低限以下なんじゃないかというくらいの機能しか提供していないので, どうしたら実現できるのかすぐに…

Grass 生成コードの乱択アルゴリズムによる最適化を試みる回

ラムダ計算から Grass へのコンパイラ作ったったwWWwwwwWWww - Object.create(null) の続きです. 経緯 ラムダ計算から Grass への変換ができたのは良かったものの, 生成コードはそのままでは無駄が多く, 例えば Brainfuck インタプリタの場合, 生成さ…

ラムダ計算から Grass へのコンパイラ作ったったwWWwwwwWWww

github.com いつものように JavaScript で書いたので, npm でインストールできます. npm i -g @susisu/grasspiler 例えば, (* fixed-point operator *) let fix = fun f -> (fun x -> f (fun y -> x x y)) (fun x -> f (fun y -> x x y)) (* infinite loop *…

楽しく学ぶ難解プログラミング言語

connpass.com タイトルの通りの LT をしました. 先日の Grass インタプリタはその伏線だったというわけですね. 当初は真面目路線で作ってたのですが, LT の制限時間 (5分) で簡潔にまとめるのが難しくて, 結局こんな感じになってしまいました. まだまだ修行…

コールバック地獄から async/await に至るまでと, 非同期処理以外への応用

継続渡しスタイル (CPS: Continuation-assing style) 例えば以下は引数として与えられた数に 1 を加えるだけの関数と, それを呼び出すプログラム. function succ(x) { return x + 1; } console.log(succ(2)); // -> 3 CPS では関数がその継続 (callback) を…

Grass インタプリタを書いた

いつものように JavaScript で書きました. github.com npm があればnpm install -g @susisu/grass-js でインストールできて, grass /path/to/progfile とかで遊べます. Grass とは Grass the grass-planting programming language の通り, 草を生やす言語で…