diff --git a/doc/list.png b/doc/list.png new file mode 100644 index 0000000..e148d9e Binary files /dev/null and b/doc/list.png differ diff --git a/doc/lit.bib b/doc/lit.bib index 50bfbd3..0a669ba 100644 --- a/doc/lit.bib +++ b/doc/lit.bib @@ -6,7 +6,7 @@ } @article{mccarthy96, - author = {Mccarthy, John}, + author = {McCarthy, John}, year = {1996}, month = {08}, pages = {}, @@ -60,7 +60,7 @@ publisher = "MIT Press", } -@article{McCarthy:1960:RFS:367177.367199, +@article{recursive, author = {McCarthy, John}, title = {Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I}, journal = {Commun. ACM}, diff --git a/doc/rad.tex b/doc/rad.tex index 16bb2a3..db1ee9f 100644 --- a/doc/rad.tex +++ b/doc/rad.tex @@ -1,11 +1,13 @@ \documentclass[a4paper]{article} +% biber \usepackage[T2A]{fontenc} \usepackage[utf8]{inputenc} -\usepackage[serbian]{babel} +\usepackage[serbianc]{babel} \usepackage{multicol} \usepackage{textcase} \usepackage{tocloft} +\usepackage{graphicx} \usepackage[backend=biber]{biblatex} \addbibresource{lit.bib} @@ -65,11 +67,19 @@ \newpage \section{Кратак опис Лисп програмског језика} -Лисп је један од најстаријих програмских језика који је и данас у општој примени, једино надмашен од стране Фортрана. Познат је по својој једноставној и једноличној синтакси, аутоматским системима за управљање меморијом, и моћним макроима који могу проширити његову већ изражајну синтаксу. Управо због своје екстензибилности, и изражајне моћи основа његовог дизајна, Лисп је један од ретких програмских језика који поседује сопствене дијалекте. Постоје стотине Лисп дијалеката, сваки са другачијом сврхом и философијом дизајна. Од више функционалних и декларативних, као Ским или Кложур, до практичнијих и опште-наменских, као Комон Лисп и, па и обласно-специфичних као Емакс-Лисп. -\subsection{Историја} -Лисп је првобитно осмишљен од стране Џона Мекартија, при крају педесетих, за сврхе изтраживања у пољу вештачке интелигенције \textcite{mccarthy81}, -\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 показује на следећу конс ћелију која чини исто као и претходна, све до задње, која показује на посебни тип објекта најчешће зван нил објекат. -%ovde ubaciti fotku +Лисп је један од најстаријих програмских језика који је и данас у општој примени. Познат је по својој једноставној и једноличној синтакси, аутоматским системима за управљање меморијом, и моћним макроима који могу проширити његову већ изражајну синтаксу. Управо због своје екстензибилности, и изражајне моћи основа његовог дизајна, Лисп је један од ретких програмских језика који поседује сопствене дијалекте. Постоје стотине Лисп дијалеката, сваки са другачијом сврхом и философијом дизајна. Од више функционалних и декларативних, као Ским или Кложур, до практичнијих и опште-наменских, као Комон Лисп и, па и обласно-специфичних као Емакс-Лисп. +\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} diff --git a/инит.ћ b/инит.ћ index d9a11c8..2a1c450 100644 --- a/инит.ћ +++ b/инит.ћ @@ -89,5 +89,37 @@ (опиши ламбда-израз (надовежи (листа 'ламбда имена) тело)) (конс ламбда-израз вредности)))) +(опиши (макс . аргументи) + (опиши (листа-бројева? листа) + (примени и (мапирај број? листа))) + (услов + ((= 0 (дужина аргументи)) + (баци "Функција \"макс\" захтева барем један\ + аргумент")) + ((није (број? (сар аргументи))) (баци "Аргументи дати функцији\ + \"макс\" нису бројеви")) + ((и (= 1 (дужина аргументи)) (број? (сар аргументи))) + (сар аргументи)) + (#и + (опиши остатак (примени макс (сдр аргументи))) + (ако (> остатак (сар аргументи)) + остатак (сар аргументи))))) + +(опиши (мин . аргументи) + (опиши (листа-бројева? листа) + (примени и (мапирај број? листа))) + (услов + ((= 0 (дужина аргументи)) + (баци "Функција \"макс\" захтева барем један\ + аргумент")) + ((није (број? (сар аргументи))) (баци "Аргументи дати функцији\ + \"макс\" нису бројеви")) + ((и (= 1 (дужина аргументи)) (број? (сар аргументи))) + (сар аргументи)) + (#и + (опиши остатак (примени мин (сдр аргументи))) + (ако (< остатак (сар аргументи)) + остатак (сар аргументи))))) + (опиши (цео-број? џ) (= (именилац (нетачно->тачно џ)) 1))