プログラミングをプログラミングすること。
Rubyにおけるメタプログラミングの例
class Person attr_accessor :name, :age end
Rubyではattr_accessorを用いてインスタンス変数をアクセスするメソッド(ここではnameとage)を生成できる。
はじめに STORES 予約でエンジニアをやっている@ucksです。 大体年内にやりたかったタスクが捌けてきたので空いた時間でブログを書いています。 Railsからのメール送信でお世話になるAction Mailer。 インスタンスメソッドを定義しているのにクラスメソッドから呼び出しをしています。 どの様な仕組みになっているのか不思議に思ったことはないでしょうか。 様々な方法で、OSSのソースコードを追うことがあると思いますが、今回は追い方の一例として、実際のAction Mailerのロジックを追いながら、どの様な仕組みになっているのか、参考になるロジックはあるのかを、探索したり、拡張できな…
この記事は虎の穴ラボ Advent Calendar 2024の10日目の記事です。 こんにちは、虎の穴ラボFantiaエンジニアの吉岡です。 今回はDartに試験的に導入されているマクロの機能について触ってみようと思います。 注意点として、Dartのマクロはまだ開発中の機能でありDartのバージョンが3.4以上であることやFlutterはまだ未対応など制限が多くあります。 マクロ機能とは Dartのマクロ機能はコードの生成や拡張といったメタプログラミング手法を提供する機能になります。 マクロを利用することで、コンパイルしたタイミングで指定したクラスに任意のコードが生成、拡張されます。 これに…
こんにちは。フォースタートアップス株式会社、エンジニアの石田です。 前回の記事では「主にバックエンドのエンジニアをしています。」と自己紹介しましたが、今はバックエンドとフロントエンド両方を担当しています。 特に直近数ヶ月はフロントエンド(React/Next + TypeScript)ばかりやっています。ですが、私が一番好きな言語はRubyですので、今回も前回と同じくRubyの話をしたいと思います。 今回の内容はRubyの基礎知識+豆知識的な内容になります。後半になるにつれて認知度が低く、マニアック度が高くなる気がします。お付き合いください。 ゲッター/セッターメソッド Rubyで頻繁に使うa…
「メタプログラミングRuby 第2版」はRubyをより深く使いこなすための素晴らしい本ですが、理解を深めるには実際にコードを書いてみることが不可欠です。読者向けの練習問題集がGitHub - kinoppyd/reading-metaprogramming-rubyに公開されているので、手を動かしながらメタプログラミングの理解を深めることができました。ぜひ、Rubyのメタプログラミングについて理解を深めたい方は練習問題を試してみてください! メタプログラミングRuby 第2版とは メタプログラミングRuby 第2版で学べること メタプロの練習問題集の reading-metaprogrammi…
Railsチュートリアルの第11章を進めていきます。 第11章(アカウントの有効化) 第11章(アカウントの有効化) AccountActivationsリソース AccountActivationsデータモデル AccountActivationsのbeforeアクション アカウント有効化のメール送信 メーラー メーラーのテスト assert_matchについて アカウント有効化 メタプログラミング、sendメソッド editアクション ユーザー有効化のテスト 第11章ー演習ー 11.1.1 11.1.2 11.2.1 11.2.2 11.2.3 11.2.4 11.3.1 11.3.2 1…
sendと_send_ sendメソッドとは レシーバーが持っているメソッドを、文字列(またはシンボル)で指定して呼び出すことができる。 Object#send (Ruby 3.1 リファレンスマニュアル) class Foo def bar? true end def send(*args) false end end foo = Foo.new foo.send(:bar?) # => false foo.__send__(:bar?) # => true sendとの使い分け sendは様々なクラスで使い回されているため、sendの本来の挙動を使用したい場合に_send_を使用する。 定…
Scala 3でコンパイル時計算がいろいろ便利になっていそうなので, 練習として拡張可能レコード(extensible record)を実装してみた. 前回はmatch typesで型レベルの操作のみでいろいろできたから, 今回もそういうつもりでやろうと思ったものの, けっきょくマクロが必要で, Scala 3のマクロの練習という感じになった. Scala 3のマクロはScala 2からはだいぶ変わっていて, かなり便利になっていることがわかった.
またか. またなのか. 何回目だ. ということで, ラムダ計算のインタプリタの実装としては4回目くらい*1, コンパイル時計算でやるものとしても3回目くらいになってしまうけど, ラムダ計算の処理系をまた書いてしまった.今回の目的は, Scala 3にはmatch typesという機能があり, これだけでチューリング完全なのではないか, というのを検証するため. また, 文字列リテラル型を操作する型レベル関数が3.1.2-RC1にきていて, これを使えば構文解析器だって書ける. *1:OCamlのサブセットとかJavaのサブセットとか他の言語も含めるともっと多い
ドメイン特化言語(DSL: Domain-Specific Language) 問題領域に特化した言語を意味する 特定の作業の遂行や問題の解決に特化して設計されたコンピュータ言語。 Railsでは、Validations・ActiveRecord・Rake・RSpecなど幅広く使われている。 汎用語(GPL: General Purpose Language) ← DSLの反意語 通常は多種多様な問題に対応できるものを意味する Rubyで簡単なDSLを書いてみる DSL定義ファイル def pay(souvenir) puts "結果: #{souvenir}" if yield end lo…
どうも hkrblog です. 最近やたらと寒いですね..... 今日はpythonのメタプログラミング入門と題して本当に触りの部分、 クラスを動的に作って、インスタンス生成して、メソッド呼び出すくらいのものです. (やっぱりpythonだとコード短いし、パパパッて感じで書けてしまう感じがして ブログとかに載せやすいからついついpython関連の記事になってしまう....w) 実際このコードは2, 3か月前に書いたものです... まずはコードを載せてしまいます. class Student: def __init__(self, student_id, name): self.student_…