Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Echo_itself_by__.pdf
Search
ライガー
March 30, 2024
Programming
0
10
Echo_itself_by__.pdf
ライガー
March 30, 2024
Tweet
Share
More Decks by ライガー
See All by ライガー
愛知県なんもないよね~www
raiga0310
0
12
クソコード鑑賞会
raiga0310
0
41
make HTTP server with Axum, Rust
raiga0310
0
83
Other Decks in Programming
See All in Programming
DMMプラットフォームがTiDB Cloudを採用した背景
pospome
9
4.2k
Milestoner
bkuhlmann
1
410
2 週間で Twitter Bot を作ってみた
contour_gara
0
740
『Railsオワコン』と言われる時代に、なぜブルーモ証券はRailsを選ぶのか
free_world21
1
330
Java 22 Overview
kishida
1
190
はてなにおける CSS Modules、及び CSS Modules に足りないもの / CSS Modules in Hatena, and CSS Modules missing parts
mizdra
7
960
ゆるい個人開発のススメ
kuroppe1819
10
1k
AWS CDKコントリビュートTIPS / aws-cdk-contribution-tips
gotok365
3
310
ADRを一年運用してみた/adr_after_a_year
hanhan1978
7
2.4k
CA.swift19 恋するAIアプリ開発の裏側
oskmr
0
380
Apache Hive 4 on Treasure Data
ryukobayashi
0
400
新宿ダンジョンを可視化してみた
satoshi7190
2
280
Featured
See All Featured
Docker and Python
trallard
35
2.7k
Why You Should Never Use an ORM
jnunemaker
PRO
51
8.6k
WebSockets: Embracing the real-time Web
robhawkes
59
7k
Large-scale JavaScript Application Architecture
addyosmani
504
110k
Documentation Writing (for coders)
carmenintech
61
4k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
242
1.2M
Automating Front-end Workflow
addyosmani
1357
200k
Designing for humans not robots
tammielis
248
25k
Reflections from 52 weeks, 52 projects
jeffersonlam
345
19k
Web development in the modern age
philhawksworth
203
10k
Fireside Chat
paigeccino
22
2.6k
Optimising Largest Contentful Paint
csswizardry
12
2.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