Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Echo_itself_by__.pdf
Search
ライガー
March 30, 2024
Programming
0
46
Echo_itself_by__.pdf
ライガー
March 30, 2024
Tweet
Share
More Decks by ライガー
See All by ライガー
愛知県なんもないよね~www
raiga0310
0
36
クソコード鑑賞会
raiga0310
0
120
make HTTP server with Axum, Rust
raiga0310
0
120
Other Decks in Programming
See All in Programming
新卒エンジニアのプルリクエスト with AI駆動
fukunaga2025
0
230
複数人でのCLI/Infrastructure as Codeの暮らしを良くする
shmokmt
5
2.3k
Github Copilotのチャット履歴ビューワーを作りました~WPF、dotnet10もあるよ~ #clrh111
katsuyuzu
0
110
AIコーディングエージェント(NotebookLM)
kondai24
0
200
AIエージェントを活かすPM術 AI駆動開発の現場から
gyuta
0
430
MAP, Jigsaw, Code Golf 振り返り会 by 関東Kaggler会|Jigsaw 15th Solution
hasibirok0
0
250
Integrating WordPress and Symfony
alexandresalome
0
160
AIコーディングエージェント(skywork)
kondai24
0
180
Tinkerbellから学ぶ、Podで DHCPをリッスンする手法
tomokon
0
130
Why Kotlin? 電子カルテを Kotlin で開発する理由 / Why Kotlin? at Henry
agatan
2
7.4k
ゲームの物理 剛体編
fadis
0
350
大体よく分かるscala.collection.immutable.HashMap ~ Compressed Hash-Array Mapped Prefix-tree (CHAMP) ~
matsu_chara
2
220
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Building Applications with DynamoDB
mza
96
6.8k
Designing Experiences People Love
moore
143
24k
GraphQLとの向き合い方2022年版
quramy
50
14k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Raft: Consensus for Rubyists
vanstee
141
7.2k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.8k
Optimizing for Happiness
mojombo
379
70k
Why Our Code Smells
bkeepers
PRO
340
57k
BBQ
matthewcrist
89
9.9k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.6k
Building Flexible Design Systems
yeseniaperezcruz
330
39k
Transcript
Echo itself by 🦀 Genkai LT #5 Generated by DALL-E3
Prompt: "自己言及するカニ"
Introduce raiga0310/AHOXA/ライガー Backend Rust/TypeScript/PHP https://profile.a6x.dev ***twitter***: @ahoxa1rx
Quineって知ってる?
Quine クワイン 自身のソースコードと同じ文字列を出力するコード 任意のプログラミング言語 [注]で実装できる 注:任意の計算可能な文字列を出力できるプログラミング言語にはクワインが存在する、別に チューリング完全である必要はない
Quineの例(C)
ナイーブな実装
長い
もう少し簡単な例
None
ナイーブなQuineのポイント このコードは「このコードは「 ...」を出力する」を出力する ↑のような再帰的な出力を考える …が無限に増えないように考える さっきの例だとプリプロセッサとマクロ展開を利用した実装 「出力部の前後」をどう出力するかとかが結構重要
きれいな(?)Quine
Haskell
Scheme & Common Lisp
HQ9+
ほんへ(Rust)
実装パターン • ナイーブな実装 ◦ フォーマットの出力形式を利用する • ズル(?) ◦ Built-inマクロを使います •
macro_rules!でオレオレマクロ ◦ 魔術 • Bling-Bang-Bang-Born • 他にもあるかもしれないけど自分で作って :heart:
ナイーブ実装
徐々に実装していく まず普通に出力してみる
このコードを入れてみる
このままだと再帰地獄なので、前後半に分ける
Rustのフォーマット記法 デバッグ記法を活用する format!系列(文字列に展開する系)の記法 https://doc.rust-lang.org/std/fmt/index.html#syntax
None
None
Rustのフォーマット記法 基本的には「{}」を使って順序で展開する 「{:?}」や「{:#?}」を使うとDebugトレイトの実装にしたがって展開される 「:」の前後で展開する際のオプションをつけれる 前に「数値」または「識別子」を入れるとそれを参照する
例
さっきの書きかけの実装をもう一度見てみる
この実装で足りない部分 愚直実装なのでこのままだと無限引数が生える • 『引数の数を減らす』『Quineの要件を満たす』両方やる →さっきのパラメータ参照するフォーマット記法を使う (+エスケープ記法もつかうのでデバッグ形式を使う )
実装(formatかかったのはゆるして)
ズル(?)な実装
include_str!()がズル ファイルの内容自体を取得できる Quineのためにあると行っても過言ではない (は?)
macro_rules!を使う
macro_rules! 文法拡張記法 = 黒魔術 ルールにマッチするパターンを別の値・式に変換する
縁の下の力持ちなのだが...... Actix-webのルーティング記法、Serenityのコマンド、#[tokio::main]などなど 標準出力のprint!()系の可変長引数を受容できる仕組みもマクロによるもの 実装によっては危惧されるべき動作を起こしやすい 気をつけて実装しようね(臆病すぎるのもあれだけど )
あとはナイーブな実装とほぼ同じ 注意するポイント format!系マクロでの{}のエスケープは2重にすること「{{」「}}」とか(1敗) 出力したあとに使えるようにするにはエスケープを残したいので {:?}をつかおうね(2敗)
まずコード自体を素直に入れてみる
オレ自身がフォーマッタになることだ
おまけ:Bling-Bang-Bang-Born
pelmers/quine参照
なにこれ 後半のコードの文字をすべて ASCIIで配列表現したものをcharにキャストして出力する力技
AAもあるよ なに食べたらひらめくの? https://rosettacode.org/wiki/Quine#Rust
Thx for listening ;)
おまけ https://x.com/mathlava/status/1762633882443411920?s=20