Dopolnitev vaj 1

main
Jurij Podgoršek 2024-05-29 18:39:50 +02:00
parent b824fcdc5d
commit 33e77b3439
2 changed files with 668 additions and 63 deletions

View File

@ -3,13 +3,13 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<!-- 2024-04-21 ned 17:35 -->
<!-- 2024-05-21 Tue 01:52 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Zapiski #1 srečanja programerskega bralnega krožka SICP</title>
<meta name="author" content="Jurij" />
<meta name="generator" content="Org Mode" />
<style>
<style type="text/css">
#content { max-width: 60em; margin: auto; }
.title { text-align: center;
margin-bottom: .2em; }
@ -193,18 +193,234 @@
{ background-color: #ffff00; color: #000000; font-weight: bold; }
.org-svg { }
</style>
<style type="text/css">
#content { max-width: 60em; margin: auto; }
.title { text-align: center;
margin-bottom: .2em; }
.subtitle { text-align: center;
font-size: medium;
font-weight: bold;
margin-top:0; }
.todo { font-family: monospace; color: red; }
.done { font-family: monospace; color: green; }
.priority { font-family: monospace; color: orange; }
.tag { background-color: #eee; font-family: monospace;
padding: 2px; font-size: 80%; font-weight: normal; }
.timestamp { color: #bebebe; }
.timestamp-kwd { color: #5f9ea0; }
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
.underline { text-decoration: underline; }
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
p.verse { margin-left: 3%; }
pre {
border: 1px solid #e6e6e6;
border-radius: 3px;
background-color: #f2f2f2;
padding: 8pt;
font-family: monospace;
overflow: auto;
margin: 1.2em;
}
pre.src {
position: relative;
overflow: auto;
}
pre.src:before {
display: none;
position: absolute;
top: -8px;
right: 12px;
padding: 3px;
color: #555;
background-color: #f2f2f299;
}
pre.src:hover:before { display: inline; margin-top: 14px;}
/* Languages per Org manual */
pre.src-asymptote:before { content: 'Asymptote'; }
pre.src-awk:before { content: 'Awk'; }
pre.src-authinfo::before { content: 'Authinfo'; }
pre.src-C:before { content: 'C'; }
/* pre.src-C++ doesn't work in CSS */
pre.src-clojure:before { content: 'Clojure'; }
pre.src-css:before { content: 'CSS'; }
pre.src-D:before { content: 'D'; }
pre.src-ditaa:before { content: 'ditaa'; }
pre.src-dot:before { content: 'Graphviz'; }
pre.src-calc:before { content: 'Emacs Calc'; }
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
pre.src-fortran:before { content: 'Fortran'; }
pre.src-gnuplot:before { content: 'gnuplot'; }
pre.src-haskell:before { content: 'Haskell'; }
pre.src-hledger:before { content: 'hledger'; }
pre.src-java:before { content: 'Java'; }
pre.src-js:before { content: 'Javascript'; }
pre.src-latex:before { content: 'LaTeX'; }
pre.src-ledger:before { content: 'Ledger'; }
pre.src-lisp:before { content: 'Lisp'; }
pre.src-lilypond:before { content: 'Lilypond'; }
pre.src-lua:before { content: 'Lua'; }
pre.src-matlab:before { content: 'MATLAB'; }
pre.src-mscgen:before { content: 'Mscgen'; }
pre.src-ocaml:before { content: 'Objective Caml'; }
pre.src-octave:before { content: 'Octave'; }
pre.src-org:before { content: 'Org mode'; }
pre.src-oz:before { content: 'OZ'; }
pre.src-plantuml:before { content: 'Plantuml'; }
pre.src-processing:before { content: 'Processing.js'; }
pre.src-python:before { content: 'Python'; }
pre.src-R:before { content: 'R'; }
pre.src-ruby:before { content: 'Ruby'; }
pre.src-sass:before { content: 'Sass'; }
pre.src-scheme:before { content: 'Scheme'; }
pre.src-screen:before { content: 'Gnu Screen'; }
pre.src-sed:before { content: 'Sed'; }
pre.src-sh:before { content: 'shell'; }
pre.src-sql:before { content: 'SQL'; }
pre.src-sqlite:before { content: 'SQLite'; }
/* additional languages in org.el's org-babel-load-languages alist */
pre.src-forth:before { content: 'Forth'; }
pre.src-io:before { content: 'IO'; }
pre.src-J:before { content: 'J'; }
pre.src-makefile:before { content: 'Makefile'; }
pre.src-maxima:before { content: 'Maxima'; }
pre.src-perl:before { content: 'Perl'; }
pre.src-picolisp:before { content: 'Pico Lisp'; }
pre.src-scala:before { content: 'Scala'; }
pre.src-shell:before { content: 'Shell Script'; }
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
/* additional language identifiers per "defun org-babel-execute"
in ob-*.el */
pre.src-cpp:before { content: 'C++'; }
pre.src-abc:before { content: 'ABC'; }
pre.src-coq:before { content: 'Coq'; }
pre.src-groovy:before { content: 'Groovy'; }
/* additional language identifiers from org-babel-shell-names in
ob-shell.el: ob-shell is the only babel language using a lambda to put
the execution function name together. */
pre.src-bash:before { content: 'bash'; }
pre.src-csh:before { content: 'csh'; }
pre.src-ash:before { content: 'ash'; }
pre.src-dash:before { content: 'dash'; }
pre.src-ksh:before { content: 'ksh'; }
pre.src-mksh:before { content: 'mksh'; }
pre.src-posh:before { content: 'posh'; }
/* Additional Emacs modes also supported by the LaTeX listings package */
pre.src-ada:before { content: 'Ada'; }
pre.src-asm:before { content: 'Assembler'; }
pre.src-caml:before { content: 'Caml'; }
pre.src-delphi:before { content: 'Delphi'; }
pre.src-html:before { content: 'HTML'; }
pre.src-idl:before { content: 'IDL'; }
pre.src-mercury:before { content: 'Mercury'; }
pre.src-metapost:before { content: 'MetaPost'; }
pre.src-modula-2:before { content: 'Modula-2'; }
pre.src-pascal:before { content: 'Pascal'; }
pre.src-ps:before { content: 'PostScript'; }
pre.src-prolog:before { content: 'Prolog'; }
pre.src-simula:before { content: 'Simula'; }
pre.src-tcl:before { content: 'tcl'; }
pre.src-tex:before { content: 'TeX'; }
pre.src-plain-tex:before { content: 'Plain TeX'; }
pre.src-verilog:before { content: 'Verilog'; }
pre.src-vhdl:before { content: 'VHDL'; }
pre.src-xml:before { content: 'XML'; }
pre.src-nxml:before { content: 'XML'; }
/* add a generic configuration mode; LaTeX export needs an additional
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
pre.src-conf:before { content: 'Configuration File'; }
table { border-collapse:collapse; }
caption.t-above { caption-side: top; }
caption.t-bottom { caption-side: bottom; }
td, th { vertical-align:top; }
th.org-right { text-align: center; }
th.org-left { text-align: center; }
th.org-center { text-align: center; }
td.org-right { text-align: right; }
td.org-left { text-align: left; }
td.org-center { text-align: center; }
dt { font-weight: bold; }
.footpara { display: inline; }
.footdef { margin-bottom: 1em; }
.figure { padding: 1em; }
.figure p { text-align: center; }
.equation-container {
display: table;
text-align: center;
width: 100%;
}
.equation {
vertical-align: middle;
}
.equation-label {
display: table-cell;
text-align: right;
vertical-align: middle;
}
.inlinetask {
padding: 10px;
border: 2px solid gray;
margin: 10px;
background: #ffffcc;
}
#org-div-home-and-up
{ text-align: right; font-size: 70%; white-space: nowrap; }
textarea { overflow-x: auto; }
.linenr { font-size: smaller }
.code-highlighted { background-color: #ffff00; }
.org-info-js_info-navigation { border-style: none; }
#org-info-js_console-label
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
.org-info-js_search-highlight
{ background-color: #ffff00; color: #000000; font-weight: bold; }
.org-svg { }
</style>
<script>
window.MathJax = {
tex: {
ams: {
multlineWidth: '85%'
},
tags: 'ams',
tagSide: 'right',
tagIndent: '.8em'
},
chtml: {
scale: 1.0,
displayAlign: 'center',
displayIndent: '0em'
},
svg: {
scale: 1.0,
displayAlign: 'center',
displayIndent: '0em'
},
output: {
font: 'mathjax-modern',
displayOverflow: 'overflow'
}
};
</script>
<script
id="MathJax-script"
async
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js">
</script>
</head>
<body>
<div id="content" class="content">
<h1 class="title">Zapiski #1 srečanja programerskega bralnega krožka SICP</h1>
<div id="outline-container-org42dee3b" class="outline-2">
<h2 id="org42dee3b">Zanimivi izseki</h2>
<div class="outline-text-2" id="text-org42dee3b">
<div id="outline-container-org7918841" class="outline-2">
<h2 id="org7918841">Zanimivi izseki</h2>
<div class="outline-text-2" id="text-org7918841">
</div>
<div id="outline-container-orgdf32ea0" class="outline-3">
<h3 id="orgdf32ea0">str. 9</h3>
<div class="outline-text-3" id="text-orgdf32ea0">
<div id="outline-container-orge5ee826" class="outline-3">
<h3 id="orge5ee826">str. 9</h3>
<div class="outline-text-3" id="text-orge5ee826">
<blockquote>
<p>
Every reader should ask himself periodically "Toward what end, toward what end?" — but do not ask it too often lest you pass up the fun of programming for the constipation of bittersweet philosophy.
@ -218,9 +434,10 @@ Lisp is a survivor, having been in use for about a quarter of a century.
</blockquote>
</div>
</div>
<div id="outline-container-org8373b18" class="outline-3">
<h3 id="org8373b18">str. 11</h3>
<div class="outline-text-3" id="text-org8373b18">
<div id="outline-container-orgfc4618a" class="outline-3">
<h3 id="orgfc4618a">str. 11</h3>
<div class="outline-text-3" id="text-orgfc4618a">
<blockquote>
<p>
It is better to have 100 functions operate on one data structure than to have 10 functions operate on 10 data structures.
@ -228,9 +445,10 @@ It is better to have 100 functions operate on one data structure than to have 10
</blockquote>
</div>
</div>
<div id="outline-container-org3dac309" class="outline-3">
<h3 id="org3dac309">str. 18</h3>
<div class="outline-text-3" id="text-org3dac309">
<div id="outline-container-org63a72bc" class="outline-3">
<h3 id="org63a72bc">str. 18</h3>
<div class="outline-text-3" id="text-org63a72bc">
<blockquote>
<p>
Thus, programs must be written for people to read, and only incidentally for machines to execute.
@ -238,9 +456,10 @@ Thus, programs must be written for people to read, and only incidentally for mac
</blockquote>
</div>
</div>
<div id="outline-container-org7994660" class="outline-3">
<h3 id="org7994660">str. 19</h3>
<div class="outline-text-3" id="text-org7994660">
<div id="outline-container-org049ac46" class="outline-3">
<h3 id="org049ac46">str. 19</h3>
<div class="outline-text-3" id="text-org049ac46">
<blockquote>
<p>
Underlying our approach to this subject is our conviction that "computer science" is not a science and that its significance has little to do with computers.
@ -248,9 +467,10 @@ Underlying our approach to this subject is our conviction that "computer science
</blockquote>
</div>
</div>
<div id="outline-container-org3d45fa2" class="outline-3">
<h3 id="org3d45fa2">str. 27</h3>
<div class="outline-text-3" id="text-org3d45fa2">
<div id="outline-container-org49a771f" class="outline-3">
<h3 id="org49a771f">str. 27</h3>
<div class="outline-text-3" id="text-org49a771f">
<blockquote>
<p>
Finally, we would like to acknowledge the support of the organizations that have encouraged this work over the years, including support from Hewlett-Packard, made possible by Ira Goldstein and Joel Birnbaum, and support from DARPA, made possible by Bob Kahn.
@ -271,31 +491,141 @@ Preko očeta v sorodu s fizikom Hermanom Kahnom, ki je napisal knjigo o tem kako
</div>
</div>
<div id="outline-container-org0861788" class="outline-3">
<h3 id="org0861788">str. 77</h3>
<div class="outline-text-3" id="text-org0861788">
<div id="outline-container-org6a8639c" class="outline-3">
<h3 id="org6a8639c">str. 77</h3>
<div class="outline-text-3" id="text-org6a8639c">
<p>
Stoy 1977
</p>
</div>
</div>
</div>
<div id="outline-container-orgfcfaeb8" class="outline-2">
<h2 id="orgfcfaeb8">Vaje</h2>
<div class="outline-text-2" id="text-orgfcfaeb8">
<div id="outline-container-org9007674" class="outline-2">
<h2 id="org9007674">Vaje</h2>
<div class="outline-text-2" id="text-org9007674">
</div>
<div id="outline-container-org9ddb5fa" class="outline-3">
<h3 id="org9ddb5fa">1.1 Kaj vrnejo izrazi?</h3>
<div id="outline-container-orgcf0051d" class="outline-3">
<h3 id="orgcf0051d">1.1 Kaj vrnejo izrazi?</h3>
<div class="outline-text-3" id="text-orgcf0051d">
<div class="org-src-container">
<pre class="src src-scheme"><span style="color: #458588;">(</span>+ 5 3 4<span style="color: #458588;">)</span>
</pre>
</div>
<div id="outline-container-org77dfe73" class="outline-3">
<h3 id="org77dfe73">1.2 Pretvori izraz v prefix obliko</h3>
<div class="outline-text-3" id="text-org77dfe73">
<p>
10
</p>
<div class="org-src-container">
<pre class="src src-scheme"><span style="color: #458588;">(</span>- 9 1<span style="color: #458588;">)</span>
</pre>
</div>
<p>
8
</p>
<div class="org-src-container">
<pre class="src src-scheme"><span style="color: #458588;">(</span>/ 6 2<span style="color: #458588;">)</span>
</pre>
</div>
<p>
3
</p>
<div class="org-src-container">
<pre class="src src-scheme"><span style="color: #458588;">(</span>+ <span style="color: #b16286;">(</span>* 2 4<span style="color: #b16286;">)</span> <span style="color: #b16286;">(</span>- 4 6<span style="color: #b16286;">)</span><span style="color: #458588;">)</span>
</pre>
</div>
<p>
6
</p>
<div class="org-src-container">
<pre class="src src-scheme"><span style="color: #458588;">(</span><span style="color: #fb4933;">define</span> <span style="color: #fabd2f;">a</span> 3<span style="color: #458588;">)</span>
</pre>
</div>
<p>
#nil
</p>
<div class="org-src-container">
<pre class="src src-scheme"><span style="color: #458588;">(</span><span style="color: #fb4933;">define</span> <span style="color: #fabd2f;">b</span> <span style="color: #b16286;">(</span>+ a 1<span style="color: #b16286;">)</span><span style="color: #458588;">)</span>
</pre>
</div>
<p>
#nil
</p>
<div class="org-src-container">
<pre class="src src-scheme"><span style="color: #458588;">(</span>+ a b <span style="color: #b16286;">(</span>* a b<span style="color: #b16286;">)</span><span style="color: #458588;">)</span>
</pre>
</div>
<p>
19
</p>
<div class="org-src-container">
<pre class="src src-scheme"><span style="color: #458588;">(</span>= a b<span style="color: #458588;">)</span>
</pre>
</div>
<p>
#f
</p>
<div class="org-src-container">
<pre class="src src-scheme"><span style="color: #458588;">(</span><span style="color: #fb4933;">if</span> <span style="color: #b16286;">(</span><span style="color: #fb4933;">and</span> <span style="color: #8ec07c;">(</span>&gt; b a<span style="color: #8ec07c;">)</span> <span style="color: #8ec07c;">(</span>&lt; b <span style="color: #d65d0e;">(</span>* a b<span style="color: #d65d0e;">)</span><span style="color: #8ec07c;">)</span><span style="color: #b16286;">)</span>
b
a<span style="color: #458588;">)</span>
</pre>
</div>
<p>
4
</p>
<div class="org-src-container">
<pre class="src src-scheme"><span style="color: #458588;">(</span><span style="color: #fb4933;">cond</span> <span style="color: #b16286;">(</span><span style="color: #8ec07c;">(</span>= a 4<span style="color: #8ec07c;">)</span> 6<span style="color: #b16286;">)</span>
<span style="color: #b16286;">(</span><span style="color: #8ec07c;">(</span>= b 4<span style="color: #8ec07c;">)</span> <span style="color: #8ec07c;">(</span>+ 6 7 a<span style="color: #8ec07c;">)</span><span style="color: #b16286;">)</span>
<span style="color: #b16286;">(</span><span style="color: #fb4933;">else</span> 25<span style="color: #b16286;">)</span><span style="color: #458588;">)</span>
</pre>
</div>
<p>
16
</p>
<div class="org-src-container">
<pre class="src src-scheme"><span style="color: #458588;">(</span>+ 2 <span style="color: #b16286;">(</span><span style="color: #fb4933;">if</span> <span style="color: #8ec07c;">(</span>&gt; b a<span style="color: #8ec07c;">)</span> b a<span style="color: #b16286;">)</span><span style="color: #458588;">)</span>
</pre>
</div>
<p>
6
</p>
<div class="org-src-container">
<pre class="src src-scheme"><span style="color: #458588;">(</span>* <span style="color: #b16286;">(</span><span style="color: #fb4933;">cond</span> <span style="color: #8ec07c;">(</span><span style="color: #d65d0e;">(</span>&gt; a b<span style="color: #d65d0e;">)</span> a<span style="color: #8ec07c;">)</span>
<span style="color: #8ec07c;">(</span><span style="color: #d65d0e;">(</span>&lt; a b<span style="color: #d65d0e;">)</span> b<span style="color: #8ec07c;">)</span>
<span style="color: #8ec07c;">(</span><span style="color: #fb4933;">else</span> -1<span style="color: #8ec07c;">)</span><span style="color: #b16286;">)</span>
<span style="color: #b16286;">(</span>+ a 1<span style="color: #b16286;">)</span><span style="color: #458588;">)</span>
</pre>
</div>
<p>
16
</p>
</div>
</div>
<div id="outline-container-orgd95ec59" class="outline-3">
<h3 id="orgd95ec59">1.2 Pretvori izraz v prefix obliko</h3>
<div class="outline-text-3" id="text-orgd95ec59">
\begin{equation}
\frac{5+4+(2-(3-(6+\frac{4}{5}))) }{3(6-2)(2-7)}
\end{equation}
<div class="org-src-container">
<pre class="src src-scheme"><span style="color: #458588;">(</span>/ <span style="color: #b16286;">(</span>+ 5 4
<span style="color: #8ec07c;">(</span>- 2
<span style="color: #d65d0e;">(</span>- 3
<span style="color: #458588;">(</span>+ 6
1/3<span style="color: #458588;">)</span><span style="color: #d65d0e;">)</span><span style="color: #8ec07c;">)</span><span style="color: #b16286;">)</span>
4/5<span style="color: #458588;">)</span><span style="color: #d65d0e;">)</span><span style="color: #8ec07c;">)</span><span style="color: #b16286;">)</span>
<span style="color: #b16286;">(</span>* 3
<span style="color: #8ec07c;">(</span>- 6 2<span style="color: #8ec07c;">)</span>
<span style="color: #8ec07c;">(</span>- 2 7<span style="color: #8ec07c;">)</span><span style="color: #b16286;">)</span><span style="color: #458588;">)</span>
@ -303,13 +633,14 @@ Stoy 1977
</div>
<pre class="example">
-43/180
-37/150
</pre>
</div>
</div>
<div id="outline-container-org30e4913" class="outline-3">
<h3 id="org30e4913">1.3 procedura, ki prejme 3 argumente in vrne vsoto kvadratov vecjih dveh</h3>
<div class="outline-text-3" id="text-org30e4913">
<div id="outline-container-org40fcfc0" class="outline-3">
<h3 id="org40fcfc0">1.3 določi postopek, ki prejme 3 števila kot argumente in vrne vsoto kvadratov večjih dveh</h3>
<div class="outline-text-3" id="text-org40fcfc0">
<div class="org-src-container">
<pre class="src src-scheme"><span style="color: #458588;">(</span><span style="color: #fb4933;">define</span> <span style="color: #b16286;">(</span><span style="color: #fabd2f;">vsota-vecjih-kvadratov</span> a b c<span style="color: #b16286;">)</span>
<span style="color: #b16286;">(</span><span style="color: #fb4933;">cond</span> <span style="color: #8ec07c;">(</span><span style="color: #d65d0e;">(</span>&lt;= a b c<span style="color: #d65d0e;">)</span> <span style="color: #d65d0e;">(</span>+ <span style="color: #458588;">(</span>* b b<span style="color: #458588;">)</span> <span style="color: #458588;">(</span>* c c<span style="color: #458588;">)</span><span style="color: #d65d0e;">)</span><span style="color: #8ec07c;">)</span>
@ -328,7 +659,7 @@ Stoy 1977
<span style="color: #d65d0e;">(</span>+kvadrat b c<span style="color: #d65d0e;">)</span><span style="color: #8ec07c;">)</span><span style="color: #b16286;">)</span><span style="color: #458588;">)</span>
<span style="color: #458588;">(</span>list
'<span style="color: #b16286;">(</span><span style="color: #b8bb26;">"Pricakovano"</span> 85 41 164 89<span style="color: #b16286;">)</span>
'<span style="color: #b16286;">(</span><span style="color: #b8bb26;">"Pri&#269;akovano"</span> 85 41 164 89<span style="color: #b16286;">)</span>
<span style="color: #b16286;">(</span>list <span style="color: #b8bb26;">"Funkcija1"</span>
<span style="color: #8ec07c;">(</span>vsota-vecjih-kvadratov 6 1 7<span style="color: #8ec07c;">)</span>
@ -360,7 +691,7 @@ Stoy 1977
</colgroup>
<tbody>
<tr>
<td class="org-left">Pricakovano</td>
<td class="org-left">Pričakovano</td>
<td class="org-right">85</td>
<td class="org-right">41</td>
<td class="org-right">164</td>
@ -387,14 +718,155 @@ Stoy 1977
</div>
</div>
<div id="outline-container-org9c2a7b0" class="outline-3">
<h3 id="org9c2a7b0">1.4</h3>
<div id="outline-container-orgc0b2345" class="outline-3">
<h3 id="orgc0b2345">1.4 Opis procedure</h3>
<div class="outline-text-3" id="text-orgc0b2345">
<div class="org-src-container">
<pre class="src src-scheme"><span style="color: #458588;">(</span><span style="color: #fb4933;">define</span> <span style="color: #b16286;">(</span><span style="color: #fabd2f;">a-plus-abs-b</span> a b<span style="color: #b16286;">)</span>
<span style="color: #b16286;">(</span><span style="color: #8ec07c;">(</span><span style="color: #fb4933;">if</span> <span style="color: #d65d0e;">(</span>&gt; b 0<span style="color: #d65d0e;">)</span> + -<span style="color: #8ec07c;">)</span> a b<span style="color: #b16286;">)</span><span style="color: #458588;">)</span>
</pre>
</div>
<p>
Izraz <code>if</code> vrne funkcijo <code>+</code> ali <code>-</code> , glede na to, ali je argument <code>b</code> večji ali manjši od 0.
</p>
<p>
Če je <code>b</code> manjši od 0, ga odšteje od <code>a</code>, sicer pa ga prišeje. Zato je rezultat funkcije ekvivalenten vsoti <code>a</code> in absolutnega <code>b</code>.
</p>
</div>
</div>
<div id="outline-container-orge0dc66d" class="outline-3">
<h3 id="orge0dc66d">1.5 Aplikativni red in normalni red evalvacije</h3>
<div class="outline-text-3" id="text-orge0dc66d">
<div class="org-src-container">
<pre class="src src-scheme"><span style="color: #458588;">(</span><span style="color: #fb4933;">define</span> <span style="color: #b16286;">(</span><span style="color: #fabd2f;">p</span><span style="color: #b16286;">)</span> <span style="color: #b16286;">(</span>p<span style="color: #b16286;">)</span><span style="color: #458588;">)</span>
<span style="color: #458588;">(</span><span style="color: #fb4933;">define</span> <span style="color: #b16286;">(</span><span style="color: #fabd2f;">test</span> x y<span style="color: #b16286;">)</span>
<span style="color: #b16286;">(</span><span style="color: #fb4933;">if</span> <span style="color: #8ec07c;">(</span>= x 0<span style="color: #8ec07c;">)</span>
0
y<span style="color: #b16286;">)</span><span style="color: #458588;">)</span>
<span style="color: #7c6f64;">;; </span><span style="color: #7c6f64;">Evalvira:</span>
<span style="color: #458588;">(</span>test 0 <span style="color: #b16286;">(</span>p<span style="color: #b16286;">)</span><span style="color: #458588;">)</span>
</pre>
</div>
<p>
Če interpreter deluje po aplikativnem zaporedju, bo najprej evalviral argumente. Ker je drugi argument postopek, ki v neskončnost vrača vrednost klica samega sebe, se bo program zaciklal oz. zmrznil.
</p>
<p>
Če pa interpreter deluje po normalnem zaporedju, bo pa začel izvajat postopek pred evalvacijo argumentov, le-te pa šele ko jih potrebuje. Tako bo, <code>if</code> stavek prepoznal ekvivalenco <code>x</code> in <code>0</code> ter vrnil <code>0</code>.
</p>
<p>
Klic takšne funkcije torej preveri ali interpreter deluje po aplikativnem ali normalnem zaporedju.
</p>
<p>
Guile scheme deluje po aplikativnem redu (in se zacikla). Normalni red pa lahko "simuliramo", če proceduro definiramo kot macro, z <code>define-case</code>. Klic macroja se ne zacikla.
</p>
<div class="org-src-container">
<pre class="src src-scheme"><span style="color: #458588;">(</span><span style="color: #fb4933;">define-macro</span> <span style="color: #b16286;">(</span><span style="color: #83a598;">test-m</span> x y<span style="color: #b16286;">)</span>
<span style="color: #b16286;">(</span><span style="color: #fb4933;">if</span> <span style="color: #8ec07c;">(</span>= x 0<span style="color: #8ec07c;">)</span>
0
y<span style="color: #b16286;">)</span><span style="color: #458588;">)</span>
<span style="color: #458588;">(</span>test-m 0 <span style="color: #b16286;">(</span>p<span style="color: #b16286;">)</span><span style="color: #458588;">)</span>
</pre>
</div>
<pre class="example">
0
</pre>
</div>
</div>
<div id="outline-container-orgba23aaa" class="outline-3">
<h3 id="orgba23aaa">1.6 Novi if</h3>
<div class="outline-text-3" id="text-orgba23aaa">
<p>
Imamo nov <code>if</code>, <code>new-if</code>.
</p>
<div class="org-src-container">
<pre class="src src-scheme"><span style="color: #458588;">(</span><span style="color: #fb4933;">define</span> <span style="color: #b16286;">(</span><span style="color: #fabd2f;">new-if</span> predicate then-clause else-clause<span style="color: #b16286;">)</span>
<span style="color: #b16286;">(</span><span style="color: #fb4933;">cond</span> <span style="color: #8ec07c;">(</span>predicate then-clause<span style="color: #8ec07c;">)</span>
<span style="color: #8ec07c;">(</span><span style="color: #fb4933;">else</span> else-clause<span style="color: #8ec07c;">)</span><span style="color: #b16286;">)</span><span style="color: #458588;">)</span>
</pre>
</div>
<p>
Kaj se zgodi, če ga uporabimo za računanje kvadratnih korenov?
</p>
<div class="org-src-container">
<pre class="src src-scheme"><span style="color: #458588;">(</span><span style="color: #fb4933;">define</span> <span style="color: #b16286;">(</span><span style="color: #fabd2f;">sqrt-iter</span> guess x<span style="color: #b16286;">)</span>
<span style="color: #b16286;">(</span>new-if <span style="color: #8ec07c;">(</span>good-enough? guess x<span style="color: #8ec07c;">)</span>
guess
<span style="color: #8ec07c;">(</span>sqrt-iter <span style="color: #d65d0e;">(</span>improve guess x<span style="color: #d65d0e;">)</span>
x<span style="color: #8ec07c;">)</span><span style="color: #b16286;">)</span><span style="color: #458588;">)</span>
</pre>
</div>
<p>
Navaden <code>if</code> je v bistvu makro in deluje po normalnem zaporedju. Ker je <code>new-if</code> definiran kot procedura, mora zaradi aplikativnega zaporedja najprej evalvirati argumente. Zato se zacikla oz. zamrzne.
</p>
</div>
</div>
<div id="outline-container-org7ed7ada" class="outline-3">
<h3 id="org7ed7ada">1.7 good-enough? ni dovolj dober?</h3>
<div class="outline-text-3" id="text-org7ed7ada">
<div class="org-src-container">
<pre class="src src-scheme"><span style="color: #458588;">(</span><span style="color: #fb4933;">define</span> <span style="color: #b16286;">(</span><span style="color: #fabd2f;">average</span> x y<span style="color: #b16286;">)</span>
<span style="color: #b16286;">(</span>/ <span style="color: #8ec07c;">(</span>+ x y<span style="color: #8ec07c;">)</span> 2<span style="color: #b16286;">)</span><span style="color: #458588;">)</span>
<span style="color: #458588;">(</span><span style="color: #fb4933;">define</span> <span style="color: #b16286;">(</span><span style="color: #fabd2f;">improve</span> guess x<span style="color: #b16286;">)</span>
<span style="color: #b16286;">(</span>average guess <span style="color: #8ec07c;">(</span>/ x guess<span style="color: #8ec07c;">)</span><span style="color: #b16286;">)</span><span style="color: #458588;">)</span>
<span style="color: #458588;">(</span><span style="color: #fb4933;">define</span> <span style="color: #b16286;">(</span><span style="color: #fabd2f;">good-enough?</span> guess x<span style="color: #b16286;">)</span>
<span style="color: #b16286;">(</span>&lt; <span style="color: #8ec07c;">(</span>abs <span style="color: #d65d0e;">(</span>- <span style="color: #458588;">(</span>square guess<span style="color: #458588;">)</span> x<span style="color: #d65d0e;">)</span><span style="color: #8ec07c;">)</span> 0.001<span style="color: #b16286;">)</span><span style="color: #458588;">)</span>
<span style="color: #458588;">(</span><span style="color: #fb4933;">define</span> <span style="color: #b16286;">(</span><span style="color: #fabd2f;">sqrt-iter</span> guess x<span style="color: #b16286;">)</span>
<span style="color: #b16286;">(</span><span style="color: #fb4933;">if</span> <span style="color: #8ec07c;">(</span>good-enough? guess x<span style="color: #8ec07c;">)</span>
guess
<span style="color: #8ec07c;">(</span>sqrt-iter <span style="color: #d65d0e;">(</span>improve guess x<span style="color: #d65d0e;">)</span>
x<span style="color: #8ec07c;">)</span><span style="color: #b16286;">)</span><span style="color: #458588;">)</span>
<span style="color: #458588;">(</span><span style="color: #fb4933;">define</span> <span style="color: #b16286;">(</span><span style="color: #fabd2f;">sqrt</span> x<span style="color: #b16286;">)</span>
<span style="color: #b16286;">(</span>sqrt-iter 1.0 x<span style="color: #b16286;">)</span><span style="color: #458588;">)</span>
</pre>
</div>
<p>
Pri premajhnih številih <code>good-enough?</code> prehitro "odneha" in dobimo slab približek, pri prevelikih številih pa "predolgo vztraja", saj ne potrebujemo tako natančnega približka. Boljša rešitev s precej elegance je, recimo, primerjava s promilom <code>x</code> namesto 0.001.
</p>
<div class="org-src-container">
<pre class="src src-scheme"><span style="color: #458588;">(</span><span style="color: #fb4933;">define</span> <span style="color: #b16286;">(</span><span style="color: #fabd2f;">good-enough?</span> guess x<span style="color: #b16286;">)</span>
<span style="color: #b16286;">(</span>&lt; <span style="color: #8ec07c;">(</span>abs <span style="color: #d65d0e;">(</span>- <span style="color: #458588;">(</span>square guess<span style="color: #458588;">)</span> x<span style="color: #d65d0e;">)</span><span style="color: #8ec07c;">)</span> <span style="color: #8ec07c;">(</span>* 0.001 x<span style="color: #8ec07c;">)</span><span style="color: #b16286;">)</span><span style="color: #458588;">)</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org0c76570" class="outline-3">
<h3 id="org0c76570">1.8 kubični koren</h3>
<div class="outline-text-3" id="text-org0c76570">
\begin{equation}
\frac{x/y^{2}+2y}{3}
\end{equation}
</div>
</div>
</div>
</div>
<div id="postamble" class="status">
<p class="author">Author: Jurij</p>
<p class="date">Created: 2024-04-21 ned 17:35</p>
<p class="date">Created: 2024-05-21 Tue 01:52</p>
<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
</body>

View File

@ -1,6 +1,6 @@
#+TITLE: Zapiski #1 srečanja programerskega bralnega krožka SICP
#+AUTHOR: Jurij
#+OPTIONS: toc:nil num:nil author
#+OPTIONS: toc:nil num:nil author tex:dvisvgm
* Zanimivi izseki
** str. 9
@ -11,18 +11,22 @@ Every reader should ask himself periodically "Toward what end, toward what end?"
#+begin_quote
Lisp is a survivor, having been in use for about a quarter of a century.
#+end_quote
** str. 11
#+begin_quote
It is better to have 100 functions operate on one data structure than to have 10 functions operate on 10 data structures.
#+end_quote
** str. 18
#+begin_quote
Thus, programs must be written for people to read, and only incidentally for machines to execute.
#+end_quote
** str. 19
#+begin_quote
Underlying our approach to this subject is our conviction that "computer science" is not a science and that its significance has little to do with computers.
#+end_quote
** str. 27
#+begin_quote
Finally, we would like to acknowledge the support of the organizations that have encouraged this work over the years, including support from Hewlett-Packard, made possible by Ira Goldstein and Joel Birnbaum, and support from DARPA, made possible by Bob Kahn.
@ -36,29 +40,87 @@ Preko očeta v sorodu s fizikom Hermanom Kahnom, ki je napisal knjigo o tem kako
** str. 77
Stoy 1977
* Vaje
** 1.1 Kaj vrnejo izrazi?
- 10
- 12
- 8
- 3
- 6
- /
- /
- 19
- #f
- 4
- 16
- 6
- 16
#+begin_src scheme
(+ 5 3 4)
#+end_src
10
#+begin_src scheme
(- 9 1)
#+end_src
8
#+begin_src scheme
(/ 6 2)
#+end_src
3
#+begin_src scheme
(+ (* 2 4) (- 4 6))
#+end_src
6
#+begin_src scheme
(define a 3)
#+end_src
#nil
#+begin_src scheme
(define b (+ a 1))
#+end_src
#nil
#+begin_src scheme
(+ a b (* a b))
#+end_src
19
#+begin_src scheme
(= a b)
#+end_src
#f
#+begin_src scheme
(if (and (> b a) (< b (* a b)))
b
a)
#+end_src
4
#+begin_src scheme
(cond ((= a 4) 6)
((= b 4) (+ 6 7 a))
(else 25))
#+end_src
16
#+begin_src scheme
(+ 2 (if (> b a) b a))
#+end_src
6
#+begin_src scheme
(* (cond ((> a b) a)
((< a b) b)
(else -1))
(+ a 1))
#+end_src
16
** 1.2 Pretvori izraz v prefix obliko
\begin{equation}
\frac{5+4+(2-(3-(6+\frac{4}{5}))) }{3(6-2)(2-7)}
\end{equation}
#+begin_src scheme :exports both
(/ (+ 5 4
(- 2
(- 3
(+ 6
1/3))))
4/5))))
(* 3
(- 6 2)
(- 2 7)))
@ -66,7 +128,8 @@ Stoy 1977
#+RESULTS:
: -43/180
** 1.3 procedura, ki prejme 3 argumente in vrne vsoto kvadratov vecjih dveh
** 1.3 določi postopek, ki prejme 3 števila kot argumente in vrne vsoto kvadratov večjih dveh
#+begin_src scheme :exports both :results table
(define (vsota-vecjih-kvadratov a b c)
@ -86,7 +149,7 @@ Stoy 1977
(+kvadrat b c))))
(list
'("Pricakovano" 85 41 164 89)
'("Pričakovano" 85 41 164 89)
(list "Funkcija1"
(vsota-vecjih-kvadratov 6 1 7)
@ -114,7 +177,7 @@ Stoy 1977
Izraz ~if~ vrne funkcijo ~+~ ali ~-~ , glede na to, ali je argument ~b~ večji ali manjši od 0.
Če je ~b~ manjši od 0, ga odšteje od ~a~, sicer pa ga prišeje. Zato je rezultat funkcije ekvivalenten vsoti ~a~ in absolutni vrednosti ~b~.
Če je ~b~ manjši od 0, ga odšteje od ~a~, sicer pa ga prišeje. Zato je rezultat funkcije ekvivalenten vsoti ~a~ in absolutnega ~b~.
** 1.5 Aplikativni red in normalni red evalvacije
@ -130,13 +193,83 @@ Izraz ~if~ vrne funkcijo ~+~ ali ~-~ , glede na to, ali je argument ~b~ večji a
(test 0 (p))
#+end_src
TODO!
Če interpreter deluje po aplikativnem zaporedju, bo najprej evalviral argumente. Ker je drugi argument postopek, ki v neskončnost vrača vrednost klica samega sebe, se bo program zaciklal oz. zmrznil.
** 1.6 TODO
Če pa interpreter deluje po normalnem zaporedju, bo pa začel izvajat postopek pred evalvacijo argumentov, le-te pa šele ko jih potrebuje. Tako bo, ~if~ stavek prepoznal ekvivalenco ~x~ in ~0~ ter vrnil ~0~.
** 1.7 TODO
Klic takšne funkcije torej preveri ali interpreter deluje po aplikativnem ali normalnem zaporedju.
Guile scheme deluje po aplikativnem redu (in se zacikla). Normalni red pa lahko "simuliramo", če proceduro definiramo kot macro, z ~define-case~. Klic macroja se ne zacikla.
** 1.8 TODO
#+begin_src scheme :exports both
(define-macro (test-m x y)
(if (= x 0)
0
y))
(test-m 0 (p))
#+end_src
#+RESULTS:
: 0
** 1.6 Novi if
Imamo nov ~if~, ~new-if~.
#+begin_src scheme
(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))
#+end_src
Kaj se zgodi, če ga uporabimo za računanje kvadratnih korenov?
#+begin_src scheme
(define (sqrt-iter guess x)
(new-if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))
#+end_src
Navaden ~if~ je v bistvu makro in deluje po normalnem zaporedju. Ker je ~new-if~ definiran kot procedura, mora zaradi aplikativnega zaporedja najprej evalvirati argumente. Zato se zacikla oz. zamrzne.
** 1.7 good-enough? ni dovolj dober?
#+begin_src scheme
(define (average x y)
(/ (+ x y) 2))
(define (improve guess x)
(average guess (/ x guess)))
(define (good-enough? guess x)
(< (abs (- (square guess) x)) 0.001))
(define (sqrt-iter guess x)
(if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))
(define (sqrt x)
(sqrt-iter 1.0 x))
#+end_src
Pri premajhnih številih ~good-enough?~ prehitro "odneha" in dobimo slab približek, pri prevelikih številih pa "predolgo vztraja", saj ne potrebujemo tako natančnega približka. Boljša rešitev s precej elegance je, recimo, primerjava s promilom ~x~ namesto 0.001.
#+begin_src scheme
(define (good-enough? guess x)
(< (abs (- (square guess) x)) (* 0.001 x)))
#+end_src
** 1.8 kubični koren
Formula za izboljšanje približka ~y~ kubičnemu korenu ~x~ je
\begin{equation}
\frac{x/y^{2}+2y}{3}
\end{equation}
Postopek: TODO
** 1.10 Ackermannov postopek