-
Notifications
You must be signed in to change notification settings - Fork 2
/
1.6-scheme_mutation.tex
97 lines (83 loc) · 3.26 KB
/
1.6-scheme_mutation.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
\documentclass[alsotrans,beameroptions={aspectratio=169}]{beamerswitch}
\usepackage{fprog}
\title{Мутиращи операции}
\date{6 ноември 2024 г.}
\lstset{language=Scheme}
\begin{document}
\begin{frame}
\titlepage
\end{frame}
\begin{frame}
\frametitle{Мутиращи операции в Scheme}
Мутиращите операции в Scheme позволяват въвеждането на \alert{странични ефекти}.\\[4ex]
\pause
\textbf{Преглед:}
\begin{itemize}[<+->]
\item \lst{set!} --- промяна на оценка, свързана със символ
\item \lst{set-car!}, \lst{set-cdr!} --- промяна на компоненти на точкови двойки
\item \lst{begin} --- последователност от действия
\item \lst{open-input-file}, \lst{open-output-file} --- работа с файлове
\item \lst{read}, \lst{write}, \lst{display} --- вход и изход
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{Промяна на оценка, свързана със символ (\tt{set!})}
\begin{itemize}[<+->]
\item \tta{(set!} <символ> <израз>\tta)
\item Търси се <символ> във веригата от среди
\begin{itemize}
\item Ако бъде намерен, свързва се с оценката на <израз>
\item В противен случай --- \alert{грешка!}
\end{itemize}
\item Примери:
\begin{itemize}
\item \lst{(define a 2)}\hspace{3em}\evalsto{a}2
\item \lst{(set! a 5)}\hspace{4em}\evalsto{a}5
\item \lst{(define (sum x)}\only<-.>{\tt{ (begin }}\lst{ (set! a (+ a x)) a}\only<-.>{\tt)}\tt)\pause
\item \evalsto{(sum 10)}{15}
\item \evalsto{(sum 10)}{25}
\item \alert{губи се референциалната прозрачност!}
\end{itemize}
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{Пример: текуща сметка}
\begin{lstlisting}
(define (make-account sum)
(lambda (amount)
(if (< (+ amount sum) 0)
(display "Insufficient funds!\n")
(set! sum (+ sum amount)))
sum))
\end{lstlisting}
\onslide<+->
\begin{itemize}[<+->]
\item \lst{(define account (make-account 100))}
\item \evalsto{(account 20)}{120}
\item \evalsto{(account -50)}{70}
\item \evalstos{\tt{(account -150)}}{
\begin{tabular}[t]l
\tt{"Insufficient funds"}\\
\tt{70}
\end{tabular}}
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{Промяна на компоненти (\tt{set-car!}, \tt{set-cdr!})}
\begin{itemize}[<+->]
\item \tta{(set-car!} <двойка> <израз>\tta)
\item<.-> \tta{(set-cdr!} <двойка> <израз>\tta)
\item Съответният компонент на <двойка> се променя да сочи към оценката на <израз>
\item \textbf{Примери:}
\begin{itemize}
\item \lst{(define p (cons (cons 1 2) (cons 3 4)))}
\item \lst{(set-car! p 7)}
\item \evalstop{p}{(7 . (3 . 4))}
\item \lst{(set-cdr! p '(5 3))}
\item \evalstop{p}{(7 5 3)}
\item \tt{(set-cdr! (cdr p) p)}
\item \evalstop{p}{(7 5 7 5 7 5 ...)}
\end{itemize}
\end{itemize}
\end{frame}
\end{document}