<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>IT blog &#187; lexikální rozsah platnosti</title>
	<atom:link href="http://szj.cz/tag/lexikalni-rozsah-platnosti/feed/" rel="self" type="application/rss+xml" />
	<link>http://szj.cz</link>
	<description>internet, linux, novinky, programování</description>
	<lastBuildDate>Sat, 12 Sep 2015 11:14:32 +0000</lastBuildDate>
	<language>cs-CZ</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.2.2</generator>
	<item>
		<title>Lexikální a dynamický rozsah platnosti proměnné</title>
		<link>http://szj.cz/lexikalni-a-dynamicky-rozsah-platnosti-promenne/</link>
		<comments>http://szj.cz/lexikalni-a-dynamicky-rozsah-platnosti-promenne/#comments</comments>
		<pubDate>Sat, 21 Mar 2015 14:51:10 +0000</pubDate>
		<dc:creator><![CDATA[fredomgc]]></dc:creator>
				<category><![CDATA[Programování]]></category>
		<category><![CDATA[dynamický rozsah platnosti]]></category>
		<category><![CDATA[lexikální rozsah platnosti]]></category>

		<guid isPermaLink="false">http://szj.cz/?p=934</guid>
		<description><![CDATA[Až budete příště pracovat ve svém oblíbeném programovacím jazyku, pozastavte se na chvíli nad tím, že principy, které tak již bezpečně dobře znáte, nemusí platit všude. Řeč bude na následujících řádcích o rozsahu platnosti proměnné. Uvažovat lze přitom dva modely &#8212; lexikální a dynamický rozsah. Lexikální rozsah platnosti proměnné Následujcí chování vám bude dobře známé. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Až budete příště pracovat ve svém oblíbeném programovacím jazyku, pozastavte se na chvíli nad tím, že principy, které tak již bezpečně dobře znáte, nemusí platit všude. Řeč bude na následujících řádcích o rozsahu platnosti proměnné. Uvažovat lze přitom dva modely &#8212; <strong>lexikální</strong> a <strong>dynamický</strong> rozsah.</p>
<h2>Lexikální rozsah platnosti proměnné</h2>
<p>Následujcí chování vám bude dobře známé. Používá jej totiž většina soudobých programovacích jazyků. Pokud se v nich rozhodnete aplikovat libovolnou proceduru obsahující ve svém těle proměnou neinicializovanou v lokálním prostředí této procedury, hledá se hodnota (vazba) proměnné v <em>prostředí vzniku procedury</em>. A co si představit pod pojmem <strong>prostředí vzniku procedury</strong>? Jde o prostředí nadřazené tomu lokálnímu. Důsledkem toho pokud v proceduře použijeme proměnnou, jejíž hodnota není v těle inicializována, je nutno vazbu hledat výše, kde s největší pravděpodobností narazíme na příslušnou globální proměnnou a z ní hodnotu vyčteme. Pokud by zde náhodou taková proměnná nebyla, nezbude než nahlásit chybu &#8212; proměnná totiž neexistuje.</p>
<p>Abychom to lépe pochopili, podívejme se nyní společně na komentovaný příklad:</p>
<pre class="brush: plain; title: ; notranslate">
(define test
  (lambda (y)
    (lambda (x)
      (+ y x))))

(define y 100);v globálním prostředí máme y = 100

(define f (test 20));vzniká procedura, nyní máme y = 20
(f 10);aplikace procedury, za x dosadíme 10 a spočítáme 20 + 10 = 30

;procedura ví, že má sečíst y a x
;hodnotu pro x zná (je to 10), tato hodnota byla předána v argumentu
;nyní je třeba zjistit hodnotu pro y, ta se totiž v lokálním prostředí nevyskytuje
;procedura tedy začíná hledat v &quot;prostředí vzniku procedury&quot;, to je to prostředí, které je nadřazené tomu aktuálnímu
;v tomto nadřazeném prostředí je nalezeno kýžené y (s hodnotou 20)
;procedura sečte 20 + 10 a vrátí 30
;hodnota y = 100 v globálním prostředí je v tomto případě směle ignorována
</pre>
<h2>Dynamický rozsah platnosti</h2>
<p>A teď si představme, že by se hodnoty proměnných hledaly úplně jinak, konkrétně v <strong>prostředí aplikace procedury</strong>. Nutno podotknout, že tuto metodu téměř nikdo nepoužívá, ale existují výjimky. Než se podíváme na příklad, řekněme si, jaká je hlavní potíž tohoto přístupu &#8212; hodnoty proměnných zjistíme až za běhu programu, čímž stoupá časová náročnost ladění a hledání chyb.</p>
<pre class="brush: plain; title: ; notranslate">
(define test
  (lambda (y)
    (lambda (x)
      (+ y x))))

(define y 100);v globálním prostředí máme y = 100

(define f (test 20));vzniká procedura, nyní máme y = 20
(f 10);aplikace procedury, za x dosadíme 10 a spočítáme 100 + 10 = 110

;procedura ví, že má sečíst y a x
;hodnotu pro x zná (je to 10), tato hodnota byla předána v argumentu
;nyní je třeba zjistit hodnotu pro y, ta se totiž v lokálním prostředí nevyskytuje
;procedura tedy začíná hledat v &quot;prostředí aplikace procedury&quot;
;v tomto aktuálním prostředí se y = 100
;procedura sečte 100 + 10 a vrátí 110
</pre>
]]></content:encoded>
			<wfw:commentRss>http://szj.cz/lexikalni-a-dynamicky-rozsah-platnosti-promenne/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
