llvmのsub expressionっぽいやつの書き方
メモ。
LLVM IRは基本的に以下のような構造をしている。
; (レジスタ名) = (命令名) (引数 ...)
%2 = mul i64 %0, %1
ところがコンパイラが生成した.llファイルを見ていると、引数の部分に別の命令が入っていたりする。
%4 = mul i32 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i32), %3
メモ。
LLVM IRは基本的に以下のような構造をしている。
; (レジスタ名) = (命令名) (引数 ...)
%2 = mul i64 %0, %1
ところがコンパイラが生成した.llファイルを見ていると、引数の部分に別の命令が入っていたりする。
%4 = mul i32 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i32), %3
プログラミング言語「PPAP」を作りました。
I have 80 Pen
I have 65 Apple
R7RSのマクロシステムはsyntax-rulesだけだが、R6RSにあったsyntax-caseや、いくつかの処理系が実装しているexplicit-renaming, implicit-renamingといったマクロシステムでは、マクロ展開時に任意の式が書ける。
では、マクロ展開時にdisplayを使って文字列を出力した場合、それはどのタイミングで評価されるのだろうか?特にインタプリタじゃなくてコンパイラの場合は?
ということで適当なSchemeコンパイラを用意する。Macだとbrew install chickenでChiken Schemeが入る。マクロシステムはexplicit-renamingがあるようなのでそれを使う。
(define-syntax foo
Today I encountered a curious error on running tests of a Rails app.
(snip)/gems/yard-0.8.7.6/lib/yard/globals.rb:16:in `log': wrong number of arguments (given 1, expected 0) (ArgumentError)
I did not indend to use yard while testing. By checking Gemfile.lock, I found pry-doc was the only gem depends on yard. The error was removed by fixing Gemfile to exclude pry-doc from the "test" group.
本記事は言語実装 Advent Calendar 2016の最終日の記事です。話題が多岐に渡っていて楽しいアドベントカレンダーでしたね。前日はEgisonのリーマン幾何学用記法の話でした。
BiwaSchemeは筆者が作っているJavaScriptによるScheme実装です。先月の話ですが、list-sortという関数を修正し、比較に使うScheme関数を受け取れるように改善しました。BiwaSchemeは中間言語方式(VM方式)かつライブラリを全てJSで実装するという方針になっているため、実装に少し工夫が必要でした。本稿ではそのことについて解説します。
JavaScriptでScheme処理系を実装する場合、いくつかの方針が考えられます。
この記事はRuby Advent Calendar 2016の最終日の記事です。
秋に行われたRubyKaigi 2016のあとのAfter partyで、以下のような発表をしました。
内容は、会社の同僚と一緒にRubyでAtCoderをやっているという話でした。AtCoderはオンラインで競技プログラミングができるサイトで、Rubyを含めたさまざまな言語で参加することができ、過去問についても解答を受け付けているため好きなときにチャレンジすることができます。
この記事はOpal Advent Calendar 2016とRuby Game Developing Advent Calendar 2016の21日目の記事です。
OpalはRubyスクリプトをJavaScriptに変換してくれる処理系です。ということは、Opalを使えばRubyを使ってブラウザで動くゲームが作れるはずです。
opal-phaserはPhaserというブラウザゲーム用ライブラリをOpalから使えるようにしたものです。今回はこれを触ってみたいと思います。
本記事はOpal Advent Calendar 2016の19日目のエントリです。
今回はOpalのHashクラスの実装について見ていきます。
opal/corelibは、array.rbやstring.rbなど、組み込みクラスの実装が置かれているディレクトリです。この中に一つだけ、runtime.jsという、拡張子が.jsのファイルがあります。
runtime.jsはコンパイル後のJavaScriptの一部としてそのまま埋め込まれます。クラスの生成や 定数の探索といった処理系の基礎となる機能が実装されており、Opalの心臓部といえるでしょう。
本記事はOpal Advent Calendar 2016の17日目の記事です。
OpalはRubyからJavaScriptへのコンパイラです。今回はRubyの黒魔術の一つであるmethod_missingの実装について見ていきます。
Module#method_missingは、あるオブジェクトに対して定義されていないメソッドを呼び出したときに走るフックを定義する機能です。
class A
本記事はOpal Advent Calendar 2016の17日目の記事です。
OpalはRubyからJavaScriptへのコンパイラです。今回はRubyの黒魔術の一つであるmethod_missingの実装について見ていきます。
Module#method_missingは、あるオブジェクトに対して定義されていないメソッドを呼び出したときに走るフックを定義する機能です。
class A