プログラミングをプログラミングすること。
Rubyにおけるメタプログラミングの例
class Person attr_accessor :name, :age end
Rubyではattr_accessorを用いてインスタンス変数をアクセスするメソッド(ここではnameとage)を生成できる。
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_…
新しい言語をさわったらとりあえずラムダ計算のインタプリタを実装するよね! Scalaでふつうにラムダ計算のインタプリタを実装するのはあまりに簡単*1なので, 型レベルでやってみた.まじめな話をしておくと, C++のテンプレートがチューリング完全なのは有名な話だけど, Scalaではどうなのか気になった. 以前C++のテンプレートでラムダ計算のインタプリタを実装したのと同様のことができるか思考実験してみると, だいたいできそうに思えたのでやってみた. *1:ケースクラスの公式ドキュメントに途中まで実装が書いてあるレベル
を使うのに、今一度Juliaプログラミングクックブック ―言語仕様からデータ分析、機械学習、数値計算まで作者:Bogumił Kamiński,Przemysław Szufelオライリー・ジャパンAmazonで使い方を整理する。 前回 注意 0. まえがき 0.1 Juliaの特徴 0.2. 配列 0.2.1 多次元配列 0.2.2 1オリジン 0.2.3 カラムメジャー 0.2.4 配列の内包表記 0.3 関数とその使い方 0.3.1 doブロック構文 0.3.2 パイプ演算子 0.4 Juliaによる「オブジェクト指向」プログラミング 0.4.1 構造体 0.4.2 総称関数と多重ディス…
問題3:ファイル名の一括変換 正答 別解 今後の方針 その他メモ 参考サイト 問題3:ファイル名の一括変換 1 ~ 1000000という名前のファイルを作成したのち、ファイル名の頭に0をつけて7桁に揃える。 ※ 1000000だと時間がかかるので以下1000で行う。 正答 $ ls | xargs -P2 rename 's/^/0000/;s/0*([0-9]{4})/$1/' 最初のs/^/0000/;で、ファイル名の先頭に4個の0をつける。 次のs/0*([0-9]{4})/$1/で、0から始まるファイル名の末尾4桁を抽出し、該当部分を()で囲んでグループ化し、$1で後方参照してリネーム…
や、言語関係など覚えたいもの、覚えるべきものはたくさんある一方で、注目が集まっているから、やってみたい。ということでプログラミング言語としてのを学んでいく。1から始める Juliaプログラミング作者:進藤 裕之,佐藤 建太コロナ社Amazon 1. Julia入門・Juliaの言語機能(1) 2. Juliaの言語機能(2) 3. Juliaのにおける型 4. Juliaのコレクション 5. Juliaのコレクション(復習) 6. 多次元配列(1) 7. 多次元配列(2) 8. モジュール 9. メタプログラミング 10. JuliaからのC言語の呼び出し方法 11. Juliaライブラリの使…
仕事 育児 技術 株式投資 読書 ギター 2023 年 仕事 今年は*1 React Native (Expo) を利用したネイティブアプリ開発のプロジェクトで、主に Expo を利用した基盤整備を担当していた。具体的には GitHub Actions で EAS Build / Update をフックする処理を書いたり AWS Lambda でビルドされたアプリを S3 に転送する非同期処理を書いたり アプリがプッシュ通知を受信できるようにしたり Config Plugin と呼ばれる機構の上で TypeScript を使って Swift / Java をメタプログラミングをしたり 自分は …
2.xは持っているが 日曜プログラマーでRubyは業務効率化くらいでしか使ってないので 知識をアップデートする。 要項は以下 実行環境 組み込み変数/定数 文法 リテラル 変数と定数 演算子 ブロック 例外処理 大域脱出 キーワード引数 ナンバードパラメータ ラムダ式(->) パターンマッチ ヒアドキュメント オブジェクト指向 メソッドの詳細 メソッドの可視性 クラスの詳細 クラスの継承 モジュールの詳細 Module#prepend Refinements メタプログラミング eval、define_method、instance_variable_get等 組み込みライブラリ よく使用され…
みなさまメリークリスマス 🎅 ヤプリのテックブログ改善委員会のおうえです。 こちらの記事は、ヤプリアドベントカレンダー#2最終日の記事となります。 最終日ということで、アドベントカレンダーのことを振り返ってみようと思います 最高のWin 今年は書きたいってヤプリメンバーが多かったので、25記事を超えて…2枚目のアドベントカレンダーに突入しました! また多種多様な職種のヤプリメンバーが投稿してくれた結果、バラエティに富んだ内容でヤプリ全体の空気を伝えることができたんじゃないかなーと思っております。 adventar.org adventar.org きっかけ 昨年、ヤプリ初めてのアドベントカレン…
現在Swiftにマクロを導入しようという提案がSwift Evolutionのレビュー中*1です。 SwiftによってSwiftの構文を拡張できる、いわゆるメタプログラミングと呼ばれる機能です。 実はマクロの他にもSwiftでメタプログラミングを実現する機能の提案が複数提案*2*3されています。 Swift 6はメタプログラミングの時代になるかもしれません。 現代的なプログラミング言語のマクロ みなさんはマクロと聞いて、どのような機能を想像しますか? C言語のマクロは、プリプロセッサと呼ばれるコンパイル前のプログラムによってプログラムのソースコードに置換や文字列連結を行う機能でした。 原理的に…
この記事は 呉高専 Advent Calendar 2022 - Adventar の21日目の記事です。 新卒で Wantedly という会社に就職し、その会社を今年いっぱいで退職することになりました。 なので、数年後自分がお酒を飲みながらエモい気持ちになるための振り返りとして書き残しておきます。 Wantedly とは まずは、私が新卒で入社した Wantedly という会社について軽く紹介します。 Wantedly は「シゴトでココロオドルひとをふやす」をミッションに以下のサービスを展開しています。 気軽に会社訪問できる Wantedly Visit 知り合いの活躍を確認できる Want…
詳解Go言語Webアプリケーション開発作者:清水陽一郎シーアンドアール研究所Amazon の第2章であるcontextパッケージについての解説を読んだ。HTTPリクエストハンドラが引数に取ったところから始まるコンテキストが、DBの保存、レスポンスをするまでcontextバケツリレーをする実装をGoのWeb開発では是としていることがわかった。他の言語だったらフレームワークがハンドラをデコレートしたり、メタプログラミングやマクロでどうにかしそうな部分だが*1、Goっぽいシンプルさに納得がいった。小さいサンプルコードが豊富でとても嬉しいのだが余白も多いので、実行結果を書いてくれたらいいのになと感じて…
みなさんこんにちは。電通国際情報サービス(ISID) 金融ソリューション事業部の水野です。 これは電通国際情報サービス Advent Calendar 2022の16日目の記事です。 今回は、ISID金融事業部で運用しているスキルマップについてご紹介します。 テックリードとは 実は、ISIDの少なくとも金融事業部にテックリードと言うポジションはありません。 実在するのはチーフアーキテクトと言う職種のみで、各プロジェクトでリードエンジニアやテックリードという仮想的なロールがあるのが実態です。 一時期はフルスタックエンジニアと呼んでいる時期もありましたが、近年このワーディングが好まれない印象なので…
目次 目次 はじめに 前知識 Proc &修飾 (&:method)を解読する 例のコードを読んでみる まとめ 参考 はじめに この記事はCODE BASE OKINAWA Advent Calendar 2022 - Adventarの10日目のエントリーです。 今まで何気なく使っていた(&:method)がどういう挙動をしているのか見ていきます。 ↓こんなやつ %w(urasoe naha ginowan).map(&:upcase) #=> ["URASOE", "NAHA", "GINOWAN"] 前知識 (&:)を理解するために必要な知識をそれぞれ見ていきます。 Proc Procと…
Ansible Collection NECのUniverge IXシリーズ対応コレクションを作成しました。 ただしモジュールは簡単なcommandとconfigの変更ができるだけで課題は山積みです。 環境作成 まずはPythonの仮想環境を作成します。 インストールしたパッケージは下記になります。 パッケージ管理ツールでpoetryを使っているのでtomlからの抜粋になります。 [tool.poetry.dependencies] python = "^3.10" ansible = "^6.4.0" paramiko = "^2.11.0" ansible-pylibssh = "^1.0…
はじめに ちょっと前に「「このバイブルに育てられた」駆け出しエンジニアだった頃に読み込んだ、学びの一冊をご紹介」というweb記事が話題になっていました。type.jpたぶん、長年ITエンジニアをやっている人なら1冊か2冊はそういった「バイブル」があると思います。そこでフィヨルドブートキャンプのメンターに「あなたが「このバイブルに育てられた」と思う一冊は何ですか?」という質問をしてみました。 なお、回答者はメンターだけでなく、アドバイザー(メンターではないが、受講生の学習状況を確認できる企業関係者)や卒業生も含まれています。というわけで、以下がその回答です!【もくじ】 はじめに メンターの伊藤淳…
皆さんおはようございます。見ている人は見ていたかもしれませんが、昨夜はかなり遅くまで巷で話題沸騰のChatGPTによくわからんクエリを投げて、その結果をみてげらげら笑っていました。特に存在しないプログラミング言語であり「ScalaにHaskellと同じ型推論を加えた」言語Scalayがあることにしたら、ChatGPTが本当にHaskellぽい(単なるHMでなく、Haskellぽいというのは型クラスまで推論される辺り)型推論を持つ架空のScalayコードを解釈実行してくれたりしたところは、控えめに言っても予想外の結果で深夜なのに部屋で忍び笑いをしていました。 Scalaに引数の型推論を追加したよ…
普段の業務でrspecのモック機能には非常にお世話になっています。使い方は非常に簡単で、既存クラスに定義された関数の振る舞いを変更することが出来ます。 (※実際に既存クラスの定義が書き変わるわけではありません) class Hoge def foo 'foo!' end def bar 'bar!' end end # ref: https://relishapp.com/rspec/rspec-mocks/docs/basics/test-doubles RSpec.describe "A test double" do it "returns canned responses from t…