\documentclass[12pt]{beamer}

\usepackage[utf8]{inputenc}
\usepackage[main=russian,english]{babel}
\usepackage{fontspec}
\usepackage{listings}

\setmainfont{JetBrains Mono}
\setsansfont{JetBrains Mono}

\usetheme{metropolis}
\newenvironment{code}{\ttfamily}{\par}
\title{tvix-eval \\ компилятор и рантайм для Nix, на Rust}

\titlegraphic{\vspace{4.8cm}\flushright\includegraphics[width=6cm,keepaspectratio=true]{tvix-logo.png}}

\date{2023-09-07}
\author{Винсент Амбо}
\institute{TVL}

\begin{document}
  %% Slide -1 (before counter):
  \begin{frame}
    \begin{center}
      \titlepage
    \end{center}
  \end{frame}

  %% Slide 0 (title):
  \begin{frame}
    \begin{center}
      \titlepage
    \end{center}
  \end{frame}

  %% Slide 1:
  \begin{frame}{\textbf{Т}he \textbf{V}irus \textbf{L}ounge}
    \begin{itemize}
    \item онлайн-комьюнити, занимающееся тулингом для монорепо
    \item основной фокус на Nix
    \item Nix не только для сборки пакетов
    \item Хотелось решение, чтобы использовать Nix везде
    \end{itemize}
  \end{frame}

  %% Slide 2:
  \begin{frame}{Особенности языка Nix}
    \begin{itemize}
    \item Ленивый язык. Вычислять все сразу нельзя.
    \item Язык развивался органично.
    \item Большинство кода на Nix --- в одном месте: \begin{code}nixpkgs\end{code}
    \end{itemize}
  \end{frame}

  %% Slide 3:
  \begin{frame}{Текущая имплементация: C++ Nix}
    \lstinputlisting[
      language=c++,
      basicstyle={\scriptsize}
    ]{cppnix-example-lexer.cpp}
  \end{frame}

  %% Slide 4:
  \begin{frame}{Текущая имплементация: C++ Nix}
    \lstinputlisting[
      language=c++,
      basicstyle={\scriptsize}
    ]{cppnix-example-smuggling.cpp}
  \end{frame}

  %% Slide 5:
  \section{``Let's rewrite it in Rust!''}

  %% Slide 6:
  \section*{Спасибо, jD91mZM2!\\\normalsize{автор ``rnix-parser''; *2002 - \textdagger 2021}}

  %% Slide 7:
  \begin{frame}{tvix-eval, - (язык) Nix, на Rust}
    \begin{itemize}
    \item написано с существующим парсером
    \item bytecode-интерпретатор, вместо tree-walk
    \item должна работать не только для остальных частей tvix
    \end{itemize}
  \end{frame}

  %% Slide 8:
  \begin{frame}{tvix-eval, основные части}
    \begin{enumerate}
    \item собственный байткод и компилятор
    \end{enumerate}
  \end{frame}

  %% показать opcode.rs, быстро показать compiler/mod.rs

  %% Slide 9:
  \begin{frame}{tvix-eval, основные части}
    \begin{enumerate}
    \item собственный байткод и компилятор
    \item представление значений языка в рантайме
    \end{enumerate}
  \end{frame}

  %% показать Value

  %% Slide 10:
  \begin{frame}{tvix-eval, основные части}
    \begin{enumerate}
    \item собственный байткод и компилятор
    \item представление значении языка в рантайме
    \item ... и сам рантайм!
    \end{enumerate}
  \end{frame}

  %% показать VM

  \section{``Подожди, написать рантайм же не так просто?''}

  %% объяснить проблему со стеком и решение, показать диаграмму

  \section{``А откуда знаешь, что это все правильно работает?''}

  %% показать как тесты работают
  %% объяснить дебагинг, Твиксболт и тд

  %% Slide 10:
  \begin{frame}{tvix-eval, в браузере}
    \begin{itemize}
    \item удивительно легко делать
    \item но есть сложности в \begin{code}std::\end{code}
      % показать пример
    \end{itemize}
  \end{frame}

  %% Slide 11:
  \begin{frame}{А что дальше?}
    В tvix-eval есть еще кое-какие интересные проблемы. Может ты их
    решишь?
  \end{frame}

  \begin{frame}{Спасибо!}
    \begin{center}
      \includegraphics[width=6cm,keepaspectratio=true]{qrcode.png}

      https://tazj.in/blog/tvix-eval-talk-2023 \\
      t.me/tazjin | t.me/tazlog
    \end{center}
  \end{frame}
\end{document}
