You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

408 lines
11 KiB

% -*- mode: latex; coding: utf-8 -*-
% !TEX TS-program = pdflatexmk
% !TEX encoding = UTF-8 Unicode
%\RequirePackage[hyphens]{url}
\documentclass[%
a4paper,
twoside,
numbers=noenddot,
parskip=half,
open=any,
headsepline,
english, % german, english
ba % ba, pa
]{zhawthesis}
\usepackage{etoolbox}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Parameters
% - Adjust these to your needs:
\title{Functional Go}
\subtitle{...An Easier Introduction to Functional Programming}
\author{% Komma getrennt
Ramon Rüttimann
}
\newcommand\twodigits[1]{\ifnum#1<10 0#1\else #1\fi}
\date{\twodigits{\the\day}.\twodigits{\number\month}.\the\year}
\major{Computer Science} % Studiengang
\zhawsemester{Spring 2020}
\zhawinstitute{init}
\zhawlogocolour{pantone2945} % pantone2945, cmyk, sw
\mainsupervisor{Dr. G. Burkert}
\subsupervisor{Dr. K. Rege}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Base packages used by the template (any commonly used packages)
%\PassOptionsToPackage{hyphens}{url}\usepackage{hyperref}
\usepackage{float}
\usepackage{graphicx}
\graphicspath{{figures/}}
\DeclareGraphicsExtensions{.pdf,.png,.jpg,.gif}
\usepackage{tabularx}
\usepackage{longtable}
\usepackage{booktabs}
\usepackage{todonotes}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Custom packages
% - Add packages used by your thesis here:
%\usepackage{hyperref}
%\PassOptionsToPackage{hyphens}{url}\usepackage{hyperref}
\hypersetup{
colorlinks = true, %Colours links instead of ugly boxes
%urlcolor = blue, %Colour for external hyperlinks
linkcolor = blue, %Colour of internal links
citecolor = blue %Colour of citations
}
\usepackage[newfloat]{minted}
\usepackage{listings}
\newenvironment{code}{\captionsetup{type=listing}}{}
\SetupFloatingEnvironment{listing}{name=Source Code,placement=H}
\definecolor{bg}{rgb}{0.95,0.95,0.95}
\newminted{bash}{breaklines,breakbytoken,tabsize=2,bgcolor=bg}
\newminted{bnf}{breaklines,breakbytoken,tabsize=2,bgcolor=bg}
\newminted{c}{breaklines,breakbytoken,tabsize=2,bgcolor=bg}
\newminted{go}{breaklines,breakbytoken,tabsize=2,bgcolor=bg}
\newminted{haskell}{breaklines,breakbytoken,tabsize=2,bgcolor=bg}
\newminted{java}{breaklines,breakbytoken,tabsize=2,bgcolor=bg}
\newmintedfile{go}{breaklines,breakanywhere,tabsize=2,bgcolor=bg,linenos,stepnumber=5,numberfirstline}
\newcommand{\gofilerange}[4][]{%
\immediate\write18{./utils/delim -file="#2" -start="#3" -end="#4"}%
\IfFileExists{code.lineno}%
{\CatchFileEdef{\linenumber}{./code.lineno}{\endlinechar=-1 }}%
{\def\linenumber{0}}%
\edef\flags{firstnumber=\linenumber,#1}%
\expandafter\gofile\expandafter[\flags]{./code.snippet}}
\newcommand{\unchapter}[1]{%
\begingroup
\let\@makesectionhead\@gobble % make \@makechapterhead do nothing
\section{#1}
\endgroup
}
\makeatother
%\sloppy
\usepackage[
backend=biber,
hyperref=true,
style=ieee,
dashed=false,
]{biblatex}
\usepackage{xurl}
\usepackage[skip=0pt]{caption}
\usepackage[toc,page]{appendix}
\usepackage{hyperref}
\usepackage{glossaries}
\usepackage{pdfpages}
%\usepackage{listings}
\makeglossaries
%\usepackage{csquotes}
\AtBeginEnvironment{quote}{\itshape}
%\bibliography{thesis}
\addbibresource{thesis.bib}
\begin{document}
\frontmatter
\maketitle
\cleardoublepage % chktex 1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Declaration of Originality
\makedeclarationoforiginality % chktex 1
\cleardoublepage % chktex 1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\chapter{Abstract}
\label{ch:abstract} % chktex 24
\input{chapters/01_abstract.tex}
\chapter{Zusammenfassung}
\label{ch:summary} % chktex 24
\input{chapters/02_zusammenfassung.tex}
\IfLanguageName{nswissgerman}{\chapter{Vorwort}}{\chapter{Preface}}
\label{ch:preface} % chktex 24
\input{chapters/10_preface.tex}
\cleardoublepage % chktex 1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\mainmatter % chktex 1
\tableofcontents
\IfLanguageName{nswissgerman}{\chapter{Einleitung}}{\chapter{Introduction}}
\label{ch:introduction} % chktex 24
\input{chapters/20_introduction.tex}
\chapter{About Go}
\label{ch:about-go}
\input{chapters/25_about_go.tex}
% DISABLE RELATED WORK AS I PUT THAT INTO THE INTRO
%\IfLanguageName{nswissgerman}{\chapter{Verwandte Arbeit}}{\chapter{Related Work}}
%\label{ch:related-work} % chktex 24
%\input{chapters/30_related_work.tex}
\IfLanguageName{nswissgerman}{\chapter{Methoden}}{\chapter{Methodology}}
\label{ch:methodology} % chktex 24
\input{chapters/30_methodology.tex}
\chapter{Implementation}
\label{ch:implementation} % chktex 24
\input{chapters/40_implementation.tex}
\chapter{Application}
\label{ch:application} % chktex 24
\input{chapters/50_application.tex}
\IfLanguageName{nswissgerman}{\chapter{Resultate}}{\chapter{Results}}
\label{ch:results} % chktex 24
\input{chapters/60_results.tex}
\IfLanguageName{nswissgerman}{\chapter{Diskussion}}{\chapter{Discussion}}
\label{ch:discussion} % chktex 24
\input{chapters/70_discussion.tex}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\backmatter % chktex 1
% \let\clearpage\relax
% \vspace{-4em}
\printbibliography
% \endgroup
\renewcommand{\lstlistlistingname}{List of source codes}
\lstlistoflistings
% \begingroup
% \let\clearpage\relax
% \vspace{-4em}
\listoffigures
% \endgroup
% \begingroup
% \let\clearpage\relax
% \vspace{-4em}
\listoftables
\clearpage
\phantomsection
\addtocounter{chapter}{1}
\addcontentsline{toc}{chapter}{%
Glossary}
\printglossaries
% \endgroup
\cleardoublepage % chktex 1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%\appendix
\begin{appendices}
\input{chapters/80_appendix.tex}
%\section{Example for Functional Options}\label{appendix:funcopts}
%\begin{code}
%\captionof{listing}{Functional Options for a simple Webserver}
%\gofile{../work/examples/functional-options/main.go}
%\end{code}
%\section{Analysis of function occurrences in Haskell code}\label{appendix:function-occurrences}
%The results of the analysis have been aquired by running the following command
%from the root of the git repository\cite{git-repo}:
%\begin{bashcode}
%./work/common-list-functions/count-function.sh "map " " : " "fold" "filter " "reverse " "take " "drop " "maximum" "sum " "zip " "product " "minimum " "reduce "
%\end{bashcode}
%\section{Mutating variables in Go}\label{appendix:mutation}
%\begin{code}
%\captionof{listing}{Example on how to mutate complex types in Go}
%\gofile{../work/examples/mutate/main.go}
%\end{code}
%\section{Shadowing variables in Go}\label{appendix:shadowing}
%\begin{code}
%\captionof{listing}{Example on how shadowing works on block scopes}
%\gofile{../work/examples/shadowing/main.go}
%\end{code}
%\section{Workaround for the missing foldl' implementation in Go}\label{appendix:foldl-go}
%\begin{code}
%\captionof{listing}{Working around the missing foldl implementation in Go}
%\label{code:foldl-go}
%\gofile{../work/examples/foldl-workaround/main.go}
%\begin{bashcode}
%$> fgo run .
%0
%panic: runtime error: invalid memory address or nil pointer dereference
%[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x109e945]
%goroutine 1 [running]:
%main.what(0x2, 0x0, 0x2)
%/tmp/map/main.go:16 +0x5
%main.main()
%/tmp/map/main.go:12 +0x187
%exit status 2
%\end{bashcode}
%\end{code}
%\section{Prettyprint implementation}\label{appendix:prettyprint-func}
%\begin{code}
%\captionof{listing}{The original prettyprint implementation}
%\gofile{../work/funcheck/prettyprint/prettyprint.go}
%\end{code}
%\begin{code}
%\captionof{listing}{The refactored, functional prettyprint implementation}
%\begin{gocode}
%package prettyprint
%import (
%"bytes"
%"fmt"
%"go/ast"
%"go/printer"
%"go/token"
%"golang.org/x/tools/go/analysis"
%)
%var Analyzer = &analysis.Analyzer{
%Name: "prettyprint",
%Doc: "prints positions",
%Run: run,
%}
%type null struct{}
%func checkDecl(as *ast.DeclStmt, fset *token.FileSet) {
%fmt.Printf("Declaration %q: %v\n", render(fset, as), as.Pos())
%check := func(_ null, spec ast.Spec) (n null) {
%val, ok := spec.(*ast.ValueSpec)
%if !ok {
%return
%}
%if val.Values != nil {
%return
%}
%if _, ok := val.Type.(*ast.FuncType); !ok {
%return
%}
%fmt.Printf("\tIdent %q: %v\n", render(fset, val), val.Names[0].Pos())
%return
%}
%if decl, ok := as.Decl.(*ast.GenDecl); ok {
%_ = foldl(check, null{}, decl.Specs)
%}
%}
%func checkAssign(as *ast.AssignStmt, fset *token.FileSet) {
%fmt.Printf("Assignment %q: %v\n", render(fset, as), as.Pos())
%check := func(_ null, expr ast.Expr) (n null) {
%ident, ok := expr.(*ast.Ident) // Lhs always is an "IdentifierList"
%if !ok {
%return
%}
%fmt.Printf("\tIdent %q: %v\n", ident.String(), ident.Pos())
%switch {
%case ident.Name == "_":
%fmt.Printf("\t\tBlank Identifier!\n")
%case ident.Obj == nil:
%fmt.Printf("\t\tDecl is not in the same file!\n")
%default:
%// make sure the declaration has a Pos func and get it
%declPos := ident.Obj.Decl.(ast.Node).Pos()
%fmt.Printf("\t\tDecl %q: %v\n", render(fset, ident.Obj.Decl), declPos)
%}
%return
%}
%_ = foldl(check, null{}, as.Lhs)
%}
%func run(pass *analysis.Pass) (interface{}, error) {
%inspect := func(_ null, file *ast.File) (n null) {
%ast.Inspect(file, func(n ast.Node) bool {
%switch as := n.(type) {
%case *ast.DeclStmt:
%checkDecl(as, pass.Fset)
%case *ast.AssignStmt:
%checkAssign(as, pass.Fset)
%}
%return true
%})
%return
%}
%_ = foldl(inspect, null{}, pass.Files)
%return nil, nil
%}
%// render returns the pretty-print of the given node
%func render(fset *token.FileSet, x interface{}) string {
%var buf bytes.Buffer
%if err := printer.Fprint(&buf, fset, x); err != nil {
%panic(err)
%}
%return buf.String()
%}
%\end{gocode}
%\end{code}
%% - Add your appendix here:
%\todo[inline]{
%Anhang/Appendix:
%\quad -- Projektmanagement: \\ % chktex 8
%\qquad -- Offizielle Aufgabenstellung, Projektauftrag \\ % chktex 8
%\qquad -- (Zeitplan) \\ % chktex 8
%\qquad -- (Besprechungsprotokolle oder Journals) % chktex 8
%\quad -- Weiteres: \\ % chktex 8
%\qquad -- CD/USB-Stick mit dem vollständigen Bericht als PDF-File inklusive Film- und Fotomaterial \\ % chktex 8
%\qquad -- (Schaltpläne und Ablaufschemata) \\ % chktex 8
%\qquad -- (Spezifikation u. Datenblätter der verwendeten Messgeräte und/oder Komponenten) \\ % chktex 8
%\qquad -- (Berechnungen, Messwerte, Simulationsresultate) \\ % chktex 8
%\qquad -- (Stoffdaten) \\ % chktex 8
%\qquad -- (Fehlerrechnungen mit Messunsicherheiten) \\ % chktex 8
%\qquad -- (Grafische Darstellungen, Fotos) \\ % chktex 8
%\qquad -- (Datenträger mit weiteren Daten (z. B. Software-Komponenten) inkl. Verzeichnis der auf diesem Datenträger abgelegten Dateien) \\ % chktex 8
%\qquad -- (Softwarecode) % chktex 8
%}
\end{appendices}
\end{document}