setTimeout()に渡したコールバック関数は、JavaScriptランタイムのメッセージキューに登録されます。 setTimeout()の呼び出し元は、コールスタックのすべての関数がreturnすることで、ランタイムに処理が戻ります。 ランタイムは、メッセージキューにすぐに実行できる関数があれば実行し、なければ待ちます。 メッセージキューには setTimeout()で登録されたもののように、一定時間後にならなければ実行できないものと、setImmediate()やPromiseで登録されたもののように即座に実行できるものがあります。 メッセージキューが空になると、Node.jsの環境であればプログラムが終了します。 setTimeout()のスリープで何が問題か? setTimeout()は、上述の通り現在のコールスタックがすべてreturnしなければ処理が始まらないのですから、現
Liyad Let's make your yet another DSL with Lisp S-expression! Liyad (Lisp yet another DSL interpreter, or LIYAD is yum and delicious) is very small Lisp interpreter written in JavaScript. You can easily start making your new DSL using Lisp and S-expression. Install from NPM: or download UMD from release page. NOTICE: Use with webpack >= 5 If you get the error: Module not found: Error: Can't resolv
言語を自作していると、特殊用途でない限り CLI は概ね実装することになりますが、 REPL(Read-Eval-Print Loop; 対話的にコードを実行できる仕組み) は必ずしも要らないため、後回しにしてしまいがちです。 なぜ、後回しにしてしまうかを説明したいと思います。 1. だるい 便利に使えるREPLというのは、メジャーな言語のREPL(Python, JavaScript, Ruby, その他いろいろ)を見ればわかりますが、複数行にわたるコンソールの編集機能を提供していたり、入力のヒストリー機能を持っていたりします。 これらは、単純に標準入出力を読み書きするだけでは実現できません。 端末の行・列のサイズを取ったり、ユーザーのキー入力(矢印キーやバックスペース等)で入力カーソルを動かしたり、文字を消したりする必要があります。 2. だるい 端末の画面描画を行うためには、端末にエ
拙作のLispインタープリター「Liyad」においても、 (無いとLisp処理系として格好が付かないので) 非常に限定的に末尾再帰最適化を実装しています。 Liyadにおける末尾再帰最適化 Liyadでは、単純にASTのS式が特定のパターン(1種類)に合致するときのみ末尾再帰最適化を行い、 関数の再帰呼び出しをループに展開します。 パターンの疑似コード: ($lambda (f-arg-1 ... f-arg-N) expr-a-1 ... expr-a-M ($if cond-expr expr-t ($self r-arg-expr-1 ... r-arg-expr-N) )) これを次のようにASTを変換します。 疑似コード: ($lambda (f-arg-1 ... f-arg-N) ($until cond-expr ($clisp-let (tempsym-1 ... tem
Liyad v0.0.13をリリースしました。 今回のリリースでは、クロージャー(関数閉包)関連のオペレーターが追加になりました。 ($closure (arg1 argN) use (var1 varM) expr) (|-> (arg1 argN) use (var1 varM) expr) ($capture (var1 varM) ($lambda (arg1 argN) expr)) ($capture (var1 varM) (-> (arg1 argN) expr)) $closure および |-> はクロージャーとしてラムダ式を作成します。これは、$capture と $lambda または -> を組み合わせた式と等価です。 $capture は、その括弧内において、引数で指定されたシンボルを括弧内で定義される関数およびラムダ式のスコープに引き渡します。 指定されたシン
10/8から RawGit サイトにサービス終了のお知らせが表示されています。 RawGit has reached the end of its useful life October 8, 2018 RawGit is now in a sunset phase and will soon shut down. It's been a fun five years, but all things must end. GitHub repositories that served content through RawGit within the last month will continue to be served until at least October of 2019. URLs for other repositories are no longer being serv
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く