\documentclass[a4paper]{article} 

% biber
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[serbianc]{babel}
\usepackage{multicol}
\usepackage{textcase}
\usepackage{tocloft}
\usepackage{graphicx}
\usepackage[backend=biber]{biblatex}
\addbibresource{lit.bib}

\author{Петар Каприш}
\title{Лисп интерпретер}

\begin{document}
\begin{titlepage}
	\centering
	{\Large
	\textbf{Гимназија ,,Јован јовановић Змај''}

	Нови Сад
	}

	\vspace*{5cm}
	\makeatletter
	{\LARGE
		\textbf{Матурски рад из програмирања}

		\vspace*{0.5cm}
		\MakeUppercase{\textbf{\@title}}
	}

	\vspace*{8.9cm}

	{\LARGE
	Професор ментор:
	\hfill
	Ученик:

	\vspace*{0.3cm}
	Марко Савић
	\hfill
	\@author
	}

	\vspace*{\fill}
	{\large Нови Сад, {\@date}.}
	\makeatother
\end{titlepage}

\section*{Предговор}
Овај рад се бави концепцијом и имплементацијом Ћирилисп програмског језика, минималистичког Лисп дијалекта осмишљеног да се користи на српском језику са ћириличком тастатуром.

Моја главна мотивација за овај рад јесте моје опште интересовање за дизајн и имплементацију програмских језика и наручито за дизајн дијалеката Лиспа. Као додатни својство језика одлучио сам да он буде дефинисан тако да су све његове стандардне форме (као и симболи генерално) описани на српској ћирилици, било ми је интересантно да се уз посао дизајна и имплементације програмског језика, такође (додуше не на претерано захтеван начин) бавим радом на локализацији софтвера.

\newpage
\tableofcontents
\newpage 

\section*{Увод\label{Uvod}}
\addcontentsline{toc}{section}{\protect\numberline{}Увод}
Ћирилисп је програмски језик, дијалекат Лиспа, осмишљен да се његов код пише на српској ћирилици. Има многа својства која би се очекивала од типичног Лисп дијалекта, укључујући типичне методе манипулације листама, комплетан (мада не хигијенски) макро систем, којим се може проширити синтакса језика за жељену употребу.

У сврху овог матурског рада, направљена је имплементација овог језика, као интерпретер написан у C-у, који између осталог може покренути код у датом језику као извршиву датотеку у било којој Посикс сагласној Љусци.
\newpage

\section{Кратак опис Лисп програмског језика}
Лисп је један од најстаријих програмских језика који је и данас у општој примени. Познат је по својој једноставној и једноличној синтакси, аутоматским системима за управљање меморијом, и моћним макроима који могу проширити његову већ изражајну синтаксу. Управо због своје екстензибилности, и изражајне моћи основа његовог дизајна, Лисп је један од ретких програмских језика који поседује сопствене дијалекте. Постоје стотине Лисп дијалеката, сваки са другачијом сврхом и философијом дизајна. Од више функционалних и декларативних, као Ским или Кложур, до практичнијих и опште-наменских, као Комон Лисп и, па и обласно-специфичних као Емакс-Лисп.
\subsection{Листе и функције}
Лисп је акроним за List Processing (пређивање листа) што указује на најосновнију, и најбитнију сложену структуру података која је доступна у овом језику, наиме листа. Листа се гради помоћу конс ћелија, структура које поседују два показивача (или два сама објекта у зависности од имплементације) који могу показати на било какав податак. Ови показивачи се респективно зову CAR и CDR (Contents of the address part of the register number и Contents of the decrement part of the register number). Листа се уз њих дефинише као скуп конс ћелија где CAR сваке показује на одређени податак, члан листе, а CDR показује на следећу конс ћелију која чини исто као и претходна, све до задње, која показује на посебни тип објекта најчешће зван нил објекат.\parencite{recursive}
\begin{figure}[h!]
	\includegraphics[width=\linewidth]{list.png}
	\caption{Приказ листе}
	\label{list1}
\end{figure}

Слика \label{list1} приказује листу која би се текстуално могла представити као симболички израз \texttt{(1 . (2 . (3 . ())))} или у скраћеној нотацији симболичких израза, \texttt{(1 2 3)}.

Лиспова синтакса је хомоиконична, другим речима он није само способан да прерађује листе, већ је и сам његов код сачињен од листа. Ово чини саму синтаксу језика довољно једноставном да се опише једним примером позива функцијем, који у Лиспу увек бивају следећег облика: \texttt{(функција арг1 арг2 арг3 ...)}, овако изгледа готово свака операција или функција извршена у самом језику, то наравно значи да су неки, нама познати изрази као \texttt{1 / (3 + 4 * 5)}, претворени у, на први изглед, необичне \texttt{(/ 1 (+ 3 (* 4 5)))}. Међутим, управо та чудна униформност читаве синтаксе која није присутна у већини других програмских језика је управо оно што Лиспу омогућава толику изражајну моћ.
\newpage
\renewcommand\refname{Литература}
\printbibliography
\end{document}
