Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Echo_itself_by__.pdf
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
ライガー
March 30, 2024
Programming
68
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Echo_itself_by__.pdf
ライガー
March 30, 2024
More Decks by ライガー
See All by ライガー
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
580
Programming Viewing with Reserved Keywords
raiga0310
0
130
愛知県なんもないよね~www
raiga0310
0
62
クソコード鑑賞会
raiga0310
0
180
make HTTP server with Axum, Rust
raiga0310
0
160
Other Decks in Programming
See All in Programming
速習iPhone Duo対応
yuukiw00w
2
930
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
1.7k
Simple Storage Service(S3) is not simple
iwatsukayura
0
120
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
420
iOSDC2026登壇資料.pdf
riofujimon
0
200
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
150
難しいけど、読めた。- OSSの入口に立った話。
sts11142
0
130
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
20
20k
AgentCore CLI で進化した AWS での AI エージェントの作り方 : 必要な機能を必要な時に
icoxfog417
PRO
4
410
カツオ、ご期待ください
suneo3476
0
140
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
440
iOSDCのペンライトを自動制御したい!
akkeylab
0
340
Featured
See All Featured
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
420
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Typedesign – Prime Four
hannesfritz
42
3.2k
Writing Fast Ruby
sferik
630
63k
Designing for Timeless Needs
cassininazir
1
510
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
730
Paper Plane (Part 1)
katiecoart
PRO
2
11k
Google's AI Overviews - The New Search
badams
0
1.6k
Utilizing Notion as your number one productivity tool
mfonobong
4
610
The Invisible Side of Design
smashingmag
301
52k
Leo the Paperboy
mayatellez
10
2.3k
Optimising Largest Contentful Paint
csswizardry
37
4k
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