Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

タグ

ブックマーク / zenn.dev/sonota88 (8)

  • Rubyで素朴なdiffコマンドを書いてみた(動的計画法)

    だいぶ前に書いたものを見て思い出したりしつつ最低限のものを書いてみました。 (他所に書いていたものを引っ越してきました。元の公開日は 2024-02-12 です。) コード 一番ベーシックな動的計画法のものを書いてみました。より改良された手法もあるようですが記事では扱いません。 後で自分が見て思い出しやすいように少し冗長に書いています。「理解のためのリファクタリング」を自分なりに行った状態です。 # diff.rb class Diff def initialize(xs_a, xs_b) @xs_a = [nil] + xs_a @xs_b = [nil] + xs_b @table = Array.new(@xs_a.size) { Array.new(@xs_b.size) } end def no_edit?(ai, bi) @xs_a[ai] == @xs_b[bi] end

    Rubyで素朴なdiffコマンドを書いてみた(動的計画法)
  • Forth(Gforth)で簡単な自作言語のコンパイラを書いた

    かんたんな自作言語のコンパイラをいろんな言語で書いてみるシリーズ 23番目の言語は Forth です。これで 冬来たる-ready [1] になりました。世界が崩壊して Forth しか使えなくなっても自作言語で書いたプログラムをコンパイルして遊ぶことができますね! (他所に書いていたものを引っ越してきました。元の公開日は 2023-03-12 です。) できたもの 動かし方の例 $ echo ' func add(a, b) { return a + b; } func main() { call add(1, 2); } ' | gforth mrcl_lexer.fs | gforth mrcl_parser.fs | gforth mrcl_codegen.fs # ↓アセンブリが出力される call main exit label add push bp cp sp bp cp

    Forth(Gforth)で簡単な自作言語のコンパイラを書いた
  • HTML+JavaScriptでEmacsのalign-regexpっぽいやつを作った

    これは Emacs Advent Calendar 2022 3日目の記事です。 Emacsが使えない環境で不慣れなエディタを使ってテキスト編集を行う際、日常的・無意識的に使っていた機能が使えず悲しくなるということがあります。 私にとってのそんな機能の1つが、Emacs に標準で備わっているコマンド align-regexp です。 何かしらの手段で同じようなことができればよいのですが、できない場合は手でちまちまアラインメントを揃える羽目に……こんな作業は機械にやらせるべき……。 というわけで、align-regexp だけを抜き出してブラウザで使えるようにしたものを HTML + JavaScript で作ってみました。 動かしている様子: エディタからコピペしてきて、加工してまた戻すという手間は必要ですが、全部手作業でやるよりははるかにまし、という感じのもの。 使い方は見ての通りで、加

    HTML+JavaScriptでEmacsのalign-regexpっぽいやつを作った
  • PHPでかんたんな自作言語のコンパイラを書いた

    ブログに書いていたものを引っ越してきて手直ししました。元の記事公開日は 2020-09-18 です。 かんたんな自作言語のコンパイラをいろんな言語で書いてみるシリーズ 8番目の言語は PHP です。 ライフゲームのコンパイルが通ったのでヨシ、という程度の雑なものです。 できたもの サイズはこんな感じ: $ wc -l {lexer,parser,codegen}.php lib/utils.php 66 lexer.php 536 parser.php 423 codegen.php 42 lib/utils.php 1067 合計 echo ' func add(a, b) { return a + b; } func main() { call add(1, 2); } ' | php lexer.php | php parser.php | php codegen.php # ↓アセ

    PHPでかんたんな自作言語のコンパイラを書いた
    sonota88
    sonota88 2022/07/10
  • RuboCopの出力をルールでグループ化 + 違反件数の多い順にソートするフィルタスクリプト

    ファイルごとではなくルールごとにまとめて見たかったので適当なスクリプトを書いてみました。ついでに違反(offense)件数が多い順にソートしてみました。 # sort_rubocop.rb map = {} ARGF.each_line do |line| rule_name = line.sub(" [Correctable]", "").split(" ")[2] map[rule_name] ||= [] map[rule_name] << line end # for Emacs puts "# -*- mode: compilation -*-" map.to_a .sort_by { |_, lines| -lines.size } # 件数が多い順 .each do |rule_name, lines| puts "" puts "# #{rule_name}" lines.

    RuboCopの出力をルールでグループ化 + 違反件数の多い順にソートするフィルタスクリプト
  • Reline.readmultilineの練習: mysqlコマンドのラッパーを作ってちょっといい感じにしてみる

    Reline.readmultiline の基的な使い方を前回調べましたので、練習で何か作ってみようかと。 何でもよかったのですが、ためしに mysql コマンド(MySQLクライアント)のラッパーを作ってみました。mysql コマンドの対話的インターフェイス、複数行入力はできますが、履歴を遡ると1行にされてちょっと不便ですよね(という体でやってみました)。 使い方 先にテスト用の MySQL サーバを Docker で起動しておいて mysql_wrapper.rb を実行します。 $ docker run -d --rm --name mysql_test \ -e MYSQL_ALLOW_EMPTY_PASSWORD=yes \ mysql:8.0.23 # サーバが起動するのを待ってから $ ruby mysql_wrapper.rb require "json" require

    Reline.readmultilineの練習: mysqlコマンドのラッパーを作ってちょっといい感じにしてみる
  • テストメソッドを1つだけ実行するのが面倒だったので minitest_runner.rb というスクリプトを書いてみた

    minitest では次のように -n オプションを使うことでテストメソッド(テストケース)1個だけを実行することができます。 このときファイル名はシェルの補完が効くのでスッと入力できますが、メソッド名はシェルの補完が効きません。 で、手入力したり、エディタで開いているテストコードやファイルを grep した結果からコピペしてくることになるのですが、いずれにしてもめんどくさく……。 というわけでやっつけスクリプトを書いてみました。 使い方 (1) プロジェクトのルートディレクトリで ruby minitest_runner.rb を実行する (2) テストファイルが番号付きで列挙されるので、番号を入力して選択 (3) 選択したファイル内のテストメソッドが番号付きで列挙されるので、番号を入力して選択 (4) 選択したテストメソッドが実行される というのが基ですが、 $ ruby minit

    テストメソッドを1つだけ実行するのが面倒だったので minitest_runner.rb というスクリプトを書いてみた
  • Zigでかんたんな自作言語のコンパイラを書いた

    ブログに書いていたものを引っ越してきて一部手直ししました。元の記事公開日は 2021-01-07 です。 かんたんな自作言語のコンパイラをいろんな言語で書いてみるシリーズ 11回目は Zig です。 ライフゲームのコンパイルが通ったのでヨシ、という程度の雑なものです。 Zig言語(ziglang)を触り始めて1週間くらいの人が、理解は後回しにしてとにかく動くものを作るぞ、という方向性で書いたもの(その程度のノリでかんたんに書けるコンパイラです)。 Zig のバージョンは 0.6.0。 (追記 2022-07-17: 0.9.1 に上げました) できたもの サイズはこんな感じ: $ wc -l {lexer,parser,codegen}.zig lib/{types,utils,json}.zig 189 lexer.zig 630 parser.zig 552 codegen.zig 2

    Zigでかんたんな自作言語のコンパイラを書いた
    sonota88
    sonota88 2021/01/08
  • 1