tag:blogger.com,1999:blog-53976031510623382682024-03-06T04:06:03.810+01:00Raving BytesAnonymoushttp://www.blogger.com/profile/08198769559694742403noreply@blogger.comBlogger22125tag:blogger.com,1999:blog-5397603151062338268.post-84643714752849883722015-01-25T20:42:00.001+01:002015-01-25T20:45:58.130+01:00Java vs Clojure: Factory pattern<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span style="font-size: large;"><span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-weight: bold; line-height: 28px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">Java</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; line-height: 28px;"> </span></span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<br /></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun Underlined SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px; text-decoration: underline;"><span class="SpellingError SCX129241703" style="background-color: inherit;">Shape</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">interface</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">:</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<br /></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">public</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span></span><span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">interface</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">Shape</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> {</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 47px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 47px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">public</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span></span><span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">void</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">draw</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">();</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">}</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<br />
<a name='more'></a><br /></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun Underlined SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px; text-decoration: underline;"><span class="SpellingError SCX129241703" style="background-color: inherit;">Concrete</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">Shape</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">implementations</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">:</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span><br />
<br />
</div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun EmptyTextRun SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"></span><span class="LineBreakBlob BlobObject SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"><span class="SCX129241703"> </span></span><span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">public</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span></span><span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">class</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">Circle</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span></span><span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">implements</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">Shape</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> {</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 47px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 47px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="color: #646464; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">@</span><span class="SpellingError SCX129241703" style="background-color: inherit;">Override</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 47px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 47px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">public</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span></span><span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">void</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">draw</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">() {</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 47px; text-indent: 47px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 47px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">System.</span></span><span class="TextRun SCX129241703" style="color: #0000c0; font-family: Consolas,monospace; font-size: 11pt; font-style: italic; font-weight: bold; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">out</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">.</span><span class="SpellingError SCX129241703" style="background-color: inherit;">println</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">(</span></span><span class="TextRun SCX129241703" style="color: #2a00ff; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span><span class="SpellingError SCX129241703" style="background-color: inherit;">circle</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">);</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 47px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 47px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">}</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">}</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span><br />
<br />
</div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun EmptyTextRun SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"></span><span class="LineBreakBlob BlobObject SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"><span class="SCX129241703"> </span></span><span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">public</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span></span><span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">class</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">Square</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span></span><span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">implements</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">Shape</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> {</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 47px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 47px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="color: #646464; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">@</span><span class="SpellingError SCX129241703" style="background-color: inherit;">Override</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 47px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 47px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">public</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span></span><span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">void</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">draw</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">() {</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 47px; text-indent: 47px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 47px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">System.</span></span><span class="TextRun SCX129241703" style="color: #0000c0; font-family: Consolas,monospace; font-size: 11pt; font-style: italic; font-weight: bold; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">out</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">.</span><span class="SpellingError SCX129241703" style="background-color: inherit;">println</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">(</span></span><span class="TextRun SCX129241703" style="color: #2a00ff; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span><span class="SpellingError SCX129241703" style="background-color: inherit;">square</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">);</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 47px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 47px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">}</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">}</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span><br />
<br />
</div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun EmptyTextRun SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"></span><span class="LineBreakBlob BlobObject SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"><span class="SCX129241703"> </span></span><span class="TextRun Underlined SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px; text-decoration: underline;"><span class="SpellingError SCX129241703" style="background-color: inherit;">Shape</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">Factory</span></span><span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">:</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun EmptyTextRun SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"></span><span class="LineBreakBlob BlobObject SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"><span class="SCX129241703"> </span></span><span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">public</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span></span><span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">class</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">ShapeFactory</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> {</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 47px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 47px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">public</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">Shape</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">getShape</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">(String </span></span><span class="TextRun SCX129241703" style="color: #6a3e3e; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">shapeType</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">){</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 47px; text-indent: 47px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 47px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">if</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">(</span></span><span class="TextRun Underlined SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px; text-decoration: underline;"><span class="SpellingError SCX129241703" style="background-color: inherit;">shapeType</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">.equals</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">(</span></span><span class="TextRun SCX129241703" style="color: #2a00ff; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span><span class="SpellingError SCX129241703" style="background-color: inherit;">circle</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">)){</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 94px; text-indent: 47px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 47px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">return</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span></span><span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">new</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">Circle</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">();</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 47px; text-indent: 47px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 47px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">} </span></span><span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">else</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span></span><span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">if</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">(</span></span><span class="TextRun SCX129241703" style="color: #6a3e3e; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">shapeType</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">.equals</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">(</span></span><span class="TextRun SCX129241703" style="color: #2a00ff; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span><span class="SpellingError SCX129241703" style="background-color: inherit;">square</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">)){</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 94px; text-indent: 47px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 47px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">return</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span></span><span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">new</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">Square</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">();</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 94px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">}</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 47px; text-indent: 47px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 47px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">return</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span></span><span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">null</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">;</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 47px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 47px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">}</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">}</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span><br />
<br />
</div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun EmptyTextRun SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"></span><span class="LineBreakBlob BlobObject SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"><span class="SCX129241703"> </span></span><span class="TextRun Underlined SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px; text-decoration: underline;"><span class="SpellingError SCX129241703" style="background-color: inherit;">Usage</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">:</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span><br />
<br />
</div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">new</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">ShapeFactory</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">().</span><span class="SpellingError SCX129241703" style="background-color: inherit;">getShape</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">(</span></span><span class="TextRun SCX129241703" style="color: #2a00ff; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span><span class="SpellingError SCX129241703" style="background-color: inherit;">circle</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">).</span><span class="SpellingError SCX129241703" style="background-color: inherit;">draw</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">();</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="color: #7f0055; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">new</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">ShapeFactory</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">().</span><span class="SpellingError SCX129241703" style="background-color: inherit;">getShape</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">(</span></span><span class="TextRun SCX129241703" style="color: #2a00ff; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span><span class="SpellingError SCX129241703" style="background-color: inherit;">square</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span></span><span class="TextRun SCX129241703" style="color: black; font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">).</span><span class="SpellingError SCX129241703" style="background-color: inherit;">draw</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">();</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun EmptyTextRun SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"></span><span class="LineBreakBlob BlobObject SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"><span class="SCX129241703"> </span></span><span class="TextRun EmptyTextRun SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"></span><span class="EOP SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span style="font-size: large;"><span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-weight: bold; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">Clojure</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; line-height: 19px;"> </span></span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun EmptyTextRun SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"></span><span class="LineBreakBlob BlobObject SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"><span class="SCX129241703"> </span></span><span class="TextRun EmptyTextRun SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"></span><span class="EOP SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun Underlined SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px; text-decoration: underline;"><span class="SpellingError SCX129241703" style="background-color: inherit;">Shape</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">interface</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">:</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<br /></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">(</span></span><span class="TextRun SCX129241703" style="color: #7e0021; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">defprotocol</span></span><span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">Shape</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 47px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 47px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="color: #0000cc; font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span><span class="SpellingError SCX129241703" style="background-color: inherit;">Shape</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">inteface</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 47px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 47px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">(</span><span class="SpellingError SCX129241703" style="background-color: inherit;">draw</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> [</span></span><span class="TextRun SCX129241703" style="color: #7e0021; font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">this</span></span><span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">]))</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span><br />
<br />
</div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; height: auto; text-align: left; text-indent: 0px; vertical-align: baseline; width: auto;">
<span class="TextRun EmptyTextRun SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"></span><span class="LineBreakBlob BlobObject SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"><span class="SCX129241703"> </span></span><span class="TextRun Underlined SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px; text-decoration: underline;"><span class="SpellingError SCX129241703" style="background-color: inherit;">Concrete</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">Shape</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">implementations</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">:</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<br /></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">(</span></span><span class="TextRun SCX129241703" style="color: #7e0021; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">deftype</span></span><span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">Circle</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> []</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 47px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 47px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">Shape</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 47px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 47px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">(</span><span class="SpellingError SCX129241703" style="background-color: inherit;">draw</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> [</span></span><span class="TextRun SCX129241703" style="color: #7e0021; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">this</span></span><span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">] </span></span><span class="TextRun SCX129241703" style="color: #0000cc; font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span><span class="SpellingError SCX129241703" style="background-color: inherit;">circle</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span></span><span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">))</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun EmptyTextRun SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"></span><span class="LineBreakBlob BlobObject SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"><span class="SCX129241703"> </span></span><span class="TextRun EmptyTextRun SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"></span><span class="EOP SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">(</span></span><span class="TextRun SCX129241703" style="color: #7e0021; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">deftype</span></span><span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">Square</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> []</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 47px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 47px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">Shape</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 47px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 47px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">(</span><span class="SpellingError SCX129241703" style="background-color: inherit;">draw</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> [</span></span><span class="TextRun SCX129241703" style="color: #7e0021; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">this</span></span><span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">] </span></span><span class="TextRun SCX129241703" style="color: #0000cc; font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span><span class="SpellingError SCX129241703" style="background-color: inherit;">square</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span></span><span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">))</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun EmptyTextRun SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"></span><span class="LineBreakBlob BlobObject SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"><span class="SCX129241703"> </span></span><span class="TextRun EmptyTextRun SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"></span><span class="EOP SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun Underlined SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px; text-decoration: underline;"><span class="SpellingError SCX129241703" style="background-color: inherit;">Shape</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">Factory</span></span><span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">:</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<br /></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">(</span></span><span class="TextRun SCX129241703" style="color: #7e0021; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">defprotocol</span></span><span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">ShapesFactory</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 47px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 47px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="color: #0000cc; font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span><span class="SpellingError SCX129241703" style="background-color: inherit;">Shapes</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">Factory</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 47px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 47px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">(</span><span class="SpellingError SCX129241703" style="background-color: inherit;">getShape</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> [</span></span><span class="TextRun SCX129241703" style="color: #7e0021; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">this</span></span><span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> t]))</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun EmptyTextRun SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"></span><span class="LineBreakBlob BlobObject SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"><span class="SCX129241703"> </span></span><span class="TextRun EmptyTextRun SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"></span><span class="EOP SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">(</span></span><span class="TextRun SCX129241703" style="color: #7e0021; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">deftype</span></span><span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> </span><span class="SpellingError SCX129241703" style="background-color: inherit;">ShapeFactory</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> []</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 47px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 47px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">ShapesFactory</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 47px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 47px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">(</span><span class="SpellingError SCX129241703" style="background-color: inherit;">getShape</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> [</span></span><span class="TextRun SCX129241703" style="color: #7e0021; font-family: Consolas,monospace; font-size: 11pt; font-weight: bold; line-height: 19px;"><span class="SpellingError SCX129241703" style="background-color: inherit;">this</span></span><span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> t] (</span><span class="SpellingError SCX129241703" style="background-color: inherit;">cond</span></span> <span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"></span><span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> (= t </span></span><span class="TextRun SCX129241703" style="color: #0000cc; font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span><span class="SpellingError SCX129241703" style="background-color: inherit;">circle</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span></span><span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">) (</span><span class="SpellingError SCX129241703" style="background-color: inherit;">Circle</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">.)</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 188px; text-indent: 47px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 47px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> (= t </span></span><span class="TextRun SCX129241703" style="color: #0000cc; font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span><span class="SpellingError SCX129241703" style="background-color: inherit;">square</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span></span><span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">) (</span><span class="SpellingError SCX129241703" style="background-color: inherit;">Square</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">.))))</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun EmptyTextRun SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"></span><span class="LineBreakBlob BlobObject SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"><span class="SCX129241703"> </span></span><span class="TextRun Underlined SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px; text-decoration: underline;"><span class="SpellingError SCX129241703" style="background-color: inherit;">Usage</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">:</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<br /></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">(</span><span class="SpellingError SCX129241703" style="background-color: inherit;">draw</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> (</span><span class="SpellingError SCX129241703" style="background-color: inherit;">getShape</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> (</span><span class="SpellingError SCX129241703" style="background-color: inherit;">ShapeFactory</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">.) </span></span><span class="TextRun SCX129241703" style="color: #0000cc; font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span><span class="SpellingError SCX129241703" style="background-color: inherit;">circle</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span></span><span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">))</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">(</span><span class="SpellingError SCX129241703" style="background-color: inherit;">draw</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> (</span><span class="SpellingError SCX129241703" style="background-color: inherit;">getShape</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;"> (</span><span class="SpellingError SCX129241703" style="background-color: inherit;">ShapeFactory</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">.) </span></span><span class="TextRun SCX129241703" style="color: #0000cc; font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span><span class="SpellingError SCX129241703" style="background-color: inherit;">square</span><span class="NormalTextRun SCX129241703" style="background-color: inherit;">"</span></span><span class="TextRun SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; font-weight: normal; line-height: 19px;"><span class="NormalTextRun SCX129241703" style="background-color: inherit;">))</span></span><span class="EOP SCX129241703" style="font-family: Consolas,monospace; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
<div class="OutlineElement Ltr SCX129241703" style="margin-left: 0px; text-indent: 0px;">
<div class="Paragraph SCX129241703" style="background-color: transparent; color: windowtext; font-family: "Segoe UI",Tahoma,Verdana,"Sans-Serif"; font-size: 6pt; font-style: normal; font-weight: normal; text-align: left; text-indent: 0px; vertical-align: baseline;">
<span class="TextRun EmptyTextRun SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"></span><span class="LineBreakBlob BlobObject SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"><span class="SCX129241703"> </span></span><span class="TextRun EmptyTextRun SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"></span><span class="EOP SCX129241703" style="font-family: Calibri,sans-serif; font-size: 11pt; line-height: 19px;"> </span></div>
</div>
Anonymoushttp://www.blogger.com/profile/08198769559694742403noreply@blogger.com0tag:blogger.com,1999:blog-5397603151062338268.post-74474692502483183872014-07-27T12:27:00.000+02:002014-08-03T15:32:57.149+02:00Java vs Clojure: Streams/ReducersOstatnio natrafiłem na materiał wideo porównujący kolekcje w
językach Java, Scala i z użyciem biblioteki przygotowanej przez
developerów firmy Goldman Sachs. Z ciekawości utowrzyłem podobny
kod w Clojure by porównać wyniki. I muszę powiedzieć, że są
trochę zaskakujące.<br />
W materiale tym porównywana była wydajność kolekcji dla 1
miliona elementów. Postanowiłem utrudnić trochę i dodać 1 zero.
Wyniki są podyktowane cechami mojego PC, na innych komputerach będą
się różnić, być może znacznie.<br />
<br />
Tutaj źródło:
<a href="http://www.infoq.com/presentations/java-streams-scala-parallel-collections">http://www.infoq.com/presentations/java-streams-scala-parallel-collections</a><br />
<br />
<a name='more'></a><br />
<br />
<b>Java</b>:<br />
<br />
<span style="font-family: Courier New, monospace;">List<Long> a;<br />List<Long> b;<br />b = LongStream.range(0, 10_000_000)</span><br />
<span style="font-family: Courier New, monospace;"> .boxed()</span><br />
<span style="font-family: Courier New, monospace;"> .collect(Collectors.toList());<br /> <br />a = b.parallelStream()<br /> .filter(e -> e % 10_000 != 0)<br /> .map(e -> String.valueOf(e))<br /> .map(e -> Long.valueOf(e))<br /> .filter(e -> (e + 1) % 10_000 != 0)<br /> .collect(Collectors.toList());</span><br />
<br />
<u>Czas wykonania ~3.8 sekundy</u> po 30 iteracjach. <br />
<br />
<b>Clojure</b>:<br />
- funkcje wyciągnięte na zewnątrz dla zwiększenia czytelności<br />
<br />
<span style="font-family: Courier New, monospace;">(require
'[clojure.core.reducers :as r])</span><br />
<span style="font-family: Courier New, monospace;">(defn not10k [^Long x] (not= 0
(rem x 10000)))</span><br />
<span style="font-family: Courier New, monospace;">(defn not10k1 [^Long x] (not=
0 (rem (inc x) 10000)))</span><br />
<span style="font-family: Courier New, monospace;">(defn toString [^Long x]
(java.lang.String/valueOf x))</span><br />
<span style="font-family: Courier New, monospace;">(defn toLong [^String x]
(java.lang.Long/valueOf x))</span><br />
<br />
<span style="font-family: Courier New, monospace;">(def a (vec (range 10000000)))</span><br />
<br />
<span style="font-family: Courier New, monospace;">(def kompozycja (comp
(r/filter not10k1)</span><br />
<span style="font-family: Courier New, monospace;"> (r/map
toLong)</span><br />
<span style="font-family: Courier New, monospace;"><span style="font-family: Courier New, monospace;"> </span>(r/map
toString)</span><br />
<span style="font-family: Courier New, monospace;"><span style="font-family: Courier New, monospace;"> </span>(r/filter
not10k)))</span><br />
<br />
<span style="font-family: Courier New, monospace;">(into [] (kompozycja a)) ;
czas mierzony tutaj</span><br />
<br />
<u>Czas wykonania ~4.7 sekundy.</u> Po 30 iteracjach. Java tylko ok. 24% szybsza. Całkiem nieźle.<br />
<br />
<u><b>Edit:</b></u><br />
<br />
Aby zwiekszyć wydajność kodu Clojure (prędkość ta sama jak dla Java) trzeba uzyć zwykłej tablicy typu long dla kolekcji wejściowej, więc:<br />
<br />
<span style="font-family: Courier New, monospace;">(def a (vec (range 10000000)))</span><br />
<br />
<span style="font-family: Courier New, monospace;"><span style="font-family: inherit;">zamienić na:</span> </span><br />
<br />
<span style="font-family: Courier New, monospace;"><span style="font-family: Courier New, monospace;">(def a (long-array (range 10000000)))</span></span><br />
<br />
<span style="color: #073763;"><b><u><span style="font-family: Courier New, monospace;"><span style="font-family: Courier New, monospace;"><span style="font-family: inherit;">Jako ciekawostka, kod w języku Smalltalk (Pharo 3.0):</span></span></span></u></b></span><br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">aStream := (ReadStream on: (1 to: 10000000)) contents readStream.<br /> </span><br />
<span style="font-family: "Courier New",Courier,monospace;">Time millisecondsToRun: [ <br /> bStream := Array new writeStream.<br /><br /> not10k := [ :x | (x rem: 10000) ~= 0 ].<br /> not10k1 := [ :x | (x + 1 rem: 10000) ~= 0 ].<br /><br /> [ ( x := aStream next) notNil ] <br /> whileTrue: [ <br /> ((not10k value: x) and: <br /> (not10k1 value: (x asString) asNumber))<br /> ifTrue: [ bStream nextPut: x ]].<br /><br /> b := bStream contents.] </span><br />
<span style="font-family: Courier New, monospace;"><span style="font-family: Courier New, monospace;"><span style="font-family: inherit;"> </span> </span></span><br />
<span style="font-family: Courier New, monospace;"><span style="font-family: Courier New, monospace;"><span style="font-family: Times,"Times New Roman",serif;">~23 sekundy.</span></span></span>Anonymoushttp://www.blogger.com/profile/08198769559694742403noreply@blogger.com1tag:blogger.com,1999:blog-5397603151062338268.post-15581602372918382422014-07-06T18:11:00.001+02:002014-07-06T18:23:01.697+02:00Java vs Clojure : Singleton<div style="margin-bottom: 0cm;">
<span style="font-size: small;">Luźna definicja: singleton to obiekt,
który posiada tylko jedną instancję w aplikacji. Zwykle stosowany
jaki kontener dla konfiguracji. Dlaczego jedna instancja? Ano
dlatego, by spróbować uniknąć niespójności związanych z tym,
że różne obiekty posiadają nieaktualne informacje dot. wartości
w nim przechowywanych np. poprzez przekazywanie obiektu konfiguracji przez parametr. Dodatkowy problem stanowią próby
aktualizacji wartości Singletona tak, by przy odczycie w innym
miejscu programu dostać je spójne, a nie zaktualizowane częściowo.
</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;">Pusty Singleton w Java:</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">public
enum MySingleton {</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;"> INSTANCE;</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">}</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;">W Clojure wartości obiektów można
zmieniać tylko w trnsakcji. Najprostszą konstrukcją zapewniającą
funkcjonalność Singletona jest atom.
</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;">Pusty atom w Clojure:</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">(def
MySingleton (atom nil))</span></div>
<a name='more'></a><span style="font-size: small;"><br /></span>
<span style="font-size: small;"><br /></span>
<br />
<div style="margin-bottom: 0cm;">
<span style="font-size: small;">Załóżmy, że posiadamy klasę
konfiguracji, która przechowuje dane dot. logowania do bazy danych:</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">public
class LoginData {</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">private
String name;</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">private
String password;</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">public
LoginData(String name, String password) {</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;"> this.name
= name;</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;"><span style="font-family: Courier New, monospace;"> </span>this.password
= password;</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">}</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">public
String getName() {</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;"><span style="font-family: Courier New, monospace;"> </span>return
name;</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">}</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">public
String getPassword() {</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;"><span style="font-family: Courier New, monospace;"> </span>return
password;</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">}</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">public
void setName(String name) {</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;"><span style="font-family: Courier New, monospace;"> </span>this.name
= name;</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">}</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">public
void setPassword(String password) {</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;"><span style="font-family: Courier New, monospace;"> </span>this.password
= password;</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">}</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">@Override</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">public
String toString(){</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;"><span style="font-family: Courier New, monospace;"> </span>StringBuilder
sb = new StringBuilder();</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;"><span style="font-family: Courier New, monospace;"> </span>sb.append("Name:
").append(name).append(", Password: ")</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;"><span style="font-family: Courier New, monospace;"> </span></span><span style="font-family: Courier New, monospace; font-size: small;"><span style="font-family: Courier New, monospace;"><span style="font-family: Courier New, monospace;"> </span></span>.append(password);</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;"><span style="font-family: Courier New, monospace;"> </span>return
sb.toString();</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;"><span style="font-family: Courier New, monospace;"> </span>}</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">}</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;">Singleton <b>Java</b> będzie wyglądać
tak:</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">public
enum MyConfig {</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;"><span style="font-family: Courier New, monospace;"> </span>INSTANCE;</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;"><span style="font-family: Courier New, monospace;"> </span>private
final LoginData ld = new LoginData("myname", "mypassword");</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">public
LoginData getLoginData() {</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;"><span style="font-family: Courier New, monospace;"> </span></span><span style="font-family: Courier New, monospace; font-size: small;"><span style="font-family: Courier New, monospace;"><span style="font-family: Courier New, monospace;"> </span> </span>return
ld;</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;"><span style="font-family: Courier New, monospace;"> </span>}</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">}</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;">W <b>Clojure </b>tworzymy następująco
interfejs obiektu konfiguracji:</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">(defprotocol
LoginProtocol</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;"><span style="font-family: Courier New, monospace;"> </span>"Login
protocol"</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;"><span style="font-family: Courier New, monospace;"> </span>(toStr
[this] "to String"))</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Times New Roman, serif; font-size: small;">Obiekt,
który przechowa dane (odpowiednik klasy, dziedziczący po
nadrzędnym):</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">(defrecord
LoginData [name password]</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;"><span style="font-family: Courier New, monospace;"> </span>LoginProtocol</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;"><span style="font-family: Courier New, monospace;"> </span>(toStr
[this] (str "Name: " (:name this) ", Password: "
(:password this))))</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Times New Roman, serif; font-size: small;">Atom,
który posłuży jako singleton z obiektu LoginData </span>
</div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">(def
myconfig (atom (LoginData. "myname" "mypassword")))</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Times New Roman, serif; font-size: small;">Dostęp
do pól singletona, przykład:</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">(:name
@myconfig)</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Times New Roman, serif; font-size: small;">Aktualizacja
danych w transakcji:</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">(swap!
myconfig #(assoc % :name "newname" :password
"newpassword"))</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Times New Roman, serif; font-size: small;">Zamiana
na łańcuch znakowy i wypisanie w konsoli:</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, monospace; font-size: small;">(println
(toStr @myconfig))</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Times New Roman, serif; font-size: small;"><b>Wyjaśnienia</b></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Times New Roman, serif; font-size: small;">Obiekt
LoginData jest obiektem tylko do odczytu. Pod spodem to zwykła mapa
klucz-wartość : <span style="font-variant: normal;"><span style="color: black;"><span style="font-family: inherit;"><i><span style="font-weight: normal;">{:name
"newname", :password "newpassword"}</span></i></span></span></span>.
Można utowrzyć inny obiekt i podmienić całość, ale nie można
bezpośrednio modyfikować pól mapy. Stąd dodatkowy kontener typu
<i>atom</i><span style="font-style: normal;">. Atom w Clojure
modyfikuje się poprzez wysłanie do niego funkcji, która przyjmuje
starą jego zawartość jako parametr. Tutaj uzyłem funkcji anonimowej
#(), gdzie parametr oznaczony jest jako %. Podmiana jest
natychmiastowa i niezauważalna dla reszty programu. Znaczek @ to
skrót syntaktyczny od funkcji deref, która przekazuje wartość
atomu.</span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Times New Roman, serif; font-size: small;">Przydatne
linki:</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><a href="http://www.informit.com/articles/article.aspx?p=1216151&seqNum=3">
<span style="font-family: Times New Roman, serif;">Enforce the singleton property
with a private constructor or an enum type</span></a></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><a href="https://www.youtube.com/watch?v=pi_I7oD_uGI#t=28m51s"><span style="font-family: Times New Roman, serif;">Effective
Java Reloaded</span></a></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Times New Roman, serif; font-size: small;"><a href="http://clojuredocs.org/clojure_core/clojure.core/defprotocol">http://clojuredocs.org/clojure_core/clojure.core/defprotocol</a></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Times New Roman, serif; font-size: small;"><a href="http://clojuredocs.org/clojure_core/clojure.core/atom">http://clojuredocs.org/clojure_core/clojure.core/atom</a></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Times New Roman, serif; font-size: small;"><a href="http://clojuredocs.org/clojure_core/clojure.core/swap!">http://clojuredocs.org/clojure_core/clojure.core/swap!</a></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Times New Roman, serif; font-size: small;"><a href="http://clojuredocs.org/clojure_core/1.2.0/clojure.core/assoc">http://clojuredocs.org/clojure_core/1.2.0/clojure.core/assoc</a></span></div>
<div style="margin-bottom: 0cm;">
</div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<br /></div>
Anonymoushttp://www.blogger.com/profile/08198769559694742403noreply@blogger.com0tag:blogger.com,1999:blog-5397603151062338268.post-49024735199200239552013-06-23T12:28:00.002+02:002013-06-23T12:32:33.997+02:00Konfiguracja Honeywell Dolphin 7800 Android na Ubuntu 12.04<span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">Kolejna ściąga. Jako, że urządzenia nie ma uwzględnionego w SDK Androida, trzeba trochę pogrzebać ręcznie.</span><br />
<span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;"></span><br />
<a name='more'></a><span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">1. Ustawić ścieżki do SDK (ADT w katalogu użytkownika, przykład), dodać poniższe na końcu pliku /etc/profile , po edycji wylogować się i zalogować ponownie.</span><br />
<br />
<span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">export PATH=$PATH:/home/rs/ADT/sdk/platform-tools<br />export PATH=$PATH:/home/rs/ADT/sdk/tools</span><br />
<span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">2. Skopiować addons z pliku zip Honeywella do katalogu ADT, np: /home/rs/ADT/add-ons</span><br />
<br />
<span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">3. Uzupełnić brakujące SDK i zależności wymagane przez addons Honeywella (API 15) (uruchomić polecenie: android). Zamknąć po zakończeniu.</span><br />
<br />
<span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">4. W pliku ~/.android/adb_usb.ini powinien się pokazać wpis: 0x02ce . Jeżeli nie ma, </span><br />
<span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">uruchomić polecenie: android update adb </span><br />
<span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">5. Utworzyć plik: /etc/udev/rules.d/71-android.rules z zawartością:</span><br />
<br />
<span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">SUBSYSTEM=="usb", ATTR{idVendor}=="02ce", MODE="0666", GROUP="plugdev" </span><br />
<span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">Nie używać edytorów, które pozostawiają śmieci w postaci plików tymczasowych, lub takowe po edycji usunąć!</span><br />
<span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">6. Zmienić prawa pliku i zamknąć usługi:</span><br />
<ul>
<li><span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">chown root /etc/udev/rules.d/71-android.rules</span></li>
<li><span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">chmod 644 /etc/udev/rules.d/71-android.rules </span></li>
<li><span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">service udev restart</span></li>
<li><span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">killall adb</span></li>
</ul>
<span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">7. Z konta użytkownika. Z root nie zadziała. Wcześniej rozłączyć i połączyć urządzenie do USB. Ustawić tryb debugowania w urządzeniu.</span><br />
<ul>
<li><span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">sudo adb devices</span></li>
</ul>
<br />
<span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;"><span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">* daemon not running. starting it now on port 5037 *<br />* daemon started successfully *<br />List of devices attached <br />12302D02E5 device</span></span><br /> </span><br />
<span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">Fin.</span>Anonymoushttp://www.blogger.com/profile/08198769559694742403noreply@blogger.com0tag:blogger.com,1999:blog-5397603151062338268.post-66059574848976695322013-05-31T16:20:00.002+02:002014-01-16T23:44:27.077+01:00Clojure on Android, quick introThis
time I'll show how to create Android application using
Clojure programming language. Clojure is one of the most interesting
practical functional languages (in contrast e.g. to
Haskell). It's a Lisp, so you can just run it and start hacking. This
language makes it easy to play with code and stimulates
curiosity.<br />
<br />
<br />
It's
just a very short intro to the configuration and ho to run basic
program. For the impatient who want more I recommend a look at the neko
library here: <span style="color: black;">
<a href="https://github.com/alexander-yakushev/neko" style="background-color: transparent; line-height: 1.4;">https://github.com/alexander-yakushev/neko</a></span><br />
<br />
<br />
<a name='more'></a><br />
<br />
<br />
<b>Required tools:</b><br />
<ul>
<li>Emulator
or Android tablet / phone with the system version 2.3 or greater. On
the film, I'm using Android 4.0 with VirtualBox </li>
<li>Leiningen version 2.0 + </li>
<li>Android
SDK and target platform minimum of 10 for version 2.3 </li>
<li>Text
editor with support for nREPL or SWANK - it needs to be able to manually connect to a server which is embedded into application. I'm using Eclipse with Counterclockwise plug-in. You may try to use Emacs
or Vim - for me these two are just too much hipster. </li>
</ul>
<b class="auto-style3" style="line-height: 1.4;">Preparation:<br />
</b><br />
After
downloading lein.bat, copy it to a directory which is included in your system PATH variable.<br />
Then, run in
a terminal:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;"><span class="auto-style4"> </span><span class="auto-style4" lang="en-US">lein
self-install</span></span><br />
<br />
Now,
you need to install a plugin for Leiningen, which will automate creation/compilation and execution of your project on Android.<span lang="pl-PL"> Edit "</span><span lang="en-US" style="font-family: Courier New, Courier, monospace;">~/.lein/profiles.clj</span><span lang="pl-PL">",
~ - is user's home directory. If this file doesn't exist, you must create
it . The purpose of all this is to provide a path to the Android SDK. Mine
is for ex.:</span><br />
<br />
<span style="font-family: Courier New, Courier, monospace;"><span class="auto-style4">{:user </span>
</span><br />
<span class="auto-style4" style="font-family: Courier New, Courier, monospace;"> {:android
{:sdk-path "/path/to/sdk"}</span><br />
<span class="auto-style4" style="font-family: Courier New, Courier, monospace;"> :plugins
[[</span><span class="auto-style4" style="font-family: Courier New, Courier, monospace;"><span style="font-size: small;"><span><span style="font-family: Courier New,serif;"><span lang="en-US">lein-droid "0.1.0-preview5"</span></span></span></span>]]</span><br />
<span class="auto-style4" style="font-family: Courier New, Courier, monospace;"> :dependencies
[]}}</span><br />
<span style="background: transparent;"><br />
Now you can create a demo-project application.</span><br />
<span class="auto-style3"><span style="background: transparent;">Run
this to update dependencies:<br />
</span></span><br />
<span class="auto-style4" style="font-family: Courier New, Courier, monospace;">lein
deps</span><br />
<span style="background: transparent;"><br /></span>
<span class="auto-style2"><span style="background: transparent;">Creating a basic application:<br />
</span></span><br />
<span style="background: transparent; font-family: Courier New, Courier, monospace;">lein
droid new demo org.demo :activity DemoActivity :target-sdk 10
:app-name DemoApp</span><br />
<br />
<span style="background: transparent; font-family: Courier New, Courier, monospace;">cd
demo</span><br />
<span style="background: transparent;"><br /></span>
<span class="auto-style3"><span style="background: transparent;">Create
Maven config file. It will later be easier to import project into Eclipse IDE.<br />
</span></span><br />
<span class="auto-style4" style="background: transparent; font-family: Courier New, Courier, monospace;">lein
pom</span><br />
<span style="background: transparent;"><br /></span>
<span class="auto-style3"><span style="background: transparent;">
<span lang="en-US">Now
you need to </span><span lang="pl-PL">run Android emulator or connect your device to USB. I'm starting a virtual machine, waiting for it to load, and then execute this in
terminal:</span></span></span><br />
<span style="background: transparent;">adb
connect 192.168.1.18 - this is my Android's emulator IP. To find yours hit Ctrl+Alt+F1 in emulator and run 'ip a' command, You will have to find your IP from the result. It should look like 192.168.*.* Ctrl+Alt+F7
to switch back to GUI.</span><br />
<span style="background: transparent;"><br />
</span><span class="auto-style2"><span style="background: transparent;">Building
and running project:<br />
</span></span><br />
<span class="auto-style4" style="background: transparent; font-family: Courier New, Courier, monospace;">lein
droid doall</span><br />
<span style="background: transparent;"><br />Project should be built and launched on an emulator. Application has
a running REPL server at the default port 9999.</span><br />
<br />
<span style="background: transparent;">In Eclipse IDE select File/Import... from menu. As import choose "Maven
project" and locate pom.xml file. Now Eclipse is ready to connect to Demo app. Again from Eclipse's menu choose "Window" and select "Connect to REPL". Type in emulator's or device's IP address and port.</span><br />
<br />
This is how it looks like on my PC. Step by step. I'm assuming all required tools are present:
<br />
<div style="background-color: white; line-height: 1.4; margin-bottom: 0cm;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/o7jrvpfwtFc?feature=player_embedded' frameborder='0'></iframe> </div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br /><div class="separator" style="background-color: white; clear: both; font-family: Arial,Tahoma,Helvetica,FreeSans,sans-serif; line-height: 1.4; text-align: center;">
</div>
Anonymoushttp://www.blogger.com/profile/08198769559694742403noreply@blogger.com1tag:blogger.com,1999:blog-5397603151062338268.post-49167422984133953272013-05-28T22:50:00.002+02:002013-10-03T22:43:27.315+02:00Clojure na Android Intro<div style="margin-bottom: 0cm;">
Tym razem wstępniak do tworzenia aplikacji na Androida przy użyciu języka programowania Clojure. Clojure to jeden z ciekawszych praktycznych języków funkcyjnych (w przeciwieństwie np. do Haskella). Jako, że to Lisp, można go po prostu uruchomić i zacząć hackować. Język ten ułatwia zabawę z kodem i stymuluje ciekawość. Clojure promuje eksperymentowanie. Z resztą przekonaj się sam.
</div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
To tylko króciutkie intro przedstawiające proces konfiguracji i uruchomienia środowiska. Dla niecierpliwych, którzy chcą więcej polecam zapoznać się z biblioteką neko: <a href="https://github.com/alexander-yakushev/neko">https://github.com/alexander-yakushev/neko</a> . </div>
<div style="margin-bottom: 0cm;">
</div>
<a name='more'></a><br />
<br />
<div style="margin-bottom: 0cm;">
<span style="font-size: small;"><u><span style="font-family: Calibri, serif;">Narzędzia:</span></u></span></div>
<ul>
<li><div style="line-height: 115%; margin-bottom: 0.35cm;">
<span style="font-size: small;"><span style="font-family: Calibri, serif;">Emulator
Androida lub tablet/telefon z tym systemem w wersji 2.3+. Na
potrzeby filmu użyję Androida 4.0 z VirtualBox Skonfigurowanego
zgodnie z opisem we wpisie na blogu dot. Androida na PC.</span></span></div>
</li>
<li><div style="margin-bottom: 0.35cm;">
<span style="font-size: small;"><span style="font-family: Calibri, serif;"><span style="line-height: 18px;">Menedżer</span><span style="line-height: 115%;"> projektów Leiningen w wersji 2.0+</span></span></span></div>
</li>
<li><div style="line-height: 115%; margin-bottom: 0.35cm;">
<span style="font-size: small;"><span style="font-family: Calibri, serif;">SDK
Androida z bibliotekami API minimum 10 dla systemu w wersji 2.3</span></span></div>
</li>
<li><div style="margin-bottom: 0.35cm;">
<span style="font-size: small;"><span style="font-family: Calibri, serif;"><span style="line-height: 115%;">Edytor
tekstów z obsługą nREPL lub SWANK - musi mieć </span><span style="line-height: 18px;">możliwość</span><span style="line-height: 115%;"> manualnego połączenia się z serwerem projektu dołączonego do
edytowanej aplikacji. Ja używam Eclipse z wtyczką
Counterclockwise. Kto che może silić się na Emacsa lub Vim - w/g
mnie to zbędne hipsterstwo.</span></span></span></div>
</li>
</ul>
<div style="line-height: 115%; margin-bottom: 0.35cm;">
<span style="font-size: small;"><span style="font-family: Calibri, serif;"><u>Przygotowanie:</u></span></span></div>
<div style="line-height: 115%; margin-bottom: 0.35cm;">
<span style="font-size: small;"><span style="font-family: Calibri, serif;">Po
ściągnięciu lein.bat należy go skopiować do katalogu, który
jest uwzględniony w zmiennej systemowej PATH lub odpowiednio zamieszać w ustawieniach systemu.</span></span></div>
<div style="margin-bottom: 0.35cm;">
<span style="font-size: small;"><span style="font-family: Calibri, serif;"><span style="line-height: 115%;">Następnie </span><span style="line-height: 18px;">polecenie</span><span style="line-height: 115%;"> w terminalu: </span></span><span style="font-family: Courier New, serif; line-height: 115%;"><span lang="en-US">lein
self-install</span></span></span></div>
<div style="line-height: 115%; margin-bottom: 0.35cm;">
<span style="font-size: small;"><span style="font-family: Calibri, serif;"><span lang="pl-PL">Teraz
trzeba zainstalować plugin do Leiningena, który zautomatyzuje
tworzenie/kompilację i uruchamianie projektu na Androidzie.</span></span></span></div>
<div style="line-height: 115%; margin-bottom: 0.35cm;">
<span style="font-size: small;"><span style="font-family: Calibri, serif;"><span lang="pl-PL">Edytuję
plik "</span></span><span style="font-family: Courier New, serif;"><span lang="en-US">~/.lein/profiles.clj</span></span><span style="font-family: Calibri, serif;"><span lang="pl-PL">",
~ - katalog domowy użytkownika. Jeżeli pliku nie ma, trzeba go
utworzyć. Chodzi o to, by podać ścieżkę do SDK Androida. U mnie
wygląda on tak:</span></span></span></div>
<div style="line-height: 115%; margin-bottom: 0.35cm;">
<span style="font-size: small;"><span style="font-family: Courier New, serif;"><span lang="en-US">{
:user {</span></span></span></div>
<div style="line-height: 115%; margin-bottom: 0.35cm;">
<span style="font-size: small;"><span style="font-family: Courier New, serif;"><span lang="en-US">:android
{:sdk-path "C:/Programy/Android/android-studio/sdk"}</span></span></span></div>
<div style="line-height: 115%; margin-bottom: 0.35cm;">
<span style="font-size: small;"><span style="font-family: Courier New, serif;"><span lang="en-US">:plugins
[[lein-droid "0.1.0-preview5"]]</span></span></span></div>
<div style="line-height: 115%; margin-bottom: 0.35cm;">
<span style="font-size: small;"><span style="font-family: Courier New, serif;"><span lang="en-US">:dependencies
[]}}</span></span></span></div>
<div style="line-height: 115%; margin-bottom: 0.35cm;">
<span style="font-size: small;"><span style="font-family: Calibri, serif;"><span lang="pl-PL">Mając
tak przygotowany plik można utworzyć projekt demo aplikacji.</span></span></span></div>
<div style="line-height: 115%; margin-bottom: 0.35cm;">
<span style="font-size: small;"><span style="font-family: Calibri, serif;"><span lang="pl-PL">Odświeżenie
zależności : </span></span></span></div>
<div style="line-height: 115%; margin-bottom: 0.35cm;">
<span style="font-size: small;"><span style="font-family: Courier New, serif;"><span lang="en-US">lein
deps</span></span></span></div>
<div style="line-height: 115%; margin-bottom: 0.35cm;">
<span style="font-size: small;"><span style="font-family: Calibri, serif;"><span lang="pl-PL">Utworzenie
podstawowej aplikacji : </span></span></span></div>
<div style="line-height: 115%; margin-bottom: 0.35cm;">
<span style="font-size: small;"><span style="font-family: Courier New, serif;"><span lang="en-US">lein
droid new demo org.demo :activity DemoActivity :target-sdk 10
:app-name DemoApp</span></span></span></div>
<div style="line-height: 115%; margin-bottom: 0.35cm;">
<span style="font-size: small;"><span style="font-family: Calibri, serif;"><span lang="pl-PL">cd
demo</span></span></span></div>
<div style="line-height: 115%; margin-bottom: 0.35cm;">
<span style="font-size: small;"><span style="font-family: Calibri, serif;"><span lang="pl-PL">Utworzenie
konfiguracji do importu w Eclipse:</span></span></span></div>
<div style="line-height: 115%; margin-bottom: 0.35cm;">
<span style="font-size: small;"><span style="font-family: Courier New, serif;"><span lang="en-US">lein
pom</span></span></span></div>
<div style="line-height: 115%; margin-bottom: 0.35cm;">
<span style="font-size: small;"><span style="font-family: Calibri, serif;"><span lang="en-US">Teraz
należy </span></span><span style="font-family: Calibri, serif;"><span lang="pl-PL">uruchomić
emulator Androida. W moim przypadku uruchamiam wirtualna maszynę,
czekam aż się załaduje i z konsoli:</span></span></span></div>
<div style="line-height: 115%; margin-bottom: 0.35cm;">
<span style="font-size: small;"><span style="font-family: Courier New CE, serif;"><span lang="pl-PL">adb
connect 192.168.1.18</span></span></span></div>
<div style="line-height: 115%; margin-bottom: 0.35cm;">
<span style="font-family: Calibri, sans-serif;"><span style="font-size: small;"><u><span lang="pl-PL">Uruchomienie:</span></u></span></span></div>
<div style="line-height: 115%; margin-bottom: 0.35cm;">
<span style="font-size: small;"><span style="font-family: Courier New CE, serif;"><span lang="pl-PL">lein
droid doall</span></span></span></div>
<div style="margin-bottom: 0.35cm;">
<span style="font-size: small;"><span style="font-family: Calibri, serif;"><span lang="pl-PL"><span style="line-height: 115%;">Projekt
powinien się skompilować i wystartować w Androidzie. Program
posiada </span><span style="line-height: 18px;">działający</span><span style="line-height: 115%;"> serwer REPL na porcie domyślnym 9999. </span></span></span></span>
</div>
<div style="line-height: 115%; margin-bottom: 0.35cm;">
<span style="font-size: small;"><span style="font-family: Calibri, serif;"><span lang="pl-PL">Teraz
czas na Eclipse i zaimportowanie projektu. Jako import wybieram
projekt Mavena i wyszukuję pliku pom.xml . Można wyłączyć
automatyczne budowanie projektu by odciążyć PC i tak będziemy
eksperymentować w REPL. Z Menu Window w Eclipse wybieramy Connect to
REPL, podajemy adres IP i port i działamy.</span></span></span></div>
<br />
<div style="margin-bottom: 0cm;">
Tworzenie projektu i kilka wykonanych przykładowych operacji na programie można zobaczyć tutaj:</div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/o7jrvpfwtFc?feature=player_embedded' frameborder='0'></iframe></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<br /></div>
Anonymoushttp://www.blogger.com/profile/08198769559694742403noreply@blogger.com0tag:blogger.com,1999:blog-5397603151062338268.post-60567443534694934222013-05-06T19:44:00.000+02:002013-05-07T13:59:54.052+02:00Fetching images from any Web page using Clojure As title says this post will be about downloading images from given page link. To make this task a little easier I am using Enlive library available here: <a href="https://github.com/cgrand/enlive">https://github.com/cgrand/enlive</a><br />
<div>
<br /></div>
<div>
There are primarily 4 main steps to do this. </div>
<div>
- read page source from given address</div>
<div>
- parse it </div>
<div>
- find all <img> tags and store its src (image link) value</div>
<div>
- use these links to fetch images directly and store them to disk</div>
<div>
<br /></div>
<div>
Because function that reads image from URL needs full address like: <i>"http://..."</i> I'm adding additional step: </div>
<div>
- check if image URL has a valid root</div>
<div>
<br /></div>
<div>
It means that if image link starts with "/" I must add Web page URL at the beginning. </div>
<div>
<br /></div>
<div>
This is how it looks like in Clojure. Remember to add </div>
<div>
<span style="font-family: Courier New, Courier, monospace;">[enlive "1.1.1"]</span> dependency to <i>project.clj </i>if you're using Leiningen. Also create target directory if it doesn't exist.</div>
<div>
<a href="http://www.blogger.com/blogger.g?blogID=5397603151062338268" name="more"></a><br />
<a name='more'></a><br /></div>
<div>
I hope code is self-explanatory. </div>
<div>
<br />
<br />
<div style="margin-bottom: 0cm;">
<span style="color: #cc7a7a;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;"><b>ns</b></span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;"> fetcher</span></span></span><span style="color: black;"><span style="font-family: Monospace;"><span style="font-size: x-small;">.core</span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;">
</span><span style="color: #ccb07a;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #2a00ff;"><span style="font-family: Monospace;"><span style="font-size: x-small;">:use</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
[clojure.java.io </span></span></span><span style="color: #2a00ff;"><span style="font-family: Monospace;"><span style="font-size: x-small;">:as</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
io]</span></span></span><span style="color: #ccb07a;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;">
</span><span style="color: #ccb07a;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #2a00ff;"><span style="font-family: Monospace;"><span style="font-size: x-small;">:use</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
[net.cgrand.enlive-html]</span></span></span><span style="color: #ccb07a;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span><span style="color: #cc7a7a;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span></div>
</div>
<div>
<div style="margin-bottom: 0cm;">
<br />
<div style="margin-bottom: 0cm;">
<span style="color: #cc7a7a;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;"><b>defn</b></span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
fetch-all-images-from-url [src-url dest-folder]</span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;"></span><span style="color: #ccb07a;"><span style="font-family: Monospace;"><span style="font-size: x-small;"> (</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;"><b>let</b></span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
[</span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;">
</span>
</div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;"></span><span style="color: #3f7f5f;"><span style="font-family: Monospace;"><span style="font-size: x-small;"><i> ;
get root from src-url: http://google.com/alias1/2/3 --->
http://google.com</i></span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;"> root-url
</span></span></span><span style="color: #7acc7a;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;">clojure.string/join</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
</span></span></span><span style="color: #2a00ff;"><span style="font-family: Monospace;"><span style="font-size: x-small;">"/"</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
</span></span></span><span style="color: #7accb0;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;">take</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
3 </span></span></span><span style="color: #7ab0cc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;">clojure.string/split</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
src-url </span></span></span><span style="color: #2a00ff;"><span style="font-family: Monospace;"><span style="font-size: x-small;">#"/"</span></span></span><span style="color: #7ab0cc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span><span style="color: #7accb0;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span><span style="color: #7acc7a;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #7acc7a;"><span style="font-family: Monospace;"><span style="font-size: x-small;"><br /></span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;">
</span>
</div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;"></span><span style="color: #3f7f5f;"><span style="font-family: Monospace;"><span style="font-size: x-small;"><i> ;
function: if image url starts with "/" ( / character is: \/
in Clojure, ex \a \b etc...) append root url</i></span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;"> complete-url </span></span></span><span style="color: #7acc7a;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;"><b>fn</b></span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
[url]</span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;"></span><span style="color: #7accb0;"><span style="font-family: Monospace;"><span style="font-size: x-small;"> (</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;"><b>let</b></span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
[t </span></span></span><span style="color: #7ab0cc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;">first</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
url</span></span></span><span style="color: #7ab0cc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">]</span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;"></span><span style="color: #7ab0cc;"><span style="font-family: Monospace;"><span style="font-size: x-small;"> (</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;"><b>if</b></span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
</span></span></span><span style="color: #7a7acc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;">not=</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
t </span></span></span><span style="color: #0000c0;"><span style="font-family: Monospace;"><span style="font-size: x-small;">\/</span></span></span><span style="color: #7a7acc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;"> url</span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;"></span><span style="color: #7a7acc;"><span style="font-family: Monospace;"><span style="font-size: x-small;"> (</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;">str</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
root-url url</span></span></span><span style="color: #7a7acc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span><span style="color: #7ab0cc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span><span style="color: #7accb0;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span><span style="color: #7acc7a;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #7acc7a;"><span style="font-family: Monospace;"><span style="font-size: x-small;"><br /></span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;">
</span>
</div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;"></span><span style="color: #3f7f5f;"><span style="font-family: Monospace;"><span style="font-size: x-small;"><i> ;
get page source</i></span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;"> html-src
</span></span></span><span style="color: #7acc7a;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;">html-resource</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
</span></span></span><span style="color: #7accb0;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;"><i>java.net.URL.</i></span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
src-url</span></span></span><span style="color: #7accb0;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span><span style="color: #7acc7a;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #7acc7a;"><span style="font-family: Monospace;"><span style="font-size: x-small;"><br /></span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;">
</span>
</div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;"></span><span style="color: #3f7f5f;"><span style="font-family: Monospace;"><span style="font-size: x-small;"><i> ;
parse html creating list of mapped url links and image names, create
set to avoid duplicates </i></span></span></span>
</div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;"> image-list </span></span></span><span style="color: #7acc7a;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;">set</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
</span></span></span><span style="color: #7accb0;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;">map</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
</span></span></span><span style="color: #7ab0cc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">#(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;"><b>let</b></span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
[url </span></span></span><span style="color: #7a7acc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;">complete-url</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
</span></span></span><span style="color: #b07acc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #2a00ff;"><span style="font-family: Monospace;"><span style="font-size: x-small;">:src</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
</span></span></span><span style="color: #cc7ab0;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #2a00ff;"><span style="font-family: Monospace;"><span style="font-size: x-small;">:attrs</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
%</span></span></span><span style="color: #cc7ab0;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span><span style="color: #b07acc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span><span style="color: #7a7acc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;"> img-name
</span></span></span><span style="color: #7a7acc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;">last</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
</span></span></span><span style="color: #b07acc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;">clojure.string/split</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
url </span></span></span><span style="color: #2a00ff;"><span style="font-family: Monospace;"><span style="font-size: x-small;">#"/"</span></span></span><span style="color: #b07acc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span><span style="color: #7a7acc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">]</span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;"> {</span></span></span><span style="color: #2a00ff;"><span style="font-family: Monospace;"><span style="font-size: x-small;">:url</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
url </span></span></span><span style="color: #2a00ff;"><span style="font-family: Monospace;"><span style="font-size: x-small;">:img-name</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
img-name}</span></span></span><span style="color: #7ab0cc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;"></span><span style="color: #7ab0cc;"><span style="font-family: Monospace;"><span style="font-size: x-small;"> (</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;">select</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
html-src #{[</span></span></span><span style="color: #2a00ff;"><span style="font-family: Monospace;"><span style="font-size: x-small;">:img</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">]}</span></span></span><span style="color: #7ab0cc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span><span style="color: #7accb0;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span><span style="color: #7acc7a;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #7acc7a;"><span style="font-family: Monospace;"><span style="font-size: x-small;"><br /></span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;"></span><span style="color: #3f7f5f;"><span style="font-family: Monospace;"><span style="font-size: x-small;"><i> ;
save to file function </i></span></span></span>
</div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;"> fetch-to-file </span></span></span><span style="color: #7acc7a;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;"><b>fn</b></span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
[url file]</span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;"></span><span style="color: #7accb0;"><span style="font-family: Monospace;"><span style="font-size: x-small;"> (</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;"><b>with-open</b></span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
[in </span></span></span><span style="color: #7ab0cc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;">io/input-stream</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
url</span></span></span><span style="color: #7ab0cc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;"> </span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;"> out </span></span></span><span style="color: #7ab0cc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;">io/output-stream</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
file</span></span></span><span style="color: #7ab0cc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">]</span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;"></span><span style="color: #7ab0cc;"><span style="font-family: Monospace;"><span style="font-size: x-small;"> (</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;">io/copy</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
in out</span></span></span><span style="color: #7ab0cc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span><span style="color: #7accb0;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span><span style="color: #7acc7a;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;"> ]</span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;">
</span>
</div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;"></span><span style="color: #3f7f5f;"><span style="font-family: Monospace;"><span style="font-size: x-small;"><i> ;
actual work here</i></span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;"></span><span style="color: #7acc7a;"><span style="font-family: Monospace;"><span style="font-size: x-small;"> (</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;">dorun</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
</span></span></span><span style="color: #7accb0;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;">map</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
</span></span></span><span style="color: #7ab0cc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">#(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;"><b>do </b></span></span></span><span style="color: #7a7acc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;">println</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
</span></span></span><span style="color: #2a00ff;"><span style="font-family: Monospace;"><span style="font-size: x-small;">"Fetching"</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
</span></span></span><span style="color: #b07acc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #2a00ff;"><span style="font-family: Monospace;"><span style="font-size: x-small;">:url</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
%</span></span></span><span style="color: #b07acc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
</span></span></span><span style="color: #2a00ff;"><span style="font-family: Monospace;"><span style="font-size: x-small;">"..."</span></span></span><span style="color: #7a7acc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;"></span><span style="color: #7a7acc;"><span style="font-family: Monospace;"><span style="font-size: x-small;"> (</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;">fetch-to-file</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
</span></span></span><span style="color: #b07acc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #2a00ff;"><span style="font-family: Monospace;"><span style="font-size: x-small;">:url</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
%</span></span></span><span style="color: #b07acc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
</span></span></span><span style="color: #b07acc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;">str</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
dest-folder </span></span></span><span style="color: #2a00ff;"><span style="font-family: Monospace;"><span style="font-size: x-small;">"/"</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
</span></span></span><span style="color: #cc7ab0;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #2a00ff;"><span style="font-family: Monospace;"><span style="font-size: x-small;">:img-name</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
%</span></span></span><span style="color: #cc7ab0;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span><span style="color: #b07acc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span><span style="color: #7a7acc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span><span style="color: #7ab0cc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;"> image-list</span></span></span><span style="color: #7accb0;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span><span style="color: #7acc7a;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span><span style="color: #ccb07a;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span><span style="color: #cc7a7a;"><span style="font-family: Monospace;"><span style="font-size: x-small;">)</span></span></span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
</div>
<div align="LEFT" style="margin-bottom: 0cm;">
<i style="color: #3f7f5f; font-family: monospace; font-size: small;"><br /></i></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<i style="color: #3f7f5f; font-family: monospace; font-size: small;">; running:</i></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: #cc7a7a;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;"><b>time</b></span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
</span></span></span><span style="color: #ccb07a;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;">fetch-all-images-from-url</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
</span></span></span><span style="color: #2a00ff;"><span style="font-family: Monospace;"><span style="font-size: x-small;">"http://www.reddit.com"</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;">
</span></span></span><span style="color: #2a00ff;"><span style="font-family: Monospace;"><span style="font-size: x-small;">"/tmp/imgs"</span></span></span><span style="color: #ccb07a;"><span style="font-family: Monospace;"><span style="font-size: x-small;">))</span></span></span></div>
</div>
<div>
<br /></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">Output:</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">... cut ...</span></div>
<div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">Fetching 1flDE6_4AZvmq7SE.png ...</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">Fetching 2fK5Sh_g6f2--4qm.jpg ...</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">Fetching zut90T1zjCO_R1D8.jpg ...</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">Fetching ynsO-YoyYCeK4_e6.png ...</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">"Elapsed time: 3124.432108 msecs"</span></div>
</div>
<div>
<br /></div>
<div>
You can upgrade this code a little and execute fetching in parallel using <i>pmap. </i> Just edit the line:</div>
<div>
<span style="color: #7acc7a;"><span style="font-family: Monospace;"><span style="font-size: x-small;"><br /></span></span></span></div>
<div>
<span style="color: #7acc7a;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;">dorun</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;"> </span></span></span><span style="color: #7accb0;"><span style="font-family: Monospace;"><span style="font-size: x-small;">(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;">pmap</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;"> </span></span></span><span style="color: #7ab0cc;"><span style="font-family: Monospace;"><span style="font-size: x-small;">#(</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;"><b>do</b></span></span></span><span style="color: #7a7acc;"><span style="font-family: Monospace;"><span style="font-size: x-small;"> (</span></span></span><span style="color: #7f0055;"><span style="font-family: Monospace;"><span style="font-size: x-small;">println</span></span></span><span style="color: #3c3c3c;"><span style="font-family: Monospace;"><span style="font-size: x-small;"> </span></span></span><span style="color: #2a00ff;"><span style="font-family: Monospace;"><span style="font-size: x-small;">"Fetching"...</span></span></span></div>
<div>
<span style="color: #2a00ff;"><span style="font-family: Monospace;"><span style="font-size: x-small;"><br /></span></span></span></div>
<div>
<span style="color: #2a00ff;"><span style="font-family: Monospace;"><span style="font-size: x-small;"><br /></span></span></span></div>
<div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">Output:</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">...</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">Fetching WvL8v5ZLqPpNK3Ww.jpg ...</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">Fetching zut90T1zjCO_R1D8.jpg ...</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">Fetching xxJOeJRdwhrF63PF.jpg ...</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">Fetching B43z7slN_Tpo9nf-.jpg ...</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">"Elapsed time: 1658.57191 msecs"</span></div>
</div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<span style="font-family: inherit;">Twice as fast. :)</span><br />
<span style="font-family: inherit;"><br /></span>Anonymoushttp://www.blogger.com/profile/08198769559694742403noreply@blogger.com0tag:blogger.com,1999:blog-5397603151062338268.post-75064131182699388342013-05-01T12:25:00.000+02:002013-05-01T13:48:37.099+02:00Przyspieszanie skryptów Clojure<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNAfy72XoHENp9KVrMOT4Ml0iytREukDk3Qid1wQnChjGSFBmQ0n_8Ou90gQ2k3mMndRYPv3LxzlFDOh5CT046qpm3-p_SCkWJ_wJWKbUi3lvOT41wEbWSEskBAYcUsnUA2SXF7g4IT6c/s1600/clojure.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNAfy72XoHENp9KVrMOT4Ml0iytREukDk3Qid1wQnChjGSFBmQ0n_8Ou90gQ2k3mMndRYPv3LxzlFDOh5CT046qpm3-p_SCkWJ_wJWKbUi3lvOT41wEbWSEskBAYcUsnUA2SXF7g4IT6c/s1600/clojure.png" /></a><span style="font-family: FreeSerif, serif;">Z
pewnością wiele osób stroni/unika używania Javy lub innego języka
opartego o JVM do uruchamiania skryptów ze względu na bardzo
powolny czas startu. Przede wszystkim dotyczy to programistów
Clojure, którego rozgrzewka jest, można powiedzieć, baaaaardzo
długa jak na wymagania małych skryptów i wręcz przekreśla
jakiekolwiek pożyteczne zastosowanie. Jest jednak na to sposób.
Trzeba zaprzęgnąć do roboty program o nazwie Drip ( dostępny na:
</span><a href="https://github.com/flatland/drip" style="font-family: FreeSerif, serif;">https://github.com/flatland/drip</a><span style="font-family: FreeSerif, serif;">
).</span><br />
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: FreeSerif, serif;">Drip po
pierwszym uruchomieniu, które trwa podobnie długo jak zwykłe
uruchomienie programu przy pomocy polecenia <i>java,
</i>ładuje
świeże środowisko Java do pamięci i do takiego czystego
środowiska zapodaje program, który uruchamia się niemal
natychmiast.</span></div>
<div style="margin-bottom: 0cm;">
</div>
<a name='more'></a><div style="margin-bottom: 0cm;">
<span style="font-family: FreeSerif, serif;">W
moim przypadku instalacja Drip wyglądała tak:</span></div>
<pre class="western"><span style="font-family: FreeSerif, serif;"><code class="western"><span style="color: #333333;"><span style="font-family: Consolas, Liberation Mono, Courier, monospace;"><span style="font-size: x-small;"><span style="background-position: initial initial; background-repeat: initial initial;">sudo sh -c "</span></span></span></span></code><code class="western"><span style="color: #333333;"><span style="font-family: Consolas, Liberation Mono, Courier, monospace;"><span style="font-size: x-small;"><span style="background-position: initial initial; background-repeat: initial initial;">curl -L http://drip.flatland.org > /bin/drip"</span></span></span></span></code></span>
<code class="western"><span style="color: #333333;"><span style="font-family: Consolas, Liberation Mono, Courier, monospace;"><span style="font-size: x-small;">sudo </span></span></span></code><code class="western"><span style="color: #333333;"><span style="font-family: Consolas, Liberation Mono, Courier, monospace;"><span style="font-size: x-small;"><span style="background-position: initial initial; background-repeat: initial initial;">chmod 755 /bin/drip</span></span></span></span></code></pre>
<br />
<div style="margin-bottom: 0cm;">
<span style="font-family: FreeSerif, serif;">Przykład
1. Czas wykonania się zwykłego skryptu przy użyciu polecenia </span><i style="font-family: FreeSerif, serif;">java</i><span style="font-family: FreeSerif, serif;">. Prymitywny skrypt przeprowadza mnożenie dwóch liczb.</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: FreeMono, monospace;"><span style="font-size: x-small;">rs@rs-komp:/tmp$
time java -cp clojure-1.5.1.jar clojure.main -e '(* 10 20)'
</span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: FreeMono, monospace;"><span style="font-size: x-small;">200
</span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: FreeMono, monospace;"><span style="font-size: x-small;">
</span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: FreeMono, monospace;"><span style="font-size: x-small;">real 0m1.367s
</span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: FreeMono, monospace;"><span style="font-size: x-small;">user 0m1.712s
</span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: FreeMono, monospace;"><span style="font-size: x-small;">sys 0m0.064s</span></span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: FreeSerif, serif;">Przykład
2. Czas pierwszego wykonania skryptu Clojure z użyciem Drip.:</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: FreeMono, monospace; font-size: x-small;">rs@rs-komp:/tmp$ time drip -cp clojure-1.5.1.jar clojure.main -e '(* 10 20)'</span><br />
<span style="font-family: FreeMono, monospace; font-size: x-small;">200</span><br />
<span style="font-family: FreeMono, monospace; font-size: x-small;">real<span class="Apple-tab-span" style="white-space: pre;"> </span>0m1.921s</span><br />
<span style="font-family: FreeMono, monospace; font-size: x-small;">user<span class="Apple-tab-span" style="white-space: pre;"> </span>0m1.760s</span><br />
<span style="font-family: FreeMono, monospace; font-size: x-small;">sys<span class="Apple-tab-span" style="white-space: pre;"> </span>0m0.076s</span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: FreeSerif, serif;">Przykład
3. Czas kolejnego uruchomienia skryptu, tym razem zmieniam treść
skryptu.</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: FreeMono, monospace;"><span style="font-size: x-small;">rs@rs-komp:/tmp$
time drip -cp clojure-1.5.1.jar clojure.main -e '(* 5 10)'
</span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: FreeMono, monospace;"><span style="font-size: x-small;">50
</span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: FreeMono, monospace;"><span style="font-size: x-small;">
</span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: FreeMono, monospace;"><span style="font-size: x-small;">real 0m0.203s
</span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: FreeMono, monospace;"><span style="font-size: x-small;">user 0m0.028s
</span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: FreeMono, monospace;"><span style="font-size: x-small;">sys 0m0.012s
</span></span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
Całkiem wyraźne przyspieszenie względem standardowej Javy.<br />
<br /></div>
<h3 class="western">
Trochę więcej o Drip</h3>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: FreeSerif, serif;">Jeżeli
Drip nie doczeka się połączenia w końcu sam się wyłączy. Czas
przetrzymywania JVM w pamięci można wydłużyć tworząc zmienną
środowiskow</span>ą <code class="western"><span style="font-family: FreeMono, monospace;">DRIP_SHUTDOWN</span></code><code class="western"><span style="font-family: FreeSerif, serif;">
i </span></code><code class="western"><span style="font-family: FreeSerif, serif;">nadając
jej wartość liczbową reprezentującą czas w minutach. </span></code></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="font-family: FreeSerif, serif;">Aby
ubić uruchomione maszyny trzeba użyć polecenia </span></code><code class="western"><span style="font-family: FreeSerif, serif;"><i>drip
kill, </i></span></code><code class="western"><span style="font-family: FreeSerif, serif;">lista
uruchomionych maszyn to polecenie </span></code><code class="western"><span style="font-family: FreeSerif, serif;"><i>drip
ps</i></span></code><code class="western"><span style="font-family: FreeSerif, serif;">.</span></code></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="font-family: FreeSerif, serif;">Niestety
Drip nie działa na Windows i nie zanosi się na port. </span></code>
</div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="font-family: FreeSerif, serif;"><br /></span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="font-family: FreeSerif, serif;">Drip może się integrować z innymi językami. Więcej tu : </span></code><a href="https://github.com/flatland/drip/wiki">https://github.com/flatland/drip/wiki</a></div>
Anonymoushttp://www.blogger.com/profile/08198769559694742403noreply@blogger.com0tag:blogger.com,1999:blog-5397603151062338268.post-26969203020676860232013-03-05T00:28:00.005+01:002013-05-28T22:51:34.975+02:00Android 4.0 na PC<span style="font-family: Times, Times New Roman, serif;">Kolejna ściąga. Tym razem szybka konfiguracja Androida przy użyciu VirtualBox.</span><br />
<span style="font-family: Times, Times New Roman, serif;"><br />Jeżeli ktoś już bawił się w tworzenie aplikacji, to wie, że czas startu emulatora dołączanego do androidowego SDK może przysporzyć człowieka o kolejne siwe włosy. Potrzebowałem ostatnio na gwałt czegoś, co zastąpi mi w deweloperce tablet. Czemuż to? Otóż, po kilku reinstalacjach systemu, głównie po to by przetestować różne ROMy zaczął szwankować Bluetooth. Przez kilku tygodni, mimo kilku wycieczek ze śrubokrętem i czyszczenia elektroniki Bluetooth nie działał. Do wczoraj... Gdy zakupiłem adapter Bluetooth i znalazłem odpowiednią wersję pod maszynę wirtualną, która w miarę działa, nagle tabletowy odpowiednik ożył. Jak na złość. Ręce opadają... No nic, 20 PLN to nic takiego, a już nie wierzę, że pewnego dnia znów BT w tablecie odmówi posłuszeństwa. Wybrałem więc opcję dalszej pracy bez tabletu. </span><br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvUjypS8DgPF9S1EQAIkpLXcNHXYpr-LD1qFZ-u_Oh2xvgTRTLf-Pc668HTfOYrupz_EDi_-EYOYlAvMz0b8PnmjyuNOSCGO3oX-hfWkdIsvyRHnOUb5SJYXMjPnjUvpLVqkRgN9Rt5q4/s1600/Android4.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><span style="font-family: Times, Times New Roman, serif;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvUjypS8DgPF9S1EQAIkpLXcNHXYpr-LD1qFZ-u_Oh2xvgTRTLf-Pc668HTfOYrupz_EDi_-EYOYlAvMz0b8PnmjyuNOSCGO3oX-hfWkdIsvyRHnOUb5SJYXMjPnjUvpLVqkRgN9Rt5q4/s400/Android4.png" width="240" /></span></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-family: Times, Times New Roman, serif;">Obr. 1. Ekran blokady.</span></td></tr>
</tbody></table>
<span style="font-family: Times, Times New Roman, serif;"><br />Jedyną bezproblemowo działającą (z kilu testowanych) wersją Androida okazała się wersja 4.0 na eeepc. Dokładnie to obraz <span style="background-color: white; color: #3a434e;"><b>android-x86-4.0-RC2-eeepc.iso</b></span> ze strony <a href="http://www.android-x86.org/download">http://www.android-x86.org/download</a>. Jako jedyny bezproblemowo obsługuje sieć i Bluetooth. Wersja 2.2 miała problemy z konfiguracją sieci, a za to dział Bluetooth. W wersji ostatniej (4.2) natomiast jest odwrotnie.</span><br />
<span style="font-family: Times, Times New Roman, serif;"><br />Po ściągnięciu VirtualBox należy także ściągnąć dodatkową paczkę narzędzi: <span style="background-color: white;">VM VirtualBox Extension Pack<b>.</b> Należy pamiętać by wersje VirtualBox i paczki narzędziowej były takie same. </span></span><br />
<div>
<span style="font-family: Times, Times New Roman, serif;"><br /></span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;">Dla instalacji maszyny stacjonarnie, bez opcji LiveCD zarezerwowałem 1.5GB przestrzeni dyskowej, podłączyłem 2 rdzenie procesora. Jako, że moja aplikacja domyślnie działa w orientacji pionowej trzeba było też edytować kilka plików konfiguracyjnych. W Menu wyboru wybrać VESA Mode by uruchomić lub Install to disk by zainstalować na stałe. Jeżeli to drugie, to najpierw zainstalować GRUB, a pod koniec instalacji jeżeli instalator zapyta się czy zamontować /system do odczytu i zapisu potwierdzić Yes. Umniejszy to później liczbę problemów z edytowaniem plików Androida.</span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;"></span><br />
<a name='more'></a><span style="font-family: Times, Times New Roman, serif;"><br /></span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;">Po uruchomieniu wygląda to tak jak na obrazku 1.</span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;">Czasem Android wchodzi w tryb uśpienia i nie reaguje na mysz. Wtedy trzeba go obudzić wciskając prawy Ctrl+H lub z Menu opcją Machine -> Close -> Send Shutdown signal. To jest odpowiednik naciśnięcia przycisku Power na rzeczywistym urządzeniu. Jeżeli nie widać kursora myszy trzeba w Menu wybrać opcję : Machine -> Disable mouse integration.</span></div>
<h3>
<span style="font-family: Times, Times New Roman, serif;">
Konfiguracja sieci </span></h3>
<div>
<span style="font-family: Times, Times New Roman, serif;"><br /></span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;">Aby mieć dostęp do internetu z poziomu maszyny w opcjach sieci (Network) należy wybrać opcję <b>Bridged</b> i ustawić kartę sieciową z której łączymy się z internetem. Może to być dowolna karta sieciowa Ethernet lub WiFi. Android powinien sam znaleźć i skonfigurować połączenie. </span></div>
<h3>
<span style="font-family: Times, Times New Roman, serif;"><br />Konfiguracja Bluetooth</span></h3>
<div>
<span style="font-family: Times, Times New Roman, serif;">Tutaj są dwie możliwości. Pierwsza to podłączenie adaptera Bluetooth do portu PC i w opcjach maszyny wirtualnej w zakładce USB zaznaczyć <b>Enable USB </b>i<b> Enable USB 2.0 EHCI Controller</b>. Potem za pomocą zielonego '+' dodać Bluetooth. W ten sposób po starcie maszyny Bluetooth powinien być automatycznie dostępny. </span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;"><br /></span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;">Drugi sposób to po uruchomieniu maszyny odhaczyć opcję w jej okienku z Menu -> Devices -> USB Devices -> [tu powinna być nazwa Twojego adaptera Bluetooth]. </span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;"><br /></span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;">Po obu zabiegach należy wejść w opcje Androida i włączyć Bluetooth. Można to zrobić myszką poprzez ściągnięcie górnej belki i kliknięcie w suwaki lub będąc na ekranie głównym nacisnąć na klawiaturze klawisz Menu (ten obok flagi Windows, gdy ktoś ma klawiaturę MS). </span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;"><br /></span></div>
<h3>
<span style="font-family: Times, Times New Roman, serif;">
Konfiguracja ekranu maszyny do wyświetlania obrazu w pionie</span></h3>
<div>
<span style="font-family: Times, Times New Roman, serif;">Ta część wymaga nieco dłubania w plikach konfiguracyjnych maszyny i samego Androida. Pierwszą rzeczą jest znaleźć katalog, w którym jest maszyna wirtualna. Najlepiej to zrobić klikając prawym na nazwę maszyny w VB i wybrać opcję Show in Explorer. Trzeba wyedytować plik *.vbox. W pliku, tuż pod linijką z <ExtraData> trzeba wkleić to: </span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;"><ExtraDataItem name="CustomVideoMode1" value="480x800x16"/> </span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;">Jak widać wybrałem rozdzielczość 480 w poziomie i 800 w pionie przy 16bit palecie kolorów. Szczerze, nie eksperymentowałem z tymi parametrami poza samą rozdzielczością, ale zalecają 16bit, wiec nie tykam.</span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;"><br /></span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;">Po uruchomieniu maszyny w menu wyboru trzeba nacisnąć klawisz 'e' dwukrotnie. Pajawi się możliwość edycji parametrów startowych. Tymczasowo po spacji trzeba dodać: vga=ask</span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;">Maszyna wyświetli dostępną liczbę trybów graficznych. Gdzieś tam pod koniec powinien być tryb, który wpisałem do pliku konfiguracyjnego *.vbox. Trzeba odczytać liczbę przy nim i zapisać przyda się później. Tymczasem wpisuję te liczbę i wciskam Enter i klawisz 'b'. Maszyna powinna się uruchomić, a ekran powinien przybrać postać w pionie. </span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;"><br /></span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;">Teraz, mając już zainstalowanego Androida na dysku i przetestowany tryb graficzny można zmienić opcje uruchamiania przy rozruchu tak, by Android uruchamiał się z tymi ustawieniami automatycznie. </span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;"><br /></span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;">W oknie z Androidem wciskamy klawisz Ctrl+Alt+F1. Pojawi się linuksowa konsola. W konsoli po kolei wpisuję po kolei tak:</span></div>
<div>
<div>
<span style="font-family: Times, Times New Roman, serif;"><br /></span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;">mkdir /data/fs </span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;">mount -t ext3 /dev/block/sda1 /data/fs</span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;">vi /data/fs/grub/menu.lst</span></div>
</div>
<div>
<span style="font-family: Times, Times New Roman, serif;"><br /></span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;">Na końcu pierwszego wiersza zaczynającego się od 'kernel' trzeba dodać vga=[numer odczytanego poprzednio trybu w trybie dziesiątkowym], np. u mnie było 360, a hex to 864, wiec vga=864 oraz opcję dpi=160. Zapisać i uruchomić ponownie. Można tez skopiować pierwszy wpis (3 linijki), by mieć dostęp do zwykłego trybu graficznego.</span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;"><br /></span></div>
<h3>
<span style="font-family: Times, Times New Roman, serif;">
Konfiguracja serwera ADB</span></h3>
<div>
<span style="font-family: Times, Times New Roman, serif;">Aby mieć możliwość użycia tak zbudowanej maszyny trzeba sprawdzić jej adres IP. Polecenie konsoli Androida: 'ip a'. Wyświetli się lista urządzeń z adresami. Trzeba znaleźć ten ze swojej podsieci. W linii poleceń systemu (Linux/Windows/Mac) trzeba teraz wpisać 'adb connect [adres ip]'. I mamy gotową maszynę pod deweloperkę z działającą siecią i Bluetooth. </span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;"><br /></span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;">Teraz najlepiej wyłączyć maszynę i zarchiwizować cały jej katalog jako kopię awaryjną.</span></div>
Anonymoushttp://www.blogger.com/profile/08198769559694742403noreply@blogger.com0tag:blogger.com,1999:blog-5397603151062338268.post-27056466930285745812013-02-12T15:30:00.000+01:002013-07-04T19:26:28.220+02:00Clojure i Emacs z wtyczką nREPL na WindowsKolejna ściąga w notatniku. Tym razem instalacja Emacsa na Windows z wtyczką nREPL ( <a href="https://github.com/clojure/tools.nrepl">https://github.com/clojure/tools.nrepl</a> ). nREPL jest aktywnie rozwijanym zamiennikiem do niewspieranego już SLIME i wtyczki swank-clojure, których instalację opisałem w poprzednim wpisie dot. Emacs. Oczywiście jak najbardziej poprzednie dodatki działają i sprawują się dość dobrze, ale lepiej wyjść z zasady i dmuchać na zimne, bo pewnego dnia przestaną one działać.<br />
<br />
Przy instalacji może się przydać narzędzie do edycji zmiennej systemowej PATH: Redmond Path ( <a href="http://download.cnet.com/Redmond-Path/3000-2094_4-10811594.html">http://download.cnet.com/Redmond-Path/3000-2094_4-10811594.html</a> ). Przyda się także narzędzie do pobierania danych z linii poleceń : curl lub wget. Jako, że curl jest już w paczce Git ( <a href="http://git-scm.com/downloads">http://git-scm.com/downloads</a> ), którego używam, trzeba się postarać, by katalog bin z Gita był uwzględniony w PATH.<br />
<br />
Emacsa dla Windows można pobrać z : <span id="goog_1852639585"></span><a href="http://www.blogger.com/">http://ftp.gnu.org/pub/gnu/emacs/windows/</a><span id="goog_1852639586"></span> . Należy wybrać możliwie najnowszą wersję. Oczywiście najlepiej rozpakować pobrane archiwum do katalogu głównego na jakimś dysku i nie używać w nazwie spacji. Dotyczy to wszystkiego co tutaj wykonuję. U siebie daję go do C:\Emacs. Dodaję do PATH także katalog C:\Emacs\bin. <br />
<br />
<a name='more'></a><br /><br />
Leiningen dla Windows pobieram stąd: <span id="goog_1852639591"></span><a href="http://www.blogger.com/">https://raw.github.com/technomancy/leiningen/stable/bin/lein.bat </a><span id="goog_1852639592"></span>. Można go wrzucić do katalogu Windows i tak sobie załatwić problem ustawiania ścieżek, ale lepiej utworzyć nowy katalog w katalogu głównym na dysku, tam go skopiować i ustawić odpowiednio PATH by tam wskazywał. Po tej operacji z linii poleceń trzeba wywołać: <span style="font-family: "Courier New", Courier, monospace;">lein self-install</span> .<br />
<br />
Kolejny krok to uruchomienie Emacs w trybie administratora i wydanie polecenia (otworzy się plik do edycji):<br />
<br />
<span style="font-family: "Courier New", Courier, monospace;">C-x C-f ~/.emacs</span><br />
<br />
po czym wklejenie tekstu:<br />
<br />
<pre><span class="p">(</span><span class="nb">require</span> <span class="ss">'package</span><span class="p">)</span>
<span class="p">(</span><span class="nv">add-to-list</span> <span class="ss">'package-archives</span>
<span class="o">'</span><span class="p">(</span><span class="s">"marmalade"</span> <span class="o">.</span> <span class="s">"http://marmalade-repo.org/packages/"</span><span class="p">))</span>
<span class="p">(</span><span class="nv">package-initialize</span><span class="p">)</span></pre>
<br />
zapis i wydanie polecenia:<br />
<br />
<span style="font-family: "Courier New", Courier, monospace;">M-x eval-buffer</span><br />
<br />
Teraz najlepiej uruchomić Emacs ponownie i wydać polecenie, które wyświetli paczki:<br />
<br />
<span style="font-family: "Courier New", Courier, monospace;">M-x package-list-packages</span><br />
<br />
Trzeba znaleźć nrepl i ustwić kursor w linku, po czym wcisnąć Enter, a w drugim oknie pokaże się info pakietu z przyciskiem 'Install'. Klikam i gotowe. Teraz należy dodać: <br />
<span style="font-family: "Courier New", Courier, monospace;"><span class="p">[</span><span class="nv">org.clojure/tools.nrepl</span> <span class="s">"0.2.1"</span></span><span class="p"><span style="font-family: "Courier New", Courier, monospace;">]</span> pod :dependencies w pliku projektu Leiningena. Następnie otworzyć plik dowolny z kodem z katalogu projektu i wywołać <span style="font-family: "Courier New", Courier, monospace;">M-x nrepl-jack-in</span>.</span>Anonymoushttp://www.blogger.com/profile/08198769559694742403noreply@blogger.com0tag:blogger.com,1999:blog-5397603151062338268.post-78973534182100692412013-01-26T14:20:00.000+01:002013-01-27T14:18:50.240+01:00Smalltalk and Seaside part 4.<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8rjItnZ2SDmORgec6chfu9ZfsgF94Kie54BjFbtbvTWt5ii0dBu3MN9i7tPR_kibWTiexkPoWM4CzdEVCjx_ZdwuXPN2eg5XTyE9uokp1pBKZa38AdyqSzsAUI9zGr-p3hzTOw7xfD1c/s1600/SmalltalkBalloon1998.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8rjItnZ2SDmORgec6chfu9ZfsgF94Kie54BjFbtbvTWt5ii0dBu3MN9i7tPR_kibWTiexkPoWM4CzdEVCjx_ZdwuXPN2eg5XTyE9uokp1pBKZa38AdyqSzsAUI9zGr-p3hzTOw7xfD1c/s320/SmalltalkBalloon1998.jpg" width="258" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="background-color: white; color: #424242; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 12px; line-height: 16px;">(c) Robert Tinney</span></td></tr>
</tbody></table>
This time this blog post is in English. I decided to change language when I saw link to my blog at <a href="http://seaside.st/">Seaside.st</a>. The other reason is that Google's translator just sucks. I hope to suck less.<br />
<br />
Post 4 is the last post from the series about HTML parsing and presenting results in form of a web page using Smalltalk and Seaside. All these posts about Smalltalk were my attempt to find out for myself what this language is really about. A year ago I didn't even know about it's existence. My programming world till that time was wrapped mainly in C/C++ and Java. So I thought I'll try some of it in action and that the best way to grab a bit of it is to try it in practice and to solidify that experience on a blog. Well, actually Smalltalk was the main reason for this blog to show up. At the same time I also found Clojure. Both of these as languages just blown my C/Java mind away. Smalltalk is impossibly simple language and has a very helpful IDE (a REAL IDE not just some editor with syntax highlighter and fancy keyboard shortcuts that spit out code or strictly said: vomit code at you). Seaside is also one of the most brilliant ideas I've seen. To efficiently build apps with Seaside actually all you need is a basic knowledge of HTML and CSS and surprisingly no JavaScript - I didn't need it through the whole creation process. Less is better. ;) I find the idea about Smalltalk application image far superior than Java libraries and whats more, easier way to share applications than using jars. For example, I don't have to do anything with my application if I want run it on Android - just copy and run ( thanks to this project: <a href="http://code.google.com/p/squeakvm-tablet/">http://code.google.com/p/squeakvm-tablet/</a> ). Can you do it in Java? You can't!<br />
<br />
So lets get back to play. Last time I left, my blog comments reader was in the state where i had to manually add entries to collection, comments were looking ugly, there was no way to remove entry form collection, etc...<br />
<br />
This time I wont show any code here (as a text). I decided to share whole one-click Pharo image where you can experiment with. Ill just describe what my objects do.<br />
<br />
First, I'll show you the final look:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmNzUYB8eWNLh_8ZSU4hyvdEOdURfyvSH0ZBV42yaOWErP0wZQZPo8dHe63nb_e38qVsz_l-iDMCKNkwa4smShwth7OYQ1_iWTU235XUyZo6Nn2FF0LAepyKX2D1j3eH-p9WmYENFtqHE/s1600/blog.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="393" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmNzUYB8eWNLh_8ZSU4hyvdEOdURfyvSH0ZBV42yaOWErP0wZQZPo8dHe63nb_e38qVsz_l-iDMCKNkwa4smShwth7OYQ1_iWTU235XUyZo6Nn2FF0LAepyKX2D1j3eH-p9WmYENFtqHE/s640/blog.JPG" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Well, at least it is not as scary looking as last one...</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
The minus sign removes entry , + button displays DPDialog, and U button updates comments.</div>
<div class="separator" style="clear: both; text-align: left;">
DPDialog looks like this:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2Zv5ZQaxWEL5gWQ5C60KkEf54RFc0P0CQ15R7Mvgq55Kili2F0AU30mWRblNszqv67E8XYdwScZxg2RdkWEkyBGV5lpXFnbg2xrhX1OqDtQpB5vSNhFY13XtYvqoHaJTUNWtkqTknD9k/s1600/dialog.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="230" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2Zv5ZQaxWEL5gWQ5C60KkEf54RFc0P0CQ15R7Mvgq55Kili2F0AU30mWRblNszqv67E8XYdwScZxg2RdkWEkyBGV5lpXFnbg2xrhX1OqDtQpB5vSNhFY13XtYvqoHaJTUNWtkqTknD9k/s320/dialog.JPG" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Some code:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHrXeBjMURbf1Z_QvFDRI5oyyrQe0_A4rcMep3uz3WgtPgBtaLNJ8ANOJpLMS8Zp7mAx6Npan5AR1mXNBqTnc9q-cdgbmCIhonWlxRjfjhOXOPw3o-HMg-_MYa5rGBAh_47FyoBpGcGMM/s1600/dhtml.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="242" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHrXeBjMURbf1Z_QvFDRI5oyyrQe0_A4rcMep3uz3WgtPgBtaLNJ8ANOJpLMS8Zp7mAx6Npan5AR1mXNBqTnc9q-cdgbmCIhonWlxRjfjhOXOPw3o-HMg-_MYa5rGBAh_47FyoBpGcGMM/s320/dhtml.JPG" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
A you can see its a jQuery dialog, simple, nothing fancy. Code under submitButton checks if user entered a valid URL (its valid if it can be read from). If its OK then DPRoot class adds blog entry to its internal list and then tries to parse comments from given URL.<br />
<br />
CSS code is kept within object called DPCSSLibrary. Adding library is simple, just follow this: <a href="http://book.seaside.st/book/in-action/serving-files/filelibraries/creating">http://book.seaside.st/book/in-action/serving-files/filelibraries/creating</a> . <br />
<br />
Here is the graphical description of how tabs bar is created:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUvJpFhsNn52ke8W0JnGEpknJHMURpWgkjeZFCLjbOQhDNsmLF0620AkCoR3HuKazA3Xz8PPR5L3K-G3XFvMNtpQlCznLw2u51DwshhmSiC6Lv2AztTSogiQc_G6I6bSp1sqWQsJ7rqXI/s1600/scheme.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="214" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUvJpFhsNn52ke8W0JnGEpknJHMURpWgkjeZFCLjbOQhDNsmLF0620AkCoR3HuKazA3Xz8PPR5L3K-G3XFvMNtpQlCznLw2u51DwshhmSiC6Lv2AztTSogiQc_G6I6bSp1sqWQsJ7rqXI/s320/scheme.JPG" width="320" /></a></div>
<br />
<br />
Updated DPComment rendering method:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCHvs5dzfYE_ueqLQLNCPznkCYyteIaAI6k-q1HtUXjR5hrnnLtGv84NkylkjT8NyFCSSrFY0vFL2J4oI1Y4k96kK9IVeo8U6GZ8wRYEkP8fI1Gq3xm8v0HhRV1h43QKw8Eh1jNw4sKn4/s1600/comm.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="130" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCHvs5dzfYE_ueqLQLNCPznkCYyteIaAI6k-q1HtUXjR5hrnnLtGv84NkylkjT8NyFCSSrFY0vFL2J4oI1Y4k96kK9IVeo8U6GZ8wRYEkP8fI1Gq3xm8v0HhRV1h43QKw8Eh1jNw4sKn4/s320/comm.JPG" width="320" /></a></div>
This method checks if its instance variable (DPComments object sets it when creating new DPComment) is false or true naming div element accordingly, so its later possible to apply a proper CSS code.<br />
<br />
Whole application as One-click archive: <a href="https://dl.dropbox.com/u/71388328/DP-OneClick.zip">https://dl.dropbox.com/u/71388328/DP-OneClick.zip</a>Anonymoushttp://www.blogger.com/profile/08198769559694742403noreply@blogger.com0tag:blogger.com,1999:blog-5397603151062338268.post-74252653289364035952012-12-20T19:19:00.002+01:002013-01-31T21:00:45.598+01:00Clojure z Emacs i Leiningen 2<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdEeyFVc0ry6woqUd_PN-CpFY9_XZOJqJKmTur5xFhACKInoCj0x3hyphenhyphenfzioRoZzGsymu6TQ6KrrTZnq5vsyXIgkjv5nHosjNRmebV5DOkhAnA0ewGpDL7XzPHDoVtYedfduojV9_AlMAw/s1600/clojure.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdEeyFVc0ry6woqUd_PN-CpFY9_XZOJqJKmTur5xFhACKInoCj0x3hyphenhyphenfzioRoZzGsymu6TQ6KrrTZnq5vsyXIgkjv5nHosjNRmebV5DOkhAnA0ewGpDL7XzPHDoVtYedfduojV9_AlMAw/s1600/clojure.png" /></a><br />
<blockquote class="tr_bq">
<span style="font-family: inherit;">"<span style="background-color: white; color: #333333; line-height: 22px;">Leiningen is for automating Clojure projects without setting your hair on fire."</span></span></blockquote>
- czyli jak krok po kroku przygotować Emacsa do współpracy z Clojure i Leiningen. Podam też sposób jad dołączać własne biblioteki do projektu przy użyciu Maven.<br />
<br />
<br />
Instalacja będzie prowadzona na systemie Ubuntu 12.10 x64. Jeżeli ktoś zauważy jakieś niezgodności, to proszę o komentarz.<br />
<br />
Leinngen jest menedżerem pakietów dla projektów Clojure. Ma on ułatwić pracę z zależnościami. Jednak nie ma tak pięknie jak można by się spodziewać na pierwszy rzut oka. Jeżeli pakietów nie ma w repozytorium Clojure, to trzeba stworzyć sobie własne. O tym na końcu.<br />
<br />
<b>Krok 1: Instalacja Emacs 24.x i Leiningen 2</b><br />
<br />
Najprościej jest to zrobić z terminala tymi poleceniami:<br />
<br />
<span style="font-family: 'Courier New', Courier, monospace;">sudo apt-get install emacs24</span><br />
<span style="font-family: Courier New, Courier, monospace;">wget https://raw.github.com/technomancy/leiningen/preview/bin/lein</span><br />
<span style="font-family: Courier New, Courier, monospace;">chmod 755 lein</span><br />
<span style="font-family: Courier New, Courier, monospace;">sudo mv lein /usr/bin</span><br />
<span style="font-family: Courier New, Courier, monospace;">lein self-install</span><br />
<br />
<br />
<b>Krok 2: Konfiguracja Emacs </b><br />
<br />
Poleceniem z konsoli uruchmić:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">emacs ~/.emacs.d/init.el</span><br />
<br />
Wkleić to i zapisać:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">(require 'package)</span><br />
<span style="font-family: Courier New, Courier, monospace;">(add-to-list 'package-archives</span><br />
<span style="font-family: Courier New, Courier, monospace;"> '("marmalade" . "http://marmalade-repo.org/packages/"))</span><br />
<span style="font-family: Courier New, Courier, monospace;">(package-initialize)</span><br />
<br />
Potem (M-x to klawisz Alt+x, po wciśnięciu wpisać resztę polecenia):<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">M-x eval-buffer</span><br />
<br />
<b>Krok 3: Instalacja wtyczki <span style="font-family: Courier New, Courier, monospace;">clojure-mode</span></b><br />
<br />
Teraz trzeba załadować listę pakietów. Nie wiem dlaczego tak, ale sposób podany na Github u mnie nie zadziałał, więc metodą prób i błędów tak mi się udało.<br />
<br />
Trzeba wyświetlić listę pakietów poleceniem:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">M-x package-list-packages </span><br />
<br />
Znaleźć pakiet <span style="font-family: Courier New, Courier, monospace;">clojure-mode</span>. Kliknąć [Install] i zamknąć Emacs.<br />
<br />
<b>Krok 4: Przykładowy projekt</b><br />
<br />
Utworzyć projekt poleceniem w terminalu:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">lein new clojure-projekt1</span><br />
<br />
Następnie wejść do katalogu projektu i edytować plik konfiguracji <span style="font-family: Courier New, Courier, monospace;">project.clj</span><span style="font-family: inherit;">. Emacs by widzieć projekt musi być uruchamiany z katalogu głównego projektu:</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;">cd clojure-projekt1</span><br />
<span style="font-family: Courier New, Courier, monospace;">emacs project.clj</span><br />
<br />
Wkleić tę linijkę:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">:plugins [[lein-swank "1.4.4"]]</span><br />
<br />
nad linijkę z <span style="font-family: Courier New, Courier, monospace;">:dependencies</span><br />
<br />
W Emacs uruchomić serwer Swank poleceniem:<br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;">M-x clojure-jack-in</span><br />
<br />
I voila ;). Powinien się pokazać REPL.<br />
<br />
<b>Przykładowe polecenia przydatne przy współpracy z Emacs i SLIME </b>(C - Ctrl, M - Alt):<br />
<br />
<br />
<br />
<li style="background-color: white; border: 0px; color: #333333; line-height: 22px; margin: 0px; padding: 0px;"><strong style="border: 0px; margin: 0px; padding: 0px;"><span style="font-family: Courier New, Courier, monospace;">M-.</span><span style="font-family: inherit;"> </span></strong><span style="font-family: inherit;">: Skok do definicji var-a</span></li>
<li style="background-color: white; border: 0px; color: #333333; line-height: 22px; margin: 0px; padding: 0px;"><strong style="border: 0px; margin: 0px; padding: 0px;"><span style="font-family: Courier New, Courier, monospace;">M-TAB</span></strong><span style="font-family: inherit;"> lub </span><strong style="border: 0px; margin: 0px; padding: 0px;"><span style="font-family: Courier New, Courier, monospace;">C-c TAB</span></strong><span style="font-family: inherit;">: Autouzupełnianie symbolu w miejscu kursora</span></li>
<li style="background-color: white; border: 0px; color: #333333; line-height: 22px; margin: 0px; padding: 0px;"><strong style="border: 0px; margin: 0px; padding: 0px;"><span style="font-family: Courier New, Courier, monospace;">C-x C-e</span></strong><span style="font-family: inherit;">: Wykonaj wyrażenie pod kursorem</span></li>
<li style="background-color: white; border: 0px; color: #333333; line-height: 22px; margin: 0px; padding: 0px;"><strong style="border: 0px; margin: 0px; padding: 0px;"><span style="font-family: Courier New, Courier, monospace;">C-c C-k</span></strong><span style="font-family: inherit;">: Skompiluj bieżący burfor</span></li>
<li style="background-color: white; border: 0px; color: #333333; line-height: 22px; margin: 0px; padding: 0px;"><strong style="border: 0px; margin: 0px; padding: 0px;"><span style="font-family: Courier New, Courier, monospace;">C-c C-l</span></strong><span style="font-family: inherit;">: Załaduj bieżący bufor i wymuś przeładowanie wymaganych przestrzeni nazw</span></li>
<li style="background-color: white; border: 0px; color: #333333; line-height: 22px; margin: 0px; padding: 0px;"><strong style="border: 0px; margin: 0px; padding: 0px;"><span style="font-family: Courier New, Courier, monospace;">C-M-x</span></strong><span style="font-family: inherit;">: Skompiluj najbardziej zewnętrzne wyrażenie pod kursorem</span></li>
<li style="background-color: white; border: 0px; color: #333333; line-height: 22px; margin: 0px; padding: 0px;"><strong style="border: 0px; margin: 0px; padding: 0px;"><span style="font-family: Courier New, Courier, monospace;">C-c S-i</span></strong><span style="font-family: inherit;">: Podejrzyj wartość</span></li>
<li style="background-color: white; border: 0px; color: #333333; line-height: 22px; margin: 0px; padding: 0px;"><strong style="border: 0px; margin: 0px; padding: 0px;"><span style="font-family: Courier New, Courier, monospace;">C-c C-m</span></strong><span style="font-family: inherit;">: Wykonaj macroexpand dla wyrażenia pod kursorem</span></li>
<li style="background-color: white; border: 0px; color: #333333; line-height: 22px; margin: 0px; padding: 0px;"><strong style="border: 0px; margin: 0px; padding: 0px;"><span style="font-family: Courier New, Courier, monospace;">C-c C-d C-d</span></strong><span style="font-family: inherit;">: Przeszukaj dokumentacje dla var-a</span></li>
<li style="background-color: white; border: 0px; color: #333333; line-height: 22px; margin: 0px; padding: 0px;"><strong style="border: 0px; margin: 0px; padding: 0px;"><span style="font-family: Courier New, Courier, monospace;">C-c C-z</span></strong><span style="font-family: inherit;">: Przełącz się pomiędzy buforem Clojure a REPL</span></li>
<li style="background-color: white; border: 0px; color: #333333; line-height: 22px; margin: 0px; padding: 0px;"><strong style="border: 0px; margin: 0px; padding: 0px;"><span style="font-family: Courier New, Courier, monospace;">C-c M-p</span></strong><span style="font-family: inherit;">: Zmien przestrzeń nazw w REPL dla odpowiedniej z bieżącego bufora</span></li>
<li style="background-color: white; border: 0px; color: #333333; line-height: 22px; margin: 0px; padding: 0px;"><strong style="border: 0px; margin: 0px; padding: 0px;"><span style="font-family: Courier New, Courier, monospace;">C-c C-w c</span></strong><span style="font-family: inherit;">: Wyświetl funkcje wywołujące bieżącą funkcję</span></li>
<span style="color: #333333;"><span style="line-height: 22px;"><br /></span></span><br />
<span style="color: #333333;"><span style="line-height: 22px;"><b><br /></b></span></span>
<span style="color: #333333;"><span style="line-height: 22px;"><b>Dodawanie własnych bibliotek do projektu</b></span></span><br />
<span style="color: #333333;"><span style="line-height: 22px;"><br /></span></span>
<span style="color: #333333;"><span style="line-height: 22px;">Najpierw trzeba zainstalować Maven2:</span></span><br />
<span style="color: #333333;"><span style="line-height: 22px;"><br /></span></span>
<span style="font-family: Courier New, Courier, monospace;">sudo apt-get install maven2</span><br />
<br />
Następnie trzeba mieć jakąś bibliotekę w bieżącym katalogu, np. <span style="font-family: 'Courier New', Courier, monospace;">ormlite-core-4.42.jar</span><span style="font-family: inherit;">.</span><br />
<span style="font-family: inherit;">Poleceniem poniżej dodaje się taką bibliotekę do lokalnego repozytorium mavena:</span><br />
<br />
<br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;">mvn install:install-file \</span><br />
<span style="font-family: Courier New, Courier, monospace;"> -Dfile=ormlite-core-4.42.jar \</span><br />
<span style="font-family: Courier New, Courier, monospace;"> -DgroupId=self \</span><br />
<span style="font-family: Courier New, Courier, monospace;"> -DartifactId=ormlite-core \</span><br />
<span style="font-family: Courier New, Courier, monospace;"> -Dversion=4.42 \</span><br />
<span style="font-family: Courier New, Courier, monospace;"> -Dpackaging=jar \</span><br />
<span style="font-family: Courier New, Courier, monospace;"> -DgeneratePom=true</span><br />
<br />
<br />
<br />
Po pozytywnym przetworzeniu powinien pojawić się napis BUILD SUCCESSFUL. Następnie do pliku projektu w sekcji <span style="font-family: Courier New, Courier, monospace;">:dependencies</span> trzeba dodać linijkę i zapisać:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">[self/ormlite-core "4.42"]</span><br />
<br />
Następnie w katalogu projektu w terminalu dać polecenie:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">lein deps</span><br />
<br />
I to wszystko. ;)<br />
<br />
<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/08198769559694742403noreply@blogger.com0tag:blogger.com,1999:blog-5397603151062338268.post-23743382894006880352012-12-17T15:22:00.004+01:002012-12-17T17:41:40.750+01:00Light Table : Factorial funNiedawno na kickstarter.com wystartował projekt IDE dla języka Clojure przez człowieka o nazwisku Chris Granger. Dzisiaj zaprezentuję działanie części edytora: Instarepl. Jest to moduł, w którym można testować kod. Ma tę przewagę nad innymi REPL-ami, że widać wyniki działania poszczególnych poleceń. Nie tylko po wykonaniu polecenia, ale też aktualizację innych w historii jeżeli wcześniejszy kod coś pozmienia. Jak dla mnie bajka. Dawno czegoś takiego nie widziałem. Ekran Instarepl jest podzielony na dwa obszary. Z lewej strony mamy edytor kodu, z prawej kod, i wyniki działanaia. W wynikach przez ciała funkcji zamiast symboli przewijają się dane i widać jak przechodzą przez kolejne polecenia. W przypadku pętli zauważyłem, że widać tylko ostatnią iterację.<br />
<br />
Light table można pobrać z <a href="http://app.kodowa.com/playground">tej strony</a>. Wymagane jest JDK Javy. Przy pierwszym uruchomieniu program pobiera niezbędne biblioteki. Proces ten trwa dość długo, więc nie należy się przerażać, że aplikacja "wisi". Najlepiej za pierwszym razem uruchomić w konsoli poleceniem <i>"java -jar launcher.jar",</i> bo będzie widać przebieg instalacji. Program także doinstalowuje biblioteki przy przejściu do części projektowej : Table.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1aQ9R-nBvAmRvWBQokMjjfmZ9LfkPaXtHm8JCIcUY1MtUjXu_wsNuO0A7VTjoS5xMlG0la0GUDOy-0j2HFPh5BNYHPtiiFmW6RzpArvSUjEsd1MULGpRwbyvvMzoyFWw6lhhHKJmCx_Y/s1600/Zrzut+ekranu+z+2012-12-17+14:53:41.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="250" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1aQ9R-nBvAmRvWBQokMjjfmZ9LfkPaXtHm8JCIcUY1MtUjXu_wsNuO0A7VTjoS5xMlG0la0GUDOy-0j2HFPh5BNYHPtiiFmW6RzpArvSUjEsd1MULGpRwbyvvMzoyFWw6lhhHKJmCx_Y/s400/Zrzut+ekranu+z+2012-12-17+14:53:41.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Widok główny Light Table</td></tr>
</tbody></table>
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-7WWFXOeo6evEsfObFPdEB0c3zDDkPvl1UpVY7n-Nk2gMiSrpDRc55_Dc4eJSYNjmHdo8J2hv-0wdqcJp19tLta6JVafgG4nL2Cudj7FTuAOgpd7PI9IbPiWfNIqDATewDNHbWnk9WhY/s1600/Zrzut+ekranu+z+2012-12-17+14:55:20.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="250" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-7WWFXOeo6evEsfObFPdEB0c3zDDkPvl1UpVY7n-Nk2gMiSrpDRc55_Dc4eJSYNjmHdo8J2hv-0wdqcJp19tLta6JVafgG4nL2Cudj7FTuAOgpd7PI9IbPiWfNIqDATewDNHbWnk9WhY/s400/Zrzut+ekranu+z+2012-12-17+14:55:20.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Widok Instarepl</td></tr>
</tbody></table>
<br />
Jak widać na zrzucie ekranu Instarepl wyjście funkcji, które piszą do standardowego wyjścia (terminal/konsola) umieszczane jest na końcu bloku wyników pod linijką "Output:".<br />
<br />
Część Table wygląda tak:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaark-bconTIo_uB13gOQVaPQhJA_PzkhZQZU9G9fSbKLVwvRO3hDFW2NuWqD6dz6vGl2f1Jr78xuFPvFyawi_jhvLUzT5uIc3DYCo_klg358hhY9K7c4e3hQeiTx-MeU3ToPQ64Ax-c0/s1600/Zrzut+ekranu+z+2012-12-17+15:09:54.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaark-bconTIo_uB13gOQVaPQhJA_PzkhZQZU9G9fSbKLVwvRO3hDFW2NuWqD6dz6vGl2f1Jr78xuFPvFyawi_jhvLUzT5uIc3DYCo_klg358hhY9K7c4e3hQeiTx-MeU3ToPQ64Ax-c0/s400/Zrzut+ekranu+z+2012-12-17+15:09:54.png" width="400" /></a></div>
<br />
Z lewej pokazują się bloki funkcji, które można edytować. Polecam zapoznać się ze skrótami klawiszowymi, bo w widoku nie ma żadnych przycisków, czy menu z komendami.<br />
<br />
Z prawej strony ekranu na górze w lewym okienku jest widok przestrzeni nazw. Każda przestrzeń nazw zawiera funkcje, które wyświetlają się w prawym okienku. Niżej na czerwono jest brudnopis do testowania kodu, a jeszcze niżej w zielonym polu pojawiają się wyniki działania funkcji z brudnopisu lub programu. Widać, że autor wzorował się na browserze kodu Smalltalka. Według mnie to dobre rozwiązanie, a przydałaby się jeszcze możliwość podziału funkcji na własne kategorie.<br />
<br />
Dodam, że to IDE jest w wersji alpha, więc zawiera bugi i nie jest tak rozbudowane jak można by sobie życzyć (np. brak refaktoringu). Jednak w porównaniu do wtyczek Clojure do Eclipse czy Intellij IDEA program ten to ogromny krok naprzód i z przyjemnością się z nim pracuje.<br />
<br />
Na koniec załączam gwóźdź programu, czyli film z testowania Instarepl, na przykładzie realizacji funkcji liczącej silnię z testami ze strony 4Clojure.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/D9wD709ccY4?feature=player_embedded' frameborder='0'></iframe></div>
<br />
Pod koniec filmu mam małą przywieszkę z tego względu, że nie zauważyłem błędu w funkcji, a środowisko czasem lubi się przywiesić. Np. w wyniku edycji funkcji, program wpadnie w nieskończoną pętlę. Ten fakt można poznać po zwiększonym zużyciu procesora, lagowaniu interfejsu i braku reakcji na zmiany kodu (factorial3 zawsze pokazywał 1). To mnie wprowadziło w błąd.<br />
<br />
Projekt Light Table jest bardzo ciekawy, więc mam nadzieję, że nie tylko mnie przypadnie do gustu. :)Anonymoushttp://www.blogger.com/profile/08198769559694742403noreply@blogger.com0tag:blogger.com,1999:blog-5397603151062338268.post-15174048105615133012012-12-11T16:12:00.003+01:002012-12-14T16:24:41.048+01:00Smalltalk : Seaside z użyciem Pharo, cz.3<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8rjItnZ2SDmORgec6chfu9ZfsgF94Kie54BjFbtbvTWt5ii0dBu3MN9i7tPR_kibWTiexkPoWM4CzdEVCjx_ZdwuXPN2eg5XTyE9uokp1pBKZa38AdyqSzsAUI9zGr-p3hzTOw7xfD1c/s1600/SmalltalkBalloon1998.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8rjItnZ2SDmORgec6chfu9ZfsgF94Kie54BjFbtbvTWt5ii0dBu3MN9i7tPR_kibWTiexkPoWM4CzdEVCjx_ZdwuXPN2eg5XTyE9uokp1pBKZa38AdyqSzsAUI9zGr-p3hzTOw7xfD1c/s320/SmalltalkBalloon1998.jpg" width="258" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="background-color: white; color: #424242; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 12px; line-height: 16px;">(c) Robert Tinney</span></td></tr>
</tbody></table>
<br />
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">Mam
już schemat jak wyciągnąć komentarze z dowolnego bloga, to teraz
czas na część wizualną. Tak jak poprzednio, najpierw z grubsza
opiszę poszczególne kroki. Film z podsumowaniem dam na końcu.
Jako, że film byłby dość długi gdyby pokazywać tworzenie kodu
to pokażę w nim tylko jak wygląda struktura pakietu i kod. Z
poprzedniej części mam już w zasadzie napisaną podstawę
pojedynczej funkcji, która odczyta komentarze z podanego adresu URL
i zwróci tablicę komentarzy. Najpierw jednak opiszę jak utworzyć
komponent w Seaside.</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">Otwieram
System Browser i zaczynam od utworzenia kategorii (paczki obiektów).
Prawy myszki na liście kategorii i klikam "Add category...".
Jako, że tworzę pod portal dobreprogramy.pl, utworzę kategorię
DobreprogramyAPI.</span><br />
<br />
</div>
<span style="font-family: Calibri, sans-serif; font-size: large;"><b>Tworzenie
komponentu głównego</b></span><br />
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">Ten
komponent będzie odpowiadać za zawartość strony głównej. To
wszystko o czym będę pisać jest także dostępne dostępne w
<a href="http://book.seaside.st/book/getting-started/pharo/first-component/package" target="_blank">dokumentacji
Seaside.</a>. Kasą główną komponentów jest klasa WAComponent. Po
niej odziedziczę funkcjonalność na potrzeby mojej nowej klasy
"DPRoot":</span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div dir="LTR" id="highlighter_306757">
<table cellpadding="0" cellspacing="0" style="width: 327px;">
<colgroup><col width="327"></col>
</colgroup><tbody>
<tr>
<td style="border: none; padding: 0cm;" width="327"><div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">WAComponent</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
subclass: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;"><span style="font-size: small;"><b>#DPRoot</b></span></span></span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"> </code><code class="western"><span style="font-family: Courier New, monospace;">instanceVariableNames:
</span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">''</span></span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"> </code><code class="western"><span style="font-family: Courier New, monospace;">classVariableNames:
</span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">''</span></span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"> </code><code class="western"><span style="font-family: Courier New, monospace;">poolDictionaries:
</span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">''</span></span></code></div>
<code class="western"> </code><code class="western"><span style="font-family: Courier New, monospace;">category:
</span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">'DobreprogramyAPI'</span></span></code></td>
</tr>
</tbody></table>
</div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">Pierwsze
co trzeba zrobić, to utworzyć metodę "initialize":</span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div dir="LTR" id="highlighter_139611">
<table cellpadding="0" cellspacing="0" style="width: 214px;">
<colgroup><col width="214"></col>
</colgroup><tbody>
<tr>
<td style="border: none; padding: 0cm;" width="214"><div style="margin-bottom: 0cm;">
<code class="western"><span style="font-family: Courier New, monospace;"><span style="font-size: small;"><b>initialize</b></span></span></code></div>
<code class="western"> </code><code class="western"><span style="color: teal;"><span style="font-family: Courier New, monospace;">super</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
initialize.</span></code></td>
</tr>
</tbody></table>
</div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">Metoda
"initialize" jest metodą wywoływaną zaraz po utworzeniu
obiektu, m.in. po wywołaniu metody "new". Dobrą praktyką
jest wywołać metodę "initialize" obiektu nadrzędnego za
pomocą metody "super". Zielona strzałka do góry, która
się pokaże obok nazwy metody mówi, że moja metoda nadpisuje
metodę z klasy nadrzędnej.</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">Kolejnym
krokiem będzie utworzenie metody, która wyświetli coś na stronie.
Na chwilę obecną dam jakiś prosty tekst byle zobaczyć, czy
działa. Metoda ta posiada określona nazwę, bo Seaside przeszukując
obiekty i wyświetlając zawartość szuka właśnie jej:</span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div dir="LTR" id="highlighter_396357">
<table cellpadding="0" cellspacing="0" style="width: 307px;">
<colgroup><col width="307"></col>
</colgroup><tbody>
<tr>
<td style="border: none; padding: 0cm;" width="307"><div style="margin-bottom: 0cm;">
<code class="western"><span style="font-family: Courier New, monospace;"><span style="font-size: small;"><b>renderContentOn:</b></span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
</span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">html</span></span></code></div>
<code class="western"> </code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">html
</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">paragraph:
</span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">'Alibaba'</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">.</span></code></td>
</tr>
</tbody></table>
</div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">Jako,
że obiekt DPRoot jest obiektem głównym, trzeba zaznaczyć to
tworząc metodę, która poinformuje framework Seaside. W części
klasowej trzeba utworzyć metodę:</span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div dir="LTR" id="highlighter_50940">
<table cellpadding="0" cellspacing="0" style="width: 136px;">
<colgroup><col width="136"></col>
</colgroup><tbody>
<tr>
<td style="border: none; padding: 0cm;" width="136"><div style="margin-bottom: 0cm;">
<code class="western"><span style="font-family: Courier New, monospace;"><span style="font-size: small;"><b>canBeRoot</b></span></span></code></div>
<code class="western"> </code><code class="western"><span style="color: teal;">^</span></code><code class="western">
</code><code class="western"><span style="color: maroon;"><span style="font-family: Courier New, monospace;">true</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">.</span></code></td>
</tr>
</tbody></table>
</div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">Dzięki
niej Seaside będzie widzieć obiekt w przeglądarce aplikacji.</span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif; font-size: large;"><i><b>Rejestracja
komponentu jako aplikacji</b></i></span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">W
przeglądarce przechodzę pod adres http://localhost:8080/config .
Klikam w Add na pasku menu. W pole wpisuję 'dp' i wybieram typ jako
Application. OK. W sekcji General na kolejnej stronie jako 'Root
class' wybieram DPRoot. Klik w Apply. Teraz przechodząc pod adres
localhost:8080/dp powinien się wyświetlić Alibaba... Jest. ;)</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">To
samo można zrobić wywołując w Workspace polecenie:</span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div dir="LTR" id="highlighter_288739">
<table cellpadding="0" cellspacing="0" style="width: 489px;">
<colgroup><col width="489"></col>
</colgroup><tbody>
<tr>
<td style="border: none; padding: 0cm;" width="489"><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">WAAdmin</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
register: </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">DPRoot</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
asApplicationAt: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">'dp'</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">.</span></code></td>
</tr>
</tbody></table>
</div>
<div style="margin-bottom: 0cm;">
<br />
<a name='more'></a><br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif; font-size: large;"><i><b>Tworzenie
elementu, który wyświetli pojedynczy komentarz</b></i></span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">Komponent
tworzę tak samo jak komponent główny, z jednym wyjątkiem.
Komponent będzie posiadać prywatne pola, przechowujące dane nicku,
logo i treść komentarza:</span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div dir="LTR" id="highlighter_457623">
<table cellpadding="0" cellspacing="0" style="width: 485px;">
<colgroup><col width="485"></col>
</colgroup><tbody>
<tr>
<td style="border: none; padding: 0cm;" width="485"><div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">WAComponent</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
subclass: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">#DPKoment</span></span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"> </code><code class="western"><span style="font-family: Courier New, monospace;">instanceVariableNames:
</span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">'nick
imgUrl text'</span></span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"> </code><code class="western"><span style="font-family: Courier New, monospace;">classVariableNames:
</span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">''</span></span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"> </code><code class="western"><span style="font-family: Courier New, monospace;">poolDictionaries:
</span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">''</span></span></code></div>
<code class="western"> </code><code class="western"><span style="font-family: Courier New, monospace;">category:
</span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">'DobreprogramyAPI'</span></span></code></td>
</tr>
</tbody></table>
</div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">Teraz
trzeba utworzyć gettery i settery. Najlepiej zaznaczyć obiekt
DPKoment, potem prawym myszki klik, wybrać Refactor class ->
Accessors i kliknąć Accept. OK. Można teraz modyfikować zmienne
instancji po utworzeniu obiektu. Aby oszczędzić sobie zachodu
niepotrzebnym późniejszym pisaniem trzeba jeszcze utworzyć
konstruktor na postawie tych zmiennych. Tworzę go w części
klasowej obiektu:</span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div dir="LTR" id="highlighter_825679">
<table cellpadding="0" cellspacing="0" style="width: 674px;">
<colgroup><col width="674"></col>
</colgroup><tbody>
<tr>
<td style="border: none; padding: 0cm;" width="674"><div style="margin-bottom: 0cm;">
<code class="western"><span style="font-family: Courier New, monospace;"><span style="font-size: small;"><b>nick:</b></span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
</span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">aNick</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
</span></code><code class="western"><span style="font-family: Courier New, monospace;"><span style="font-size: small;"><b>imgUrl:</b></span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
</span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">aImgUrl</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
</span></code><code class="western"><span style="font-family: Courier New, monospace;"><span style="font-size: small;"><b>text:</b></span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
</span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">aText</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">.</span></code></div>
<code class="western"> </code><code class="western"><span style="color: teal;">^</span></code><code class="western">
(</code><code class="western"><span style="color: teal;"><span style="font-family: Courier New, monospace;">self</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
new) nick: </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">aNick</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">;
imgUrl: </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">aImgUrl</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">;
text: </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">aText</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">.</span></code></td>
</tr>
</tbody></table>
</div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">Czas
na metodę renderContentOn:. Będzie dość prymitywna. Upiększanie
będzie dalej w części z CSS. Teraz tylko oznaczę odpowiednio
klasy tagów.</span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div dir="LTR" id="highlighter_751926">
<table cellpadding="0" cellspacing="0" style="width: 780px;">
<colgroup><col width="780"></col>
</colgroup><tbody>
<tr>
<td style="border: none; padding: 0cm;" width="780"><div style="margin-bottom: 0cm;">
<code class="western"><span style="font-family: Courier New, monospace;"><span style="font-size: small;"><b>renderContentOn:</b></span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
</span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">html</span></span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"> </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">html</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
div class: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">'komentarz'</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">;</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"> </code><code class="western"><span style="font-family: Courier New, monospace;">with:
[</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"> </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">html</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
div class: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">'nick'</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">;
with: </span></code><code class="western"><span style="color: teal;"><span style="font-family: Courier New, monospace;">self</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
nick.</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"> </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">html</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
div class: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">'image'</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">;
with: [</span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">html</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
image url: </span></code><code class="western"><span style="color: teal;"><span style="font-family: Courier New, monospace;">self</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
imgUrl].</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"> </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">html</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
div class:</span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">
'text'</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">;
with: </span></code><code class="western"><span style="color: teal;"><span style="font-family: Courier New, monospace;">self</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
text.</span></code></div>
<code class="western"> ].</code></td>
</tr>
</tbody></table>
</div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">Użyłem
tu kilku słów kluczowych takich jak: div, class image. Odpowiadają
one odpowiednikom z HTML zgodnie z <a href="http://book.seaside.st/book/fundamentals/rendering-components/learning-canvas-and-brush" target="_blank">tym</a>
wykazem pod kolumną 'Factory Selector'.</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">Zmieniam
metodę renderującą klasy DPRoot na taką, by wypróbować czy
działa:</span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div dir="LTR" id="highlighter_540006">
<table cellpadding="0" cellspacing="0" style="width: 1185px;">
<colgroup><col width="1185"></col>
</colgroup><tbody>
<tr>
<td style="border: none; padding: 0cm;" width="1185"><div style="margin-bottom: 0cm;">
<code class="western"><span style="font-family: Courier New, monospace;"><span style="font-size: small;"><b>renderContentOn:</b></span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
</span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">html</span></span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"> | </code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">tmp</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
|</span></code></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"> </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">tmp</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
:= </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">DPKoment</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
nick: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">'test
nick'</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
imgUrl:
</span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">'http://localhost:8080/files/WAWelcomeFiles/seasidestar.png'</span></span></code><code class="western"><span style="font-family: Courier New, monospace;"> </span></code><br />
<code class="western"><span style="font-family: Courier New, monospace;"> text: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">'tekst'</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">.</span></code></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<code class="western"> </code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">html</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
paragraph: </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">tmp</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">.</span></code></td>
</tr>
</tbody></table>
</div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">Wygląda
to mniej więcej tak:</span></div>
<div style="margin-bottom: 0cm;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7SvxA1S_hzkVO5BJiB-tYh1TDeDYd1xeFdHQ60-3CeolFmU9iTPyyEgeAEUTRyurX8IDDhx1UDejZQVQ6mUqhI6tTs5D68cgmrhyphenhyphenrVqU_naTVUA9uBL4NvtF_kGNN1DAjFUHFeR1DOZs/s1600/20121001175424_0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="248" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7SvxA1S_hzkVO5BJiB-tYh1TDeDYd1xeFdHQ60-3CeolFmU9iTPyyEgeAEUTRyurX8IDDhx1UDejZQVQ6mUqhI6tTs5D68cgmrhyphenhyphenrVqU_naTVUA9uBL4NvtF_kGNN1DAjFUHFeR1DOZs/s400/20121001175424_0.png" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<span style="font-family: Calibri, sans-serif;">Mając
gotowy komponent można spróbować pobrać i wyświetlić komentarze
z bloga DP. Najlepiej będzie to zrobić tworząc obiekt, który
przechwyci listę przez parametr i wyświetli ją w sobie. Nazwę go
'DPKomentList'.</span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div dir="LTR" id="highlighter_984121">
<table cellpadding="0" cellspacing="0" style="width: 436px;">
<colgroup><col width="436"></col>
</colgroup><tbody>
<tr>
<td style="border: none; padding: 0cm;" width="436"><div style="margin-bottom: 0cm;">
<code class="western"><span style="font-family: Courier New, monospace;">W</span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">AComponent</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
subclass: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">#DPKomentList</span></span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"> </code><code class="western"><span style="font-family: Courier New, monospace;">instanceVariableNames:
</span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">''</span></span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"> </code><code class="western"><span style="font-family: Courier New, monospace;">classVariableNames:
</span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">''</span></span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"> </code><code class="western"><span style="font-family: Courier New, monospace;">poolDictionaries:
</span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">''</span></span></code></div>
<code class="western"> </code><code class="western"><span style="font-family: Courier New, monospace;">category:
</span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">'DobreprogramyAPI'</span></span></code></td>
</tr>
</tbody></table>
</div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">DPkomentList
będzie mieć konstruktor, który za parametr bierze listę z
komentarzami</span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div dir="LTR" id="highlighter_452092">
<table cellpadding="0" cellspacing="0" style="width: 373px;">
<colgroup><col width="373"></col>
</colgroup><tbody>
<tr>
<td style="border: none; padding: 0cm;" width="373"><div style="margin-bottom: 0cm;">
<code class="western"><span style="font-family: Courier New, monospace;"><span style="font-size: small;"><b>fromList:</b></span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
</span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">aList</span></span></code></div>
<code class="western"> </code><code class="western"><span style="color: teal;">^</span></code><code class="western">
(</code><code class="western"><span style="color: teal;"><span style="font-family: Courier New, monospace;">self
</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">new)
comments: </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">aList</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">.</span></code></td>
</tr>
</tbody></table>
</div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">oraz
metodę instancji i zmienną która przechowa przekazane komentarze
do wyświetlenia: 'comments'. Mając te rzeczy można napisać metodę
renderującą:</span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div dir="LTR" id="highlighter_741381">
<table cellpadding="0" cellspacing="0" style="width: 1037px;">
<colgroup><col width="1037"></col>
</colgroup><tbody>
<tr>
<td style="border: none; padding: 0cm;" width="1037"><div style="margin-bottom: 0cm;">
<code class="western"><span style="font-family: Courier New, monospace;"><span style="font-size: small;"><b>renderContentOn:</b></span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
</span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">html</span></span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"> |
</code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">dpk</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
|</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"> (</code><code class="western"><span style="font-family: Courier New, monospace;">self
comments) do: [ :</span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">koment</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
| </span></code>
</div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"> </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">dpk</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
:= </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">DPKoment</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
nick: (</span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">koment</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
at: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">#nick</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">)
imgUrl: (</span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">koment</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
at: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">#img</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">)
text: (</span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">koment</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
at: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">#text</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">).</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"> </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">html</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
paragraph: </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">dpk</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">.</span></code></div>
<code class="western"> ]</code></td>
</tr>
</tbody></table>
</div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">Jako,
że komentarze będą aktualizowane z jednego miejsca utworzę
zmienną klasową w obiekcie DPRoot o nazwie blogData. Oczywiście
tworzę metody dostępu do tej zmiennej. blogData ma postać listy,
której elementy to obiekty Dictionary:</span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div dir="LTR" id="highlighter_96319">
<table cellpadding="0" cellspacing="0" style="width: 710px;">
<colgroup><col width="710"></col>
</colgroup><tbody>
<tr>
<td style="border: none; padding: 0cm;" width="710"><code class="western"><span style="font-family: Courier New, monospace;"><span style="font-size: small;"><i>pseudo
kod: OrderedCollection : ( Dictionary : #url, #name,
#data).</i></span></span></code></td>
</tr>
</tbody></table>
</div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">Po
stronie klasy tworzę metodę, która wyciąga z adresu url bloga
komentarze. Metoda ma taki sam wygląd jak w poprzednim wpisie o
Pharo:</span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div dir="LTR" id="highlighter_857361">
<table cellpadding="0" cellspacing="0" style="width: 877px;">
<colgroup><col width="877"></col>
</colgroup><tbody>
<tr>
<td style="border: none; padding: 0cm;" width="877"><div style="margin-bottom: 0cm;">
<code class="western"><span style="font-family: Courier New, monospace;"><span style="font-size: small;"><b>commentsFromUrl:</b></span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
</span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">aUrl</span></span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western">| </code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">zupa
root komentIDregX komentClass imgClass nickClass komentSoups
komenty koment</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
|</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">zupa</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
:= </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">Soup</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
fromUrl: </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">aUrl</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">.</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">root</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
:= </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">zupa</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
findTagByID: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">'ctl00_phContentLeft_panUpdateComment'</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">.</span></code></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">komentIDregX</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
:= </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">'komentarz_[0-9]+'</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">.</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">komentClass</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
:= </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">'text-h75
tresc'</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">.</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">imgClass</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
:= </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">'border
small float-left'</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">.</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">nickClass</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
:= </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">'text-h65
font-heading display-inl_blk nick'</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">.</span></code></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">komentSoups</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
:= </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">root</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
findAllTagsByIDregX: </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">komentIDregX</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">.</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">komenty</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
:= </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">OrderedCollection</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
new.</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">komentSoups</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
do: [ :</span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">ks</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
|</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"> </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">koment</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
:= </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">Dictionary</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
new.</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"> </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">koment</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
at: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">#nick</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
put: (</span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">ks</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
findTagByClass: </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">nickClass</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">)
text.</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"> </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">koment</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
at: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">#img</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
put: (</span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">ks</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
findTagByClass: </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">imgClass</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">)
src.</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"> </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">koment</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
at: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">#text</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
put: (</span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">ks</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
findTagByClass: </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">komentClass</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">)
text.</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"> </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">komenty</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
add: </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">koment</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">.</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"> ].</code></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<code class="western"><span style="color: teal;">^</span></code><code class="western">
</code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">komenty</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">.</span></code></td>
</tr>
</tbody></table>
</div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">To
jest metoda statyczna dostępna z dowolnego obiektu. Wykorzystam ją
w metodzie inicjalizacyjnej DPRoot, którą rozszerzę do postaci:</span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div dir="LTR" id="highlighter_30629">
<table cellpadding="0" cellspacing="0" style="width: 738px;">
<colgroup><col width="738"></col>
</colgroup><tbody>
<tr>
<td style="border: none; padding: 0cm;" width="738"><div style="margin-bottom: 0cm;">
<code class="western"><span style="font-family: Courier New, monospace;"><span style="font-size: small;"><b>initialize</b></span></span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"> |
</code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">tmp</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
|</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: teal;"><span style="font-family: Courier New, monospace;">super</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
initialize.</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"> </code> </div>
<div style="margin-bottom: 0cm;">
<code class="western"> (</code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">DPRoot</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
blogData) ifNil: [ </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">DPRoot</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
blogData: </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">OrderedCollection</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
new.].</span></code></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<code class="western"> </code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">tmp</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
:= </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">OrderedCollection</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
new. </span></code>
</div>
<div style="margin-bottom: 0cm;">
<code class="western"> </code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">DPRoot</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
blogData do: [ :</span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">data</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
|</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"> </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">data</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
at: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">#data</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
put: (</span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">DPRoot</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
commentsFromUrl: (</span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">data</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
at: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">#url</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">)).</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"> </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">tmp</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
add: </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">data</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">.</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"> ].</code></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<code class="western"><span style="color: #2323dc;"> </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">DPRoot</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
blogData: </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">tmp</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">.</span></code></td>
</tr>
</tbody></table>
</div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">Metoda
ta uzupełnia pole #data w słowniku na liście na podstawie pola
#url. Słowniki przy dodawaniu bloga do listy wyświetlania posiadają
zainicjowane tylko pola #url i #name. Pole #name to czytelna nazwa
bloga.</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">Metodę
renderContentOn: z tej klasy zmienia poniższą:</span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div dir="LTR" id="highlighter_21557">
<table cellpadding="0" cellspacing="0" style="width: 768px;">
<colgroup><col width="768"></col>
</colgroup><tbody>
<tr>
<td style="border: none; padding: 0cm;" width="768"><div style="margin-bottom: 0cm;">
<code class="western"><span style="font-family: Courier New, monospace;"><span style="font-size: small;"><b>renderContentOn:</b></span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
</span></code><code class="western"><span style="color: #0047ff;"><span style="font-family: Courier New, monospace;">html</span></span></code></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #0047ff;"> </span></code><code class="western"><span style="color: #0047ff;"><span style="font-family: Courier New, monospace;">html</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
div</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"> </code><code class="western"><span style="font-family: Courier New, monospace;">script:
(</span></code><code class="western"><span style="color: #0047ff;"><span style="font-family: Courier New, monospace;">html</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
jQuery new tabs</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"> </code><code class="western"><span style="font-family: Courier New, monospace;">selected:
selectedTab;</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"> </code><code class="western"><span style="font-family: Courier New, monospace;">onSelect:
(</span></code><code class="western"><span style="color: #0047ff;"><span style="font-family: Courier New, monospace;">html</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
jQuery ajax</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"> </code><code class="western"><span style="font-family: Courier New, monospace;">callbackTabs:
[ :</span></code><code class="western"><span style="color: #0047ff;"><span style="font-family: Courier New, monospace;">event</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
| </span></code><code class="western"><span style="color: #0047ff;"><span style="font-family: Courier New, monospace;">selectedTab</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">:=
</span></code><code class="western"><span style="color: #0047ff;"><span style="font-family: Courier New, monospace;">event</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
at: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">#index</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
]));</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"> </code><code class="western"><span style="font-family: Courier New, monospace;">with:
[</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #0047ff;"> </span></code><code class="western"><span style="color: #0047ff;"><span style="font-family: Courier New, monospace;">html</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
unorderedList: [</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #0047ff;"> </span></code><code class="western"><span style="color: #0047ff;"><span style="font-family: Courier New, monospace;">DPRoot</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
blogData do: [ :</span></code><code class="western"><span style="color: #0047ff;"><span style="font-family: Courier New, monospace;">blog</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
|</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #0047ff;"> </span></code><code class="western"><span style="color: #0047ff;"><span style="font-family: Courier New, monospace;">html</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
listItem: [</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #0047ff;"> </span></code><code class="western"><span style="color: #0047ff;"><span style="font-family: Courier New, monospace;">html</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
anchor</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"> </code><code class="western"><span style="font-family: Courier New, monospace;">url:
(</span></code><code class="western"><span style="color: #0047ff;"><span style="font-family: Courier New, monospace;">html</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
jQuery ajax</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"> </code><code class="western"><span style="color: #0047ff;"><span style="font-family: Courier New, monospace;">html</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">:
(</span></code><code class="western"><span style="color: #0047ff;"><span style="font-family: Courier New, monospace;">DPKomentList</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
fromList: (</span></code><code class="western"><span style="color: #0047ff;"><span style="font-family: Courier New, monospace;">blog</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
at: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">#data</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
));</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"> </code><code class="western"><span style="font-family: Courier New, monospace;">fullUrl);</span></code></div>
<code class="western"> </code><code class="western"><span style="font-family: Courier New, monospace;">with:
(</span></code><code class="western"><span style="color: #0047ff;"><span style="font-family: Courier New, monospace;">blog</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
at: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">#name</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">)
]]]]</span></code></td>
</tr>
</tbody></table>
</div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">Jest
to lekko przerobiona metoda z przykładu do jQuery (
http://demo.seaside.st/javascript/jquery-ui/tabswidget ). Służy ona
do wyświetlania kilku wpisów jako listę z zakładkami. Jest tu
dodatkowa zmienna, która służy do zapamiętywania aktualnie
wybranej zakładki: selectedTab. Przy zapisie metody, gdy edytor
zapyta się co z nią zrobić, zaznaczam 'declare instance'. Zanim
przejdę do wyświetlania komentarzy dodam sobie dwa testowe blogi do
blogData. W Workspace wpisuję to i daję "Do it":</span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div dir="LTR" id="highlighter_487393">
<table cellpadding="0" cellspacing="0" style="width: 1657px;">
<colgroup><col width="1657"></col>
</colgroup><tbody>
<tr>
<td style="border: none; padding: 0cm;" width="1657"><div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">DPRoot</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
blogData: (</span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">OrderedCollection</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
new).</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">e</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
:= </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">Dictionary</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
new.</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">f</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
:= </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">Dictionary</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
new.</span></code></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">e</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
at: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">#url</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
put:
</span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">'http://...(cut)... .html'</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">;
at: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">#name</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
put: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">'Od
kuchni'</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">;
at: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">#data</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
put: nil.</span></code></div>
<div style="margin-bottom: 0cm;">
<code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">f</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
at:</span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">
#url </span></span></code><code class="western"><span style="font-family: Courier New, monospace;">put:
</span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">'http://...(cut)... .html'</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">;
at: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">#name</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
put: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">'Etui'</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">;
at: </span></code><code class="western"><span style="color: #94006b;"><span style="font-family: Courier New, monospace;">#data</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
put: nil.</span></code></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<code class="western"><span style="color: #0047ff;"><span style="font-family: Courier New, monospace;">DPRoot</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">
blogData add: </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">e</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">;
add: </span></code><code class="western"><span style="color: #2323dc;"><span style="font-family: Courier New, monospace;">f</span></span></code><code class="western"><span style="font-family: Courier New, monospace;">.</span></code></td>
</tr>
</tbody></table>
</div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">Po
przejściu na localhost:8080/dp widać to:</span></div>
<div style="margin-bottom: 0cm;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimrgJYDtr4FOYwTQHNu63vIYZ4CwOeXNpfsjkRyCXAKBR4AaRZh5Doj2DPOBnwDwnio83eusxr2RhSGKXDEjcDxJkQY6nPI_6Z7Wmvb7elypSlEqdk6hH8FTZXV9MUOIiBXtDHr0_4thk/s1600/20121001215212_0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="252" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimrgJYDtr4FOYwTQHNu63vIYZ4CwOeXNpfsjkRyCXAKBR4AaRZh5Doj2DPOBnwDwnio83eusxr2RhSGKXDEjcDxJkQY6nPI_6Z7Wmvb7elypSlEqdk6hH8FTZXV9MUOIiBXtDHr0_4thk/s400/20121001215212_0.png" width="400" /></a></div>
<br /></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">Zwykła
lista bez jQuery. Oczywiście nic się nie wyświetli, bo skrypty
jQuery nie są dodane do konfiguracji. Dodać je można wchodząc w
Configure na dolnym pasku. W sekcji General - Libraries te biblioteki
trzeba ustawić w takiej kolejności:</span></div>
<div style="margin-bottom: 0cm;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjR9z4FFusBJHq9lp-mUEoc26GEC7U-gkleq0KLt5ltndWCzFDH-vmOGV6rVo5RnAKnIiK_q2AlxqJLgZ9AM_yEnRzrY2-l4cgfzoWDboMNLVFP0gNBZ5f6ejWcvHkUwZFLQsAxIFMxpb0/s1600/20121001215320_0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="292" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjR9z4FFusBJHq9lp-mUEoc26GEC7U-gkleq0KLt5ltndWCzFDH-vmOGV6rVo5RnAKnIiK_q2AlxqJLgZ9AM_yEnRzrY2-l4cgfzoWDboMNLVFP0gNBZ5f6ejWcvHkUwZFLQsAxIFMxpb0/s400/20121001215320_0.png" width="400" /></a></div>
<br /></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">Po
modyfikacji powinno być widać to:</span></div>
<div style="margin-bottom: 0cm;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6edV8vCpLH4T78Vw-ThCwoW17rzmnKKFs9MepIYgJ5k9GPhmSaTFwBAiNnighO6Ci6yuFVOwF43Fqy9ZJouXlubHguSXBSnxkA1Q07Ncvtdn6vJY5hPxT5DehzmK8LVWH3Buy5R2aJ2c/s1600/20121001220233_0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="292" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6edV8vCpLH4T78Vw-ThCwoW17rzmnKKFs9MepIYgJ5k9GPhmSaTFwBAiNnighO6Ci6yuFVOwF43Fqy9ZJouXlubHguSXBSnxkA1Q07Ncvtdn6vJY5hPxT5DehzmK8LVWH3Buy5R2aJ2c/s400/20121001220233_0.png" width="400" /></a></div>
<br /></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">a
po kliknięciu w przycisk, to:</span></div>
<div style="margin-bottom: 0cm;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxM9GtXs68aeE195mh4w9B9i0VLQRUWJO5419qptToMD9GLN_B642mJxLiQuFv5eHHmv3s7EZl3sI2ap4zEPkqM-KxagooTL_ogA_s2LJelMmN4S5zkcL4XwS82j1DVI5CiSc_3DdwzWU/s1600/20121001220300_0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="292" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxM9GtXs68aeE195mh4w9B9i0VLQRUWJO5419qptToMD9GLN_B642mJxLiQuFv5eHHmv3s7EZl3sI2ap4zEPkqM-KxagooTL_ogA_s2LJelMmN4S5zkcL4XwS82j1DVI5CiSc_3DdwzWU/s400/20121001220300_0.png" width="400" /></a></div>
<br /></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">Na
dzisiaj wystarczy. W kolejnej części będzie o tym jak dorobić
formularz z możliwością edycji obserwowanych blogów. </span>
</div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Calibri, sans-serif;">I
jeszcze film na koniec z podglądem jak to wszystko wygląda w
Seaside:</span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/Z2hPKEw9WVY?feature=player_embedded' frameborder='0'></iframe></div>
<div style="margin-bottom: 0cm;">
<br /></div>
Anonymoushttp://www.blogger.com/profile/08198769559694742403noreply@blogger.com4tag:blogger.com,1999:blog-5397603151062338268.post-63681973883157512702012-12-08T16:15:00.004+01:002013-01-31T21:01:17.990+01:00Clojure Easy 2<br />
<div style="margin-bottom: 0cm;">
<i>"The computing scientist’s main
challenge is not to get confused by the complexities of his own
making."</i></div>
<div style="margin-bottom: 0cm;">
<i> --- E. W. Dijkstra</i></div>
<div align="CENTER" style="margin-bottom: 0cm;">
<br /></div>
<div align="LEFT" style="margin-bottom: 0cm;">
Czas na kolejną część
zagadek ze strony 4clojure.com.
</div>
<h4>
<br />Problem 9: Fibonacci
Sequence
</h4>
<div align="LEFT" style="margin-bottom: 0cm;">
<br /></div>
<div align="LEFT" style="margin-bottom: 0cm;">
Zadanie polega na napisaniu
funkcji, która zwróci n pierwszych elementów ciągu Fibonacci.
</div>
<div align="LEFT" style="margin-bottom: 0cm;">
Funkcja w E1 bierze za
parametr szukaną liczbę elementów ciągu. Dla pierwszego i
drugiego elementu zwracane są wartości bezpośrednio. Dla dalszych
obliczane są kolejne elementy na podstawie dwóch pierwszych
elementów listy <i>acc. </i>W pętli
zwiększany jest licznik c i dodawana do początku listy acc suma
dwóch poprzednich elementów. Trzeba pamiętać, że funkcja <i>conj</i>
dodaje elementy do list od lewej strony, dlatego aby uzyskać
poprawną odpowiedź trzeba <i>acc</i>
odwrócić przed zwrotem. Odpowiedź E2 jest z wykorzystaniem
wektora.
</div>
<div align="LEFT" style="margin-bottom: 0cm;">
<br /></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;">T1</span><span style="color: #2a00ff;">:</span><span style="color: black;">
</span><span style="color: #cc7a7a;">(</span><span style="color: #7f0055;">=</span><span style="color: black;">
</span><span style="color: #ccb07a;">(</span><span style="color: #7f0055;">__</span><span style="color: black;">
3</span><span style="color: #ccb07a;">)</span><span style="color: black;"> '</span><span style="color: #ccb07a;">(</span><span style="color: black;">1
1 2</span><span style="color: #ccb07a;">)</span><span style="color: #cc7a7a;">)</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;">T2</span><span style="color: #2a00ff;">:</span><span style="color: black;">
</span><span style="color: #cc7a7a;">(</span><span style="color: #7f0055;">=</span><span style="color: black;">
</span><span style="color: #ccb07a;">(</span><span style="color: #7f0055;">__</span><span style="color: black;">
6</span><span style="color: #ccb07a;">)</span><span style="color: black;"> '</span><span style="color: #ccb07a;">(</span><span style="color: black;">1
1 2 3 5 8</span><span style="color: #ccb07a;">)</span><span style="color: #cc7a7a;">)</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;">T3</span><span style="color: #2a00ff;">:</span><span style="color: black;">
</span><span style="color: #cc7a7a;">(</span><span style="color: #7f0055;">=</span><span style="color: black;">
</span><span style="color: #ccb07a;">(</span><span style="color: #7f0055;">__</span><span style="color: black;">
8</span><span style="color: #ccb07a;">)</span><span style="color: black;">
'</span><span style="color: #ccb07a;">(</span><span style="color: black;">1
1 2 3 5 8 13 21</span><span style="color: #ccb07a;">)</span><span style="color: #cc7a7a;">)</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;">E1</span><span style="color: #cc7a7a;">:
(</span><span style="color: #7f0055;"><b>fn</b></span><span style="color: black;">
fiblist [n]</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;"></span><span style="color: #ccb07a;"> (</span><span style="color: #7f0055;"><b>let</b></span><span style="color: black;">
[a '</span><span style="color: #7acc7a;">(</span><span style="color: black;">1</span><span style="color: #7acc7a;">)</span><span style="color: black;">
b '</span><span style="color: #7acc7a;">(</span><span style="color: black;">1 1</span><span style="color: #7acc7a;">)</span><span style="color: black;">]</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;"></span><span style="color: #7acc7a;"> (</span><span style="color: #7f0055;"><b>cond</b></span><span style="color: black;">
</span><span style="color: #7accb0;">(</span><span style="color: #7f0055;">=</span><span style="color: black;">
n 1</span><span style="color: #7accb0;">)</span><span style="color: black;"> a</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;"></span><span style="color: #7accb0;"> (</span><span style="color: #7f0055;">=</span><span style="color: black;">
n 2<span style="color: #7accb0;">)</span><span style="color: black;">
b</span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;"></span><span style="color: #2a00ff;"> :else<span style="color: black;">
</span><span style="color: #7accb0;">(</span><span style="color: #7f0055;"><b>loop</b></span><span style="color: black;">
[c 2 acc b]</span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;"></span><span style="color: #7ab0cc;"> (</span><span style="color: #7f0055;"><b>if</b></span><span style="color: black;">
</span><span style="color: #7a7acc;">(</span><span style="color: #7f0055;">>=</span><span style="color: black;">
c n</span><span style="color: #7a7acc;">)</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;"></span><span style="color: #7a7acc;"> (</span><span style="color: #7f0055;">reverse</span><span style="color: black;">
acc</span><span style="color: #7a7acc;">)</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;"></span><span style="color: #7a7acc;"> (</span><span style="color: #7f0055;"><b>recur</b></span><span style="color: black;">
</span><span style="color: #b07acc;">(</span><span style="color: #7f0055;">inc</span><span style="color: black;">
c</span><span style="color: #b07acc;">)</span><span style="color: black;"> </span>
</span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;"></span><span style="color: #b07acc;"> (</span><span style="color: #7f0055;">conj</span><span style="color: black;">
acc </span><span style="color: #cc7ab0;">(</span><span style="color: #7f0055;">+</span><span style="color: black;">
</span><span style="color: #cc7a7a;">(</span><span style="color: #7f0055;">first</span><span style="color: black;">
acc</span><span style="color: #cc7a7a;">)</span><span style="color: black;">
</span><span style="color: #cc7a7a;">(</span><span style="color: #7f0055;">second</span><span style="color: black;">
acc</span><span style="color: #cc7a7a;">)</span><span style="color: #cc7ab0;">)</span><span style="color: #b07acc;">)</span><span style="color: #7a7acc;">)</span><span style="color: #7ab0cc;">)</span><span style="color: #7accb0;">)</span><span style="color: #7acc7a;">)</span><span style="color: #ccb07a;">)</span><span style="color: #cc7a7a;">)</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<br /></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;">E2 : <span style="color: #cc7a7a;">(</span><span style="color: #7f0055;"><b>fn</b></span><span style="color: black;">
fiblist [n]</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;"></span><span style="color: #ccb07a;"> (</span><span style="color: #7f0055;"><b>let</b></span><span style="color: black;">
[a [1] b [1 1]]</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;"></span><span style="color: #7acc7a;"> (</span><span style="color: #7f0055;"><b>cond</b></span><span style="color: black;">
</span><span style="color: #7accb0;">(</span><span style="color: #7f0055;">=</span><span style="color: black;">
n 1</span><span style="color: #7accb0;">)</span><span style="color: black;"> a</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;"></span><span style="color: #7accb0;"> (</span><span style="color: #7f0055;">=</span><span style="color: black;">
n 2<span style="color: #7accb0;">)</span><span style="color: black;">
b</span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;"></span><span style="color: #2a00ff;"> :else<span style="color: black;">
</span><span style="color: #7accb0;">(</span><span style="color: #7f0055;"><b>loop</b></span><span style="color: black;">
[c 2 acc b]</span></span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;"></span><span style="color: #7ab0cc;"> (</span><span style="color: #7f0055;"><b>if</b></span><span style="color: black;">
</span><span style="color: #7a7acc;">(</span><span style="color: #7f0055;">>=</span><span style="color: black;">
c n</span><span style="color: #7a7acc;">)</span></span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> acc</span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;"></span><span style="color: #7a7acc;"> (</span><span style="color: #7f0055;"><b>recur</b></span><span style="color: black;">
</span><span style="color: #b07acc;">(</span><span style="color: #7f0055;">inc</span><span style="color: black;">
c</span><span style="color: #b07acc;">)</span><span style="color: black;"> </span></span><br />
<span style="font-family: Courier New, Courier, monospace;"><span style="color: #b07acc;"> (</span><span style="color: #7f0055;">conj</span><span style="color: black;">
acc </span><span style="color: #cc7ab0;">(</span><span style="color: #7f0055;">+</span><span style="color: black;">
</span><span style="color: #cc7a7a;">(</span><span style="color: #7f0055;">acc</span><span style="color: black;">
</span><span style="color: #ccb07a;">(</span><span style="color: #7f0055;">-</span><span style="color: black;">
c 1</span><span style="color: #ccb07a;">)</span><span style="color: #cc7a7a;">)</span><span style="color: black;">
</span><span style="color: #cc7a7a;">(</span><span style="color: #7f0055;">acc</span><span style="color: black;">
</span><span style="color: #ccb07a;">(</span><span style="color: #7f0055;">-</span><span style="color: black;">
c 2</span><span style="color: #ccb07a;">)</span><span style="color: #cc7a7a;">)</span><span style="color: #cc7ab0;">)</span><span style="color: #b07acc;">)</span><span style="color: #7a7acc;">)</span><span style="color: #7ab0cc;">)</span><span style="color: #7accb0;">)</span><span style="color: #7acc7a;">)</span><span style="color: #ccb07a;">)</span><span style="color: #cc7a7a;">)</span></span></div>
<h4>
<br />Problem 10: Maximum value</h4>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
Zadanie polega na napisaniu funkcji,
która zwróci parametr o największej wartości.</div>
<div style="margin-bottom: 0cm;">
Haczyk: nie można użyć funkcji max i
max-key.</div>
<div style="margin-bottom: 0cm;">
<br />
Zanim podam wynik wyjaśnię na przykładzie jak to jest z przekazywaniem argumentów do funkcji:<br />
<br />
<span style="color: black; font-family: 'Courier New', Courier, monospace;">=>
</span><span style="color: #cc7a7a; font-family: 'Courier New', Courier, monospace;">(</span><span style="color: #ccb07a; font-family: 'Courier New', Courier, monospace;">(</span><span style="color: #7f0055; font-family: 'Courier New', Courier, monospace;"><b>fn</b></span><span style="color: black; font-family: 'Courier New', Courier, monospace;">
f [a b & more] more</span><span style="color: #ccb07a; font-family: 'Courier New', Courier, monospace;">)</span><span style="color: black; font-family: 'Courier New', Courier, monospace;">
1 2 3 4</span><span style="color: #cc7a7a; font-family: 'Courier New', Courier, monospace;">)</span><br />
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: #cc7a7a;">(</span><span style="color: black;">3
4</span><span style="color: #cc7a7a;">)</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;">=>
</span><span style="color: #cc7a7a;">(</span><span style="color: #ccb07a;">(</span><span style="color: #7f0055;"><b>fn</b></span><span style="color: black;">
f [a & more] more</span><span style="color: #ccb07a;">)</span><span style="color: black;">
1 2 3 4</span><span style="color: #cc7a7a;">)</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: #cc7a7a;">(</span><span style="color: black;">2
3 4</span><span style="color: #cc7a7a;">)</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;">=>
</span><span style="color: #cc7a7a;">(</span><span style="color: #ccb07a;">(</span><span style="color: #7f0055;"><b>fn</b></span><span style="color: black;">
f [& more] more</span><span style="color: #ccb07a;">)</span><span style="color: black;">
1 2 3 4</span><span style="color: #cc7a7a;">)</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: #cc7a7a;">(</span><span style="color: black;">1
2 3 4</span><span style="color: #cc7a7a;">)</span></span></div>
<br />
Przed znakiem & argumenty przypisywane są jak leci 1 do a, 2 do b, itd. Po znaku & reszta argumentów traktowana jest jako lista. W przypadku braku identyfikatorów przed & wszystkie argumenty traktowane są jako lista. Oczywiście a, b, more i args mogą mieć dowolne nazwy.<br />
<br /></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;">T1</span><span style="color: #2a00ff;">:
</span><span style="color: #cc7a7a;">(</span><span style="color: #7f0055;">=</span><span style="color: black;">
</span><span style="color: #ccb07a;">(</span><span style="color: #7f0055;">__</span><span style="color: black;">
1 8 3 4</span><span style="color: #ccb07a;">)</span><span style="color: black;">
8</span><span style="color: #cc7a7a;">)</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;">T2</span><span style="color: #2a00ff;">:
</span><span style="color: #cc7a7a;">(</span><span style="color: #7f0055;">=</span><span style="color: black;">
</span><span style="color: #ccb07a;">(</span><span style="color: #7f0055;">__</span><span style="color: black;">
30 20</span><span style="color: #ccb07a;">)</span><span style="color: black;"> 30</span><span style="color: #cc7a7a;">)</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;">T3</span><span style="color: #2a00ff;">:
</span><span style="color: #cc7a7a;">(</span><span style="color: #7f0055;">=</span><span style="color: black;">
</span><span style="color: #ccb07a;">(</span><span style="color: #7f0055;">__</span><span style="color: black;">
45 67 11</span><span style="color: #ccb07a;">)</span><span style="color: black;">
67</span><span style="color: #cc7a7a;">)</span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;">E1:<span style="color: #cc7a7a;">(</span><span style="color: #7f0055;"><b>fn</b></span><span style="color: black;">
maxx [& args]</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;"></span><span style="color: #ccb07a;"> (</span><span style="color: #7f0055;"><b>loop</b></span><span style="color: black;">
[e </span><span style="color: #7acc7a;">(</span><span style="color: #7f0055;">first</span><span style="color: black;">
args</span><span style="color: #7acc7a;">)</span><span style="color: black;"> </span>
</span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;"> re <span style="color: #7acc7a;">(</span><span style="color: #7f0055;">rest</span><span style="color: black;">
args</span><span style="color: #7acc7a;">)</span><span style="color: black;"> </span></span>
</span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: black; font-family: Courier New, Courier, monospace;"> mx e]</span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;"></span><span style="color: #7acc7a;"> (</span><span style="color: #7f0055;"><b>if</b></span><span style="color: black;">
</span><span style="color: #7accb0;">(</span><span style="color: #7f0055;">empty?</span><span style="color: black;">
re</span><span style="color: #7accb0;">)</span><span style="color: black;"> </span>
</span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: black; font-family: Courier New, Courier, monospace;"> mx</span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;"></span><span style="color: #7accb0;"> (</span><span style="color: #7f0055;"><b>recur</b></span><span style="color: black;">
</span><span style="color: #7ab0cc;">(</span><span style="color: #7f0055;">first</span><span style="color: black;">
re</span><span style="color: #7ab0cc;">)</span><span style="color: black;">
</span><span style="color: #7ab0cc;">(</span><span style="color: #7f0055;">rest</span><span style="color: black;">
re</span><span style="color: #7ab0cc;">)</span><span style="color: black;">
</span><span style="color: #7ab0cc;">(</span><span style="color: #7f0055;"><b>if</b></span><span style="color: black;">
</span><span style="color: #7a7acc;">(</span><span style="color: #7f0055;">></span><span style="color: black;">
e mx</span><span style="color: #7a7acc;">)</span><span style="color: black;">
e mx</span><span style="color: #7ab0cc;">)</span><span style="color: #7accb0;">)</span><span style="color: #7acc7a;">)</span><span style="color: #ccb07a;">)</span><span style="color: #cc7a7a;">)</span></span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<h4>
Problem 11: Get the Caps</h4>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
Zadanie: Znaleźć funkcję, która z
podanego łańcucha znaków zwróci łańcuch zawierający tylko
wielkie litery. Łańcuchy tekstowe w Clojure to zwykłe String z
Javy, więc będą na nich działać funkcje z Javy. Aby dostać
listę wielkich liter trzeba przefiltrować tekst za pomocą funkcji
<i>filter</i>, którą następnie
trzeba złączyć w napis przy użyciu funkcji <i>str</i>
i <i>apply</i>.</div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;">T1</span><span style="color: #2a00ff;">:</span><span style="color: black;">
</span><span style="color: #cc7a7a;">(</span><span style="color: #7f0055;">=</span><span style="color: black;">
</span><span style="color: #ccb07a;">(</span><span style="color: #7f0055;">__</span><span style="color: black;">
</span><span style="color: #2a00ff;">"HeLlO, WoRlD!"</span><span style="color: #ccb07a;">)</span><span style="color: black;">
</span><span style="color: #2a00ff;">"HLOWRD"</span><span style="color: #cc7a7a;">)</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;">T2</span><span style="color: #2a00ff;">:</span><span style="color: black;">
</span><span style="color: #cc7a7a;">(</span><span style="color: #7f0055;">empty?</span><span style="color: black;">
</span><span style="color: #ccb07a;">(</span><span style="color: #7f0055;">__</span><span style="color: black;">
</span><span style="color: #2a00ff;">"nothing"</span><span style="color: #ccb07a;">)</span><span style="color: #cc7a7a;">)</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;">T3</span><span style="color: #2a00ff;">:</span><span style="color: black;">
</span><span style="color: #cc7a7a;">(</span><span style="color: #7f0055;">=</span><span style="color: black;">
</span><span style="color: #ccb07a;">(</span><span style="color: #7f0055;">__</span><span style="color: black;">
</span><span style="color: #2a00ff;">"$#A(*&987Zf"</span><span style="color: #ccb07a;">)</span><span style="color: black;">
</span><span style="color: #2a00ff;">"AZ"</span><span style="color: #cc7a7a;">)</span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;">E1</span><span style="color: #2a00ff;">:</span><span style="color: black;">
</span><span style="color: #cc7a7a;">#(</span><span style="color: #7f0055;">apply</span><span style="color: black;">
str </span><span style="color: #ccb07a;">(</span><span style="color: #7f0055;">filter</span><span style="color: black;">
</span><span style="color: #7acc7a;">(</span><span style="color: #7f0055;"><b>fn</b></span><span style="color: black;">
[c] </span><span style="color: #7accb0;">(</span><span style="color: #7f0055;"><i>Character/isUpperCase</i></span><span style="color: black;">
c</span><span style="color: #7accb0;">)</span><span style="color: #7acc7a;">)</span><span style="color: black;">
%</span><span style="color: #ccb07a;">)</span><span style="color: #cc7a7a;">)</span></span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<h4>
Problem 12: Intro to some</h4>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
Należy podać wynik działania funkcji
<i>some. </i>Funkcja ta bierze za
pierwszy parametr funkcję, która zwraca logiczną prawdę lub fałsz
, oraz kolekcję, której elementy będą przekazywane do tej
funkcji. Jeżeli wynikiem działania funkcji będzie <i>true</i>
to zostanie zwrócony pierwszy element dla którego warunek został
spełniony.</div>
<div align="LEFT" style="margin-bottom: 0cm;">
<br /></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<br /></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;">T1:
</span><span style="color: #cc7a7a;">(</span><span style="color: #7f0055;">=</span><span style="color: black;">
__ </span><span style="color: #ccb07a;">(</span><span style="color: #7f0055;">some</span><span style="color: black;">
#{2 7 6} [5 6 7 8]</span><span style="color: #ccb07a;">)</span><span style="color: #cc7a7a;">)</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;">T2:</span><span style="color: #cc7a7a;">
(</span><span style="color: #7f0055;">=</span><span style="color: black;"> __ </span><span style="color: #ccb07a;">(</span><span style="color: #7f0055;">some</span><span style="color: black;">
</span><span style="color: #7acc7a;">#(</span><span style="color: #7f0055;"><b>when</b></span><span style="color: black;">
</span><span style="color: #7accb0;">(</span><span style="color: #7f0055;">even?</span><span style="color: black;">
%</span><span style="color: #7accb0;">)</span><span style="color: black;"> %</span><span style="color: #7acc7a;">)</span><span style="color: black;">
[5 6 7 8]</span><span style="color: #ccb07a;">)</span><span style="color: #cc7a7a;">)</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;">E1:
6</span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<h4>
Problem 13: Duplicate a sequence</h4>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
Zadanie polega na napisaniu funkcji,
która powtórzy elementy sekwencji dwukrotnie.</div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="color: black;"> </span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;">T1:
</span><span style="color: #cc7a7a;">(</span><span style="color: #7f0055;">=</span><span style="color: black;">
</span><span style="color: #ccb07a;">(</span><span style="color: #7f0055;">__</span><span style="color: black;">
[1 2 3]</span><span style="color: #ccb07a;">)</span><span style="color: black;">
'</span><span style="color: #ccb07a;">(</span><span style="color: black;">1 1 2 2 3
3</span><span style="color: #ccb07a;">)</span><span style="color: #cc7a7a;">)</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;">T2:
</span><span style="color: #cc7a7a;">(</span><span style="color: #7f0055;">=</span><span style="color: black;">
</span><span style="color: #ccb07a;">(</span><span style="color: #7f0055;">__</span><span style="color: black;">
[</span><span style="color: #2a00ff;">:a</span><span style="color: black;"> </span><span style="color: #2a00ff;">:a</span><span style="color: black;">
</span><span style="color: #2a00ff;">:b</span><span style="color: black;"> </span><span style="color: #2a00ff;">:b</span><span style="color: black;">]</span><span style="color: #ccb07a;">)</span><span style="color: black;">
'</span><span style="color: #ccb07a;">(</span><span style="color: #2a00ff;">:a</span><span style="color: black;">
</span><span style="color: #2a00ff;">:a</span><span style="color: black;"> </span><span style="color: #2a00ff;">:a</span><span style="color: black;">
</span><span style="color: #2a00ff;">:a</span><span style="color: black;"> </span><span style="color: #2a00ff;">:b</span><span style="color: black;">
</span><span style="color: #2a00ff;">:b</span><span style="color: black;"> </span><span style="color: #2a00ff;">:b</span><span style="color: black;">
</span><span style="color: #2a00ff;">:b</span><span style="color: #ccb07a;">)</span><span style="color: #cc7a7a;">)</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;">T3:
</span><span style="color: #cc7a7a;">(</span><span style="color: #7f0055;">=</span><span style="color: black;">
</span><span style="color: #ccb07a;">(</span><span style="color: #7f0055;">__</span><span style="color: black;">
[[1 2] [3 4]]</span><span style="color: #ccb07a;">)</span><span style="color: black;">
'</span><span style="color: #ccb07a;">(</span><span style="color: black;">[1 2] [1
2] [3 4] [3 4]</span><span style="color: #ccb07a;">)</span><span style="color: #cc7a7a;">)</span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;">E1:
</span><span style="color: #ccb07a;">#(</span><span style="color: #7f0055;"><b>if</b></span><span style="color: black;">
</span><span style="color: #7acc7a;">(</span><span style="color: #7f0055;">empty?</span><span style="color: black;">
%1</span><span style="color: #7acc7a;">)</span><span style="color: black;"> []</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;"></span><span style="color: #7acc7a;"> (</span><span style="color: #7f0055;"><b>loop</b></span><span style="color: black;">
[a </span><span style="color: #7accb0;">(</span><span style="color: #7f0055;">first</span><span style="color: black;">
%1</span><span style="color: #7accb0;">)</span><span style="color: black;"> r </span><span style="color: #7accb0;">(</span><span style="color: #7f0055;">rest</span><span style="color: black;">
%1</span><span style="color: #7accb0;">)</span><span style="color: black;"> ac [a
a]]</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;"></span><span style="color: #7accb0;"> (</span><span style="color: #7f0055;"><b>if</b></span><span style="color: black;">
</span><span style="color: #7ab0cc;">(</span><span style="color: #7f0055;">empty?</span><span style="color: black;">
r</span><span style="color: #7ab0cc;">)</span><span style="color: black;"> ac </span>
</span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;"></span><span style="color: #7ab0cc;"> (</span><span style="color: #7f0055;"><b>let</b></span><span style="color: black;">
[s </span><span style="color: #7a7acc;">(</span><span style="color: #7f0055;">first</span><span style="color: black;">
r</span><span style="color: #7a7acc;">)</span><span style="color: black;">]</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;"></span><span style="color: #7a7acc;"> (</span><span style="color: #7f0055;"><b>recur</b></span><span style="color: black;">
s </span><span style="color: #b07acc;">(</span><span style="color: #7f0055;">rest</span><span style="color: black;">
r</span><span style="color: #b07acc;">)</span><span style="color: black;">
</span><span style="color: #b07acc;">(</span><span style="color: #7f0055;">conj</span><span style="color: black;">
ac s s</span><span style="color: #b07acc;">)</span><span style="color: #7a7acc;">)</span><span style="color: #7ab0cc;">)</span><span style="color: #7accb0;">)</span><span style="color: #7acc7a;">)</span><span style="color: #ccb07a;">)</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div align="LEFT" style="margin-bottom: 0cm; text-indent: 0.01cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;">E2:
</span><span style="color: #cc7a7a;">#(</span><span style="color: #7f0055;">interleave</span>
%1 %1<span style="color: #cc7a7a;">)</span></span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<h4>
Problem 14: Implement range</h4>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
Zadanie polega na napisaniu
odpowiednika funkcji <i>range</i> .
</div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;">T1:
</span><span style="color: #cc7a7a;">(</span><span style="color: #7f0055;">=</span><span style="color: black;">
</span><span style="color: #ccb07a;">(</span><span style="color: #7f0055;">__</span><span style="color: black;">
1 4</span><span style="color: #ccb07a;">)</span><span style="color: black;">
'</span><span style="color: #ccb07a;">(</span><span style="color: black;">1
2 3</span><span style="color: #ccb07a;">)</span><span style="color: #cc7a7a;">)</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;">T2:
</span><span style="color: #cc7a7a;">(</span><span style="color: #7f0055;">=</span><span style="color: black;">
</span><span style="color: #ccb07a;">(</span><span style="color: #7f0055;">__</span><span style="color: black;">
-2 2</span><span style="color: #ccb07a;">)</span><span style="color: black;"> '</span><span style="color: #ccb07a;">(</span><span style="color: black;">-2
-1 0 1</span><span style="color: #ccb07a;">)</span><span style="color: #cc7a7a;">)</span></span></div>
<div align="LEFT" style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;">T3:
</span><span style="color: #cc7a7a;">(</span><span style="color: #7f0055;">=</span><span style="color: black;">
</span><span style="color: #ccb07a;">(</span><span style="color: #7f0055;">__</span><span style="color: black;">
5 8</span><span style="color: #ccb07a;">)</span><span style="color: black;">
'</span><span style="color: #ccb07a;">(</span><span style="color: black;">5
6 7</span><span style="color: #ccb07a;">)</span><span style="color: #cc7a7a;">)</span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: black;">E1:
</span><span style="color: #ccb07a;">(</span><span style="color: #7f0055;"><b>fn</b></span>
[s e]</span></div>
<div align="LEFT" style="margin-bottom: 0cm; text-indent: 0.01cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: #7acc7a;"> (</span><span style="color: #7f0055;"><b>loop</b></span>
[c s acc []]</span></div>
<div align="LEFT" style="margin-bottom: 0cm; text-indent: 0.01cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: #7accb0;"> (</span><span style="color: #7f0055;"><b>if</b></span>
<span style="color: #7ab0cc;">(</span><span style="color: #7f0055;">>=</span> c e<span style="color: #7ab0cc;">)</span> </span><br />
<span style="font-family: Courier New, Courier, monospace;"> acc</span></div>
<div align="LEFT" style="margin-bottom: 0cm; text-indent: 0.01cm;">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: #7ab0cc;"> (</span><span style="color: #7f0055;"><b>recur</b></span>
<span style="color: #7a7acc;">(</span><span style="color: #7f0055;">inc</span>
c<span style="color: #7a7acc;">)</span>
<span style="color: #7a7acc;">(</span><span style="color: #7f0055;">conj</span>
acc c<span style="color: #7a7acc;">)</span><span style="color: #7ab0cc;">)</span><span style="color: #7accb0;">)</span><span style="color: #7acc7a;">)</span><span style="color: #ccb07a;">)</span></span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
Anonymoushttp://www.blogger.com/profile/08198769559694742403noreply@blogger.com0tag:blogger.com,1999:blog-5397603151062338268.post-31972401831070615032012-11-22T22:22:00.003+01:002013-01-31T21:02:53.460+01:00Clojure Easy 1<div class="entry-content">
<blockquote>
<b>"SQL, Lisp, and Haskell are the only programming languages that I've seen where one spends more time thinking than typing."</b></blockquote>
<blockquote>
- Philip Greenspun</blockquote>
<div style="text-align: center;">
<br />
<div style="text-align: start;">
<br /></div>
</div>
Na początek zagadka: <em> Ilu inżynierów od sprzętu komputerowego potrzeba by wymienić żarówkę?</em><br />
Odpowiedź na końcu wpisu.<br />
<br />
W
tym cyklu nie będzie poznawania podstawowych funkcji, a raczej ich
zastosowanie w akcji. Przewiną się wszystkie poznane już w poprzedniej
części konstrukcje oraz pojawią się bardziej zaawansowane funkcje.
Będzie więcej kombinowania. Dodatkowo pojawią się przeszkody w postaci
zakazów użycia niektórych funkcji.<br />
<br />
Zalecam użycie Eclipse (dowolna
edycja, może być C++, bo mało zajmuje) oraz wtyczkę Counterclockwise
(do Clojure), którą można zainstalować z poziomu Eclipse poprzez
Help->Eclipse Marketplace... Po utworzeniu projektu Clojure należy
utworzyć namespace np. core. Potem uruchomić przyciskiem Run. Uruchomi
się w ten sposób linia poleceń Clojure, gdzie można testować kod. Jeżeli
program wpadnie w nieskończoną pętlę, bądź się przywiesi, to można go
zatrzymać przy pomocy ikonki z trybikiem lub Ctrl+I.<br />
<br />
<h3>
Problem 1: Last Element</h3>
<div>
<br /></div>
Zadanie
polega na wypisaniu ostatniego elementu kolekcji. Aby zadanie nie było
zbyt łatwe nie można użyć funkcji last. Oczywiście nie utrudnia to nam
zadania.<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_123607">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= (__ [1 2 3 4 5]) 5)</code></div>
<div class="line number2 index1 alt1">
<code class="plain plain">T2: (= (__ '(5 4 3)) 3)</code></div>
<div class="line number3 index2 alt2">
<code class="plain plain">T3: (= (__ ["b" "c" "d"]) "d")</code><br />
<code class="plain plain"><br /></code></div>
<div class="line number4 index3 alt1">
</div>
<div class="line number5 index4 alt2">
<code class="plain plain">E1: #(first (reverse %))</code><br />
<code class="plain plain"><br /></code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h3>
Problem 2: Penultimate Element</h3>
<div>
<br /></div>
Jeszcze trudniejsze zadanie. Tym razem trzeba podać wartość drugiego elementu od końca. <br />
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_569335">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= (__ (list 1 2 3 4 5)) 4)</code></div>
<div class="line number2 index1 alt1">
<code class="plain plain">T2: (= (__ ["a" "b" "c"]) "b")</code></div>
<div class="line number3 index2 alt2">
<code class="plain plain">T3: (= (__ [[1 2] [3 4]]) [1 2])</code><br />
<code class="plain plain"><br /></code></div>
<div class="line number4 index3 alt1">
</div>
<div class="line number5 index4 alt2">
<code class="plain plain">E1: #(second (reverse %))</code></div>
<div class="line number6 index5 alt1">
<code class="plain plain">E2: #(last (butlast %))</code><br />
<code class="plain plain"><br /></code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h3>
Problem 3: Nth element</h3>
<div>
<br /></div>
Zadanie polega na podaniu n-tego elementu kolekcji przekazanej do funkcji. Jest jednak haczyk. Nie można użyć funkcji <em>nth</em>.<br />
<br />
Funkcja <em>take</em>
bierze n elementów z listy. Jednak autor testu przyjął podstawę 0. Stąd
funkcja musi wziąć o jeden element więcej. Szukany element będzie na
ostatniej pozycji z obciętej listy.<br />
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_470289">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= (__ '(4 5 6 7) 2) 6)</code></div>
<div class="line number2 index1 alt1">
<code class="plain plain">T2: (= (__ [:a :b :c] 0) :a)</code></div>
<div class="line number3 index2 alt2">
<code class="plain plain">T3: (= (__ [1 2 3 4] 1) 2)</code></div>
<div class="line number4 index3 alt1">
<code class="plain plain">T4: (= (__ '([1 2] [3 4] [5 6]) 2) [5 6])</code><br />
<code class="plain plain"><br /></code></div>
<div class="line number5 index4 alt2">
</div>
<div class="line number6 index5 alt1">
<code class="plain plain">E1: #(last (take (inc %2) %1))</code><br />
<code class="plain plain"><br /></code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h3>
Problem 4: Count a Sequence</h3>
<div>
<br /></div>
Zadanie polega na wypisaniu ilości elementów listy bez użycia funkcji <em>count</em><br />
Pierwszy sprytny sposób to nudne zliczanie każdego elementu w pętli : E1.<br />
Drugi sprytny sposób: E2, to utworzenie listy jedynek za pomocą funkcji map, które potem będą zsumowane. <br />
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_56124">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= (__ '(1 2 3 3 1)) 5)</code></div>
<div class="line number2 index1 alt1">
<code class="plain plain">T2: (= (__ "Hello World") 11)</code></div>
<div class="line number3 index2 alt2">
<code class="plain plain">T3: (= (__ [[1 2] [3 4] [5 6]]) 3)</code></div>
<div class="line number4 index3 alt1">
<code class="plain plain">T4: (= (__ '(13)) 1)</code></div>
<div class="line number5 index4 alt2">
<code class="plain plain">T5: (= (__ '(:a :b :c)) 3)</code><br />
<code class="plain plain"><br /></code></div>
<div class="line number6 index5 alt1">
</div>
<div class="line number7 index6 alt2">
<code class="plain plain">E1: #(loop [c 0 l %]</code></div>
<div class="line number8 index7 alt1">
<code class="plain spaces"> </code><code class="plain plain">(if (empty? l)</code></div>
<div class="line number9 index8 alt2">
<code class="plain spaces"> </code><code class="plain plain">c</code></div>
<div class="line number10 index9 alt1">
<code class="plain spaces"> </code><code class="plain plain">(recur (inc c) (rest l))))</code></div>
<div class="line number11 index10 alt2">
</div>
<div class="line number12 index11 alt1">
<code class="plain plain">E2: #(reduce + (map (fn [e] 1) %))</code><br />
<code class="plain plain"><br /></code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h3>
Problem 5: Sum it all up</h3>
<div>
<br /></div>
Zadanie polega na napisaniu funkcji, która zwróci sumę wszystkich elementów.<br />
Dużo pracy tu nie ma, bo wykorzystam poprzednią funkcję, która zamiast zliczać jedynki będzie sumować poszczególne elementy. <br />
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_241746">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= (__ [1 2 3]) 6)</code></div>
<div class="line number2 index1 alt1">
<code class="plain plain">T2: (= (__ (list 0 -2 5 5)) 8)</code></div>
<div class="line number3 index2 alt2">
<code class="plain plain">T3: (= (__ #{4 2 1}) 7)</code></div>
<div class="line number4 index3 alt1">
<code class="plain plain">T4: (= (__ '(0 0 -1)) -1)</code></div>
<div class="line number5 index4 alt2">
<code class="plain plain">T5: (= (__ '(1 10 3)) 14)</code><br />
<code class="plain plain"><br /></code></div>
<div class="line number6 index5 alt1">
</div>
<div class="line number7 index6 alt2">
<code class="plain plain">E1: #(loop [sum 0 l %]</code></div>
<div class="line number8 index7 alt1">
<code class="plain spaces"> </code><code class="plain plain">(if (empty? l) </code></div>
<div class="line number9 index8 alt2">
<code class="plain spaces"> </code><code class="plain plain">sum</code></div>
<div class="line number10 index9 alt1">
<code class="plain spaces"> </code><code class="plain plain">(recur (+ sum (first l)) (rest l))))</code></div>
<div class="line number11 index10 alt2">
</div>
<div class="line number12 index11 alt1">
<code class="plain plain">E2: #(apply + %)</code></div>
<div class="line number13 index12 alt2">
<code class="plain plain">E3: #(reduce + %)</code><br />
<code class="plain plain"><br /></code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h3>
Problem 6: Find the odd numbers</h3>
<div>
<br /></div>
<br />
Zadanie polega na znalezieniu wszystkich elementów nieparzystych z podanej listy i zwrócenie ich jako listy. Znając już makro <em>for</em> zadanie będzie dość proste (E1). Zmodyfikuję też poprzednią pętlę i podam jako E2.<br />
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_51009">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= (__ #{1 2 3 4 5}) '(1 3 5))</code></div>
<div class="line number2 index1 alt1">
<code class="plain plain">T2: (= (__ [4 2 1 6]) '(1))</code></div>
<div class="line number3 index2 alt2">
<code class="plain plain">T3: (= (__ [2 2 4 6]) '())</code></div>
<div class="line number4 index3 alt1">
<code class="plain plain">T4: (= (__ [1 1 1 3]) '(1 1 1 3))</code><br />
<code class="plain plain"><br /></code></div>
<div class="line number5 index4 alt2">
</div>
<div class="line number6 index5 alt1">
<code class="plain plain">E1: #(for [x % :when (odd? x)] x)</code></div>
<div class="line number7 index6 alt2">
<code class="plain plain">E2: #(loop [wyn [] lst %]</code></div>
<div class="line number8 index7 alt1">
<code class="plain spaces"> </code><code class="plain plain">(if (empty? lst) </code></div>
<div class="line number9 index8 alt2">
<code class="plain spaces"> </code><code class="plain plain">wyn</code></div>
<div class="line number10 index9 alt1">
<code class="plain spaces"> </code><code class="plain plain">(recur (if (odd? (first lst))</code></div>
<div class="line number11 index10 alt2">
<code class="plain spaces"> </code><code class="plain plain">(conj wyn (first lst)) </code></div>
<div class="line number12 index11 alt1">
<code class="plain spaces"> </code><code class="plain plain">wyn)</code></div>
<div class="line number13 index12 alt2">
<code class="plain spaces"> </code><code class="plain plain">(rest lst))))</code><br />
<code class="plain plain"><br /></code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h3>
Problem 7: Reverse a Sequence</h3>
<div>
<br /></div>
Zadanie polega na zmianie kolejności elementów kolekcji bez używania funkcji <em>reverse</em> i <em>rseq</em>. <br />
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_90648">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= (__ [1 2 3 4 5]) [5 4 3 2 1])</code></div>
<div class="line number2 index1 alt1">
<code class="plain plain">T2: (= (__ (sorted-set 5 7 2 7)) '(7 5 2))</code></div>
<div class="line number3 index2 alt2">
<code class="plain plain">T3: (= (__ [[1 2][3 4][5 6]]) [[5 6][3 4][1 2]])</code><br />
<code class="plain plain"><br /></code></div>
<div class="line number4 index3 alt1">
</div>
<div class="line number5 index4 alt2">
<code class="plain plain">E1: #(loop [wyn [] lst %]</code></div>
<div class="line number6 index5 alt1">
<code class="plain spaces"> </code><code class="plain plain">(if (empty? lst) </code></div>
<div class="line number7 index6 alt2">
<code class="plain spaces"> </code><code class="plain plain">wyn</code></div>
<div class="line number8 index7 alt1">
<code class="plain spaces"> </code><code class="plain plain">(recur (conj wyn (last lst)) </code></div>
<div class="line number9 index8 alt2">
<code class="plain spaces"> </code><code class="plain plain">(butlast lst))))</code><br />
<code class="plain plain"><br /></code>
<code class="plain plain"><br /></code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h3>
Problem 8: Palindrome detector.</h3>
<div>
<br /></div>
Zadanie polega na napisaniu funkcji, która testuje czy podana sekwencja jest palindromem. <br />
Ciąg
jest palidromem, jeżeli pierwsza połowa sekwencji jego elementów jest
równa odwróconej drugiej połowie. Jeżeli liczba elementów ciągu jest
nieparzysta środkowy znak się ignoruje. Należy więc wziąć liczbę n
elementów ciągu , podzielić całkowicie przez dwa (funkcja <em>quot</em>),
wziąć n/2 pierwszych elementów , odwrócić listę, wziąć n/2 pierwszych
elementów i porównać listy (E1). Drugi sposób to porównywać pierwszy
element z ostatnim (przy okazji usuwać te elementy), aż lista nie będzie
pusta (E2). Trzeci sposób to wziąć sobie jakiś licznik i porównywać
n-ty z k-n element listy, gdzie k to długość listy, a n: <0, k-1>.<br />
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_810433">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (false? (__ '(1 2 3 4 5)))</code></div>
<div class="line number2 index1 alt1">
<code class="plain plain">T2: (true? (__ "racecar"))</code></div>
<div class="line number3 index2 alt2">
<code class="plain plain">T3: (true? (__ [:foo :bar :foo]))</code></div>
<div class="line number4 index3 alt1">
<code class="plain plain">T4: (true? (__ '(1 1 3 3 1 1)))</code></div>
<div class="line number5 index4 alt2">
<code class="plain plain">T5: (false? (__ '(:a :b :c)))</code><br />
<code class="plain plain"><br /></code></div>
<div class="line number6 index5 alt1">
</div>
<div class="line number7 index6 alt2">
<code class="plain plain">E1: #( let [lst %</code></div>
<div class="line number8 index7 alt1">
<code class="plain spaces"> </code><code class="plain plain">n (quot (count lst) 2)</code></div>
<div class="line number9 index8 alt2">
<code class="plain spaces"> </code><code class="plain plain">pp (take n lst)</code></div>
<div class="line number10 index9 alt1">
<code class="plain spaces"> </code><code class="plain plain">dp (take n (reverse lst))]</code></div>
<div class="line number11 index10 alt2">
<code class="plain spaces"> </code><code class="plain plain">(if (< n 1) </code></div>
<div class="line number12 index11 alt1">
<code class="plain spaces"> </code><code class="plain plain">true</code></div>
<div class="line number13 index12 alt2">
<code class="plain spaces"> </code><code class="plain plain">(reduce (fn [x y] (and x y)) (map (fn [a b] (= a b)) pp dp))))</code><br />
<code class="plain plain"><br /></code></div>
<div class="line number14 index13 alt1">
</div>
<div class="line number15 index14 alt2">
<code class="plain plain">E2: #( let [lst %</code></div>
<div class="line number16 index15 alt1">
<code class="plain spaces"> </code><code class="plain plain">n (quot (count lst) 2)]</code></div>
<div class="line number17 index16 alt2">
<code class="plain spaces"> </code><code class="plain plain">(loop [f (first lst) l (last lst) tmp lst]</code></div>
<div class="line number18 index17 alt1">
<code class="plain spaces"> </code><code class="plain plain">(if (empty? tmp) true</code></div>
<div class="line number19 index18 alt2">
<code class="plain spaces"> </code><code class="plain plain">(if (not= f l) </code></div>
<div class="line number20 index19 alt1">
<code class="plain spaces"> </code><code class="plain plain">false</code></div>
<div class="line number21 index20 alt2">
<code class="plain spaces"> </code><code class="plain plain">(recur (second tmp) (last (butlast tmp)) (rest (butlast tmp)))))))</code><br />
<code class="plain plain"><br /></code></div>
<div class="line number22 index21 alt1">
</div>
<div class="line number23 index22 alt2">
<code class="plain plain">E3: #( let [v (vec %)</code></div>
<div class="line number24 index23 alt1">
<code class="plain spaces"> </code><code class="plain plain">k (count v) </code></div>
<div class="line number25 index24 alt2">
<code class="plain spaces"> </code><code class="plain plain">n (quot k 2)]</code></div>
<div class="line number26 index25 alt1">
<code class="plain spaces"> </code><code class="plain plain">(loop [f 0 l (dec k)]</code></div>
<div class="line number27 index26 alt2">
<code class="plain spaces"> </code><code class="plain plain">(if (>= f n) </code></div>
<div class="line number28 index27 alt1">
<code class="plain spaces"> </code><code class="plain plain">true</code></div>
<div class="line number29 index28 alt2">
<code class="plain spaces"> </code><code class="plain plain">(if (not= (v f) (v l)) </code></div>
<div class="line number30 index29 alt1">
<code class="plain spaces"> </code><code class="plain plain">false</code></div>
<div class="line number31 index30 alt2">
<code class="plain spaces"> </code><code class="plain plain">(recur (inc f) (dec l))))))</code><br />
<code class="plain plain"><br /></code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
------------------------------------------------------------------------------------------------------------<br />
Odpowiedź na zagadkę: <em> Żadnego. Problem obejdzie się w sofcie. </em></div>
Anonymoushttp://www.blogger.com/profile/08198769559694742403noreply@blogger.com0tag:blogger.com,1999:blog-5397603151062338268.post-32840326904230798692012-11-22T22:21:00.000+01:002013-01-31T21:04:22.075+01:00Clojure Elementary 4<br />
<div class="entry-content">
<blockquote>
<h2>
<span style="font-family: Trebuchet MS, sans-serif;">"If I had a nickel for every time I've written "for (i = 0; i < N; i++)" in C I'd be a millionaire."</span></h2>
<h3>
- Mike Vanier</h3>
</blockquote>
<br />
<br />
<div style="text-align: center; width: 100%;">
<div class="one image" style="text-align: center;">
</div>
</div>
Po części trzeciej, czas na ostatnią, czwartą część łamigłówek o podstawowym stopniu trudności. W kolejnej serii przejdę do stopnia trudności określanego jako Easy.<br />
<br />
<br />
Taka mała zagadka: <em>Ilu programistów .NET potrzeba, by zabić karalucha?</em><br />
(odpowiedź na końcu wpisu.).<br />
<br />
<h3>
Problem 27: for the win</h3>
<div>
<br /></div>
Zadanie polega na odgadnięciu wyniku działania makra <a href="http://clojuredocs.org/clojure_core/clojure.core/for" rel="nofollow" target="_blank"><em>for</em></a>.<br />
Makro to bierze za pierwszy argument wektor powiązań (podobnie jak <em>let</em> i opcjonalnie trzy modyfikatory:<br />
- :let [ powiązania dla dodatkowych zmiennych pomocniczych ]<br />
- :when ( test ) - zmienne w iteracji zostaną przekazane po spełnieniu testu<br />
- :while ( test ) - <em>for</em> zakończy działanie po negatywnym wyniku testu<br />
<br />
Powiązania
(nie dotyczy :let) muszą być sekwencjami np.: (for [x '(3 4) z [1 2]]
(...) ). Elementy sekwencji będą łączone na zasadzie każdy z każdym. To
jest dla każdego elementu x zostanie przypisany każdy element z i taka
postać przekazana jako parametry do bloku wykonania. Blok wykonania
zwraca wartość, z której po każdej iteracji będzie budowana sekwencja.
Tak, że <em>for</em> służy do budowania sekwencji na podstawie innych sekwencji.<br />
<br />
W teście T1 mam <em>for</em>, które będzie się wykonywać dla każdego <em>x</em> z sekwencji zbudowanej przy pomocy funkcji <a href="http://clojuredocs.org/clojure_core/clojure.core/range" rel="nofollow" target="_blank"><em>range</em></a>).
W tym przypadku range zwróci kolekcję liczb od 0 do 39 włącznie z
krokiem 1. Iterując po każdym elemencie zostaje sprawdzony warunek
:when, który zwraca prawdę jeżeli reszta z dzielenia elementu <em>x</em> kolekcji przez 4 (funkcja <a href="http://clojuredocs.org/clojure_core/clojure.core/rem" rel="nofollow" target="_blank"><em>rem</em></a>
będzie równa 1. Dzięki temu zostanie zbudowana kolekcja elementów,
których reszta z dzielenia przez 4 jest 1. Wynik w ostateczności
powinien wyglądać tak: (1 5 9 13 17 21 25 29 33 37).<br />
<br />
W teście T2 <em>x</em> jest nieskończoną kolekcją zwróconą przez funkcję <a href="http://clojuredocs.org/clojure_core/clojure.core/iterate" rel="nofollow" target="_blank"><em>iterate</em></a>.
Funkcja ta bierze za pierwszy argument funkcję, a za drugi wartość
początkową. Funkcja anonimowa zwraca wartość argumentu powiększonego o
4. Stąd <em>x</em> będzie mieć postać: (0 4 8 12 ... ). Modyfikator <em>:let</em> tworzy zmienną pomocniczą <em>z</em>, która będzie mieć wartość elementu <em>x</em> powiększonego o 1. Modyfikator <em>:while</em> sprawdza, czy <em>z</em> jest mniejsze od 40, jeżeli nie, to kończy działanie <em>for</em> <br />
<em><br /></em>
W teście T3 <em>for</em> iteruje po parach liczb utworzonych poprzez utworzenie kolekcji liczb <br />
(0 1 2 3 ... 19) podzielonej na kolekcję dwuelementowych list : ( (0 1) (2 3) (4 5) .... (18 19) ).<br />
Wynikiem jest lista, której elementy to sumy par liczb. <br />
Pary i większe kolekcje liczb można przypisywać do zmiennych lokalnych w rózny sposób, np:<br />
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_394540">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">(let [ x 1 y 2 ] (+ x y))</code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
i<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_341834">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">(let [ [x y] '(1 2) ] (+ x y))</code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
vs<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_953339">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">(let [ x (first '(1 2)) y (second '(1 2)) ] (+ x y))</code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
I zadanie:<br />
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_268332">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= __ (for [x (range 40)</code></div>
<div class="line number2 index1 alt1">
<code class="plain spaces"> </code><code class="plain plain">:when (= 1 (rem x 4))]</code></div>
<div class="line number3 index2 alt2">
<code class="plain spaces"> </code><code class="plain plain">x))</code></div>
<div class="line number4 index3 alt1">
<code class="plain plain">T2: (= __ (for [x (iterate #(+ 4 %) 0)</code></div>
<div class="line number5 index4 alt2">
<code class="plain spaces"> </code><code class="plain plain">:let [z (inc x)]</code></div>
<div class="line number6 index5 alt1">
<code class="plain spaces"> </code><code class="plain plain">:while (< z 40)]</code></div>
<div class="line number7 index6 alt2">
<code class="plain spaces"> </code><code class="plain plain">z))</code></div>
<div class="line number8 index7 alt1">
<code class="plain plain">T3: (= __ (for [[x y] (partition 2 (range 20))]</code></div>
<div class="line number9 index8 alt2">
<code class="plain spaces"> </code><code class="plain plain">(+ x y)))</code><br />
<code class="plain plain"><br /></code></div>
<div class="line number10 index9 alt1">
</div>
<div class="line number11 index10 alt2">
<code class="plain plain">E1: '(1 5 9 13 17 21 25 29 33 37).</code></div>
<div class="line number12 index11 alt1">
<code class="plain plain">E2: [1 5 9 13 17 21 25 29 33 37].</code><br />
<code class="plain plain"><br /></code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h3>
Problem 28: Logical falsity and truth </h3>
<div>
<br /></div>
W Clojure w testach logicznych tylko <em>nil</em> i <em>false</em> zwracają logiczny fałsz, wszystko inne ewaluuje się do logicznej prawdy. Funkcja <a href="http://clojuredocs.org/clojure_core/clojure.core/if" rel="nofollow" target="_blank"><em>if</em></a>
Służy do wykonywania dwóch rodzajów kodu w zależności od wyniku
przekazanego do niej testu. Za pierwszy argument bierze test, który
zwraca prawdę lub fałsz. Jeżeli wynikiem testu będzie prawda, zostanie
wykonany kod podany w drugim argumencie w przeciwnym wypadku zostanie
wykonany kod w trzecim. Jeżeli trzeciego argumentu nie będzie, a test
sugeruje na jego wykonanie, to <em>if</em> zwróci nil.<br />
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_377342">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= __ (if-not false 1 0))</code></div>
<div class="line number2 index1 alt1">
<code class="plain plain">T2: (= __ (if-not nil 1 0))</code></div>
<div class="line number3 index2 alt2">
<code class="plain plain">T3: (= __ (if true 1 0))</code></div>
<div class="line number4 index3 alt1">
<code class="plain plain">T4: (= __ (if [] 1 0))</code></div>
<div class="line number5 index4 alt2">
<code class="plain plain">T5: (= __ (if [0] 1 0))</code></div>
<div class="line number6 index5 alt1">
<code class="plain plain">T6: (= __ (if 0 1 0))</code></div>
<div class="line number7 index6 alt2">
<code class="plain plain">T7: (= __ (if 1 1 0))</code></div>
<div class="line number8 index7 alt1">
<code class="plain spaces"> </code> </div>
<div class="line number9 index8 alt2">
<code class="plain plain">E1: 1</code><br />
<code class="plain plain"><br /></code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h3>
Problem 29: Map defaults </h3>
<div>
<br /></div>
W
przypadku pozyskiwania wartości rezydującej pod kluczem mapy, oprócz
sposobu jaki był przedstawiony w problemie nr 26 jest jeszcze jedna
metoda na poradzenie sobie z sytuacją w której dany klucz nie istnieje.
Można do wyrażenia pobierającego wartość spod klucza dodać wartość
domyślną, która zostanie zwrócona, gdy klucz nie istnieje, np.:<br />
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_131357">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">(:k {:a 0, :b 1, :c nil} :not_exist)</code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
Zwróci :not_exist.<br />
<br />
A co jeżeli chcemy utworzyć mapę i nadać kluczom jakaś domyślną wartość? <br />
Zadanie
polega na utworzeniu funkcji, która pobierze sekwencję kluczy, wartość
domyślną i utworzy z nich mapę. Mapę w najprostszy sposób tworzy się
poprzez <em>(hash-map klucz dane)</em> lub <em>{klucz dane}</em>. Wiadomo, że przez elementy sekwencji można iterować przez użycie <em>map</em> lub <em>for</em>. Funkcja <em>map</em>
bierze za parametr funkcję, którą stosuje dla każdego elementu
sekwencji. Stąd mając domyślą wartość klucza i sekwencję kluczy można
zwrócić sekwencję map. Złączyć to można poleceniem <em>conj</em> i funkcją <em>apply</em> lub <em>reduce</em>.<br />
<br />
Rozpiszę główne etapy:<br />
1. map ... : ({:a 0} {:b 0} {:c 0})<br />
2. apply conj ... : {:a 0 :b 0 :c 0}<br />
z czego apply tworzy listę w sposób: (conj {:a 0} {:b 0} {:c 0})<br />
reduce: (conj {:a 0} {:b 0}) -> (conj {:a 0 :b 0} {:c 0}) ... <br />
<br />
Zadanie: <br />
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_410719">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">(= (__ 0 [:a :b :c]) {:a 0 :b 0 :c 0})</code></div>
<div class="line number2 index1 alt1">
<code class="plain plain">(= (__ "x" [1 2 3]) {1 "x" 2 "x" 3 "x"})</code></div>
<div class="line number3 index2 alt2">
<code class="plain plain">(= (__ [:a :b] [:foo :bar]) {:foo [:a :b] :bar [:a :b]})</code><br />
<code class="plain plain"><br /></code></div>
<div class="line number4 index3 alt1">
</div>
<div class="line number5 index4 alt2">
<code class="plain plain">E1: #(reduce conj (map (fn [d] {d %1}) %2))</code></div>
<div class="line number6 index5 alt1">
<code class="plain plain">E2: #(apply conj (map (fn [d] {d %1}) %2))</code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
------------------------------------------------------------------------------------------------------------<br />
Odpowiedź na zagadkę: <em>Dwóch. Jeden trzyma karalucha, by nie uciekł, a drugi instaluje na nim Windows.</em> </div>
Anonymoushttp://www.blogger.com/profile/08198769559694742403noreply@blogger.com0tag:blogger.com,1999:blog-5397603151062338268.post-46110789732400513112012-11-22T22:19:00.001+01:002013-01-31T21:03:22.479+01:00Clojure Elementary 3<div class="entry-content">
<h3>
“Don't worry about what anybody else is going to do. The best way to predict the future is to invent it.”</h3>
— Alan Kay </div>
<div class="entry-content">
</div>
<div class="entry-content">
Kolejna część zmagań z zadaniami ze strony 4Clojure.<br />
<div style="text-align: center; width: 100%;">
<div class="one image" style="text-align: center;">
</div>
</div>
Do dzieła!: ;)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<h3>
Problem 17: Sequences : filter.</h3>
Zadanie polega na zgadnięciu rezultatu filtrowania listy za pomocą funkcji testującej. Funkcja <a href="http://clojuredocs.org/clojure_core/clojure.core/filter" rel="nofollow" target="_blank"><em>filter</em></a>
bierze za pierwszy argument funkcję testującą a drugi sekwencję. Zwraca
elementy sekwencji, które przejdą test pozytywnie. Tutaj funkcja
anonimowa zwraca logiczną prawdę jeżeli przekazany do niej parametr jest
większy od 5, a więc <em>filter</em> powinien zwrócić wszystkie elementy sekwencji większe od 5.<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_991091">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= __ (filter #(> % 5) '(3 4 5 6 7)))</code></div>
<div class="line number2 index1 alt1">
</div>
<div class="line number3 index2 alt2">
<code class="plain plain">E1: '(6 7)</code></div>
<div class="line number4 index3 alt1">
<code class="plain plain">E2: [6 7]</code><br />
<code class="plain plain"><br /></code>
<code class="plain plain"><br /></code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h3>
Problem 18: Local bindings.</h3>
<div>
<br /></div>
Funkcja <a href="http://clojuredocs.org/clojure_core/clojure.core/let" rel="nofollow" target="_blank"><em>let</em></a> pozwala na lokalne przypisanie nazw funkcjom bądź danym. Bardzo ułatwia czytanie kodu. Budowa jest postaci: <br />
(let [zmienna1 funkcja1 zmienna2 funkcja2 .... zmiennaN funkcjaN] <em>(obliczena z wykorzystaniem zmienna1..N)</em>)<br />
Zadanie polega na odgadnięciu rezultatu działania funkcji.<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_104881">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= __ (let [x 5] (+ 2 x)))</code></div>
<div class="line number2 index1 alt1">
<code class="plain plain">T2: (= __ (let [x 3, y 10] (- y x)))</code></div>
<div class="line number3 index2 alt2">
<code class="plain plain">T3: (= __ (let [x 21] (let [y 3] (/ x y))))</code></div>
<div class="line number4 index3 alt1">
</div>
<div class="line number5 index4 alt2">
<code class="plain plain">E1: 7</code><br />
<code class="plain plain"><br /></code>
<code class="plain plain"><br /></code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h3>
Problem 19: Let it Be</h3>
<div>
<br /></div>
Zadanie
odwrotne do zadania 18. Zamiast zgadywać wynik, trzeba zgadnąć postać
przypisania. Zadanie jest trudne bo trzeba zgadnąć wartości przypisań.
Najlepiej zacząć od dołu (T3).<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_929832">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= 10 (let __ (+ x y)))</code></div>
<div class="line number2 index1 alt1">
<code class="plain plain">T2: (= 4 (let __ (+ y z)))</code></div>
<div class="line number3 index2 alt2">
<code class="plain plain">T3: (= 1 (let __ z))</code></div>
<div class="line number4 index3 alt1">
</div>
<div class="line number5 index4 alt2">
<code class="plain plain">E1: [z 1 y 3 x 7]</code><br />
<code class="plain plain"><br /></code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h3>
Problem 20: Regular Expressions </h3>
<div>
<br /></div>
Wyrażenia regularne. Tym razem trzeba zgadnąć rezultat działania funkcji <a href="http://clojuredocs.org/clojure_core/clojure.core/re-seq" rel="nofollow" target="_blank"><em>re-seq</em></a>,
która za pierwszy parametr bierze postać wyrażenia regularnego, a jako
drugi ciąg znaków do przeszukania. Wyrażenie regularne w Clojure ma
postać: #" ". <em>re-seq</em> zwraca każde poprawne wystąpienie tekstu spełniającego wyrażenie w postaci sekwencji. Funkcję <em>str</em> już znamy. Funkcja <a href="http://clojuredocs.org/clojure_core/clojure.core/apply" rel="nofollow" target="_blank"><em>apply</em></a> natomiast powoduje użycie listy jako argumentów do funkcji <em>str</em>. <br />
Zamiast:<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_169197">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">(str "a" "b" "c")</code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
jest:<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_917807">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">(apply str '("a" "b" "c"))</code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
I zadanie: <br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_7094">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= __ (apply str (re-seq #"[A-Z]+" "bA1B3Ce ")))</code></div>
<div class="line number2 index1 alt1">
</div>
<div class="line number3 index2 alt2">
<code class="plain plain">E1: "ABC"</code><br />
<code class="plain plain"><br /></code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h3>
Problem 21: Intro to Reduce </h3>
<br />
<br />
Funkcja <a href="http://clojuredocs.org/clojure_core/clojure.core/reduce" rel="nofollow" target="_blank"><em>reduce</em></a>
bierze dwa lub trzy argumenty. Pierwszym jest funkcja, która może
przyjąć dwa argumenty. Jeżeli drugim argumentem jest kolekcja, <em>reduce</em>
bierze pierwsze dwa elementy z kolekcji i przekazuje je do funkcji.
Jeżeli są jeszcze elementy w kolekcji, to brany jest wynik poprzedniej
operacji na elementach, kolejny element z listy i przekazywane do
podanej funkcji aż do wyczerpania elementów. Jeżeli zamiast kolekcji
podamy jakąś wartość i kolekcję, to pierwszym elementem przekazanym do
funkcji będzie ta wartość, a drugim pierwszy element z kolekcji.<br />
Zadnie polega na zgadnięciu postaci funkcji jaka zastosowana według powyższych reguł da podany wynik.<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_301459">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= 15 (reduce __ [1 2 3 4 5]))</code></div>
<div class="line number2 index1 alt1">
<code class="plain plain">T2: (= 0 (reduce __ []))</code></div>
<div class="line number3 index2 alt2">
<code class="plain plain">T3: (= 6 (reduce __ 1 [2 3]))</code></div>
<div class="line number4 index3 alt1">
</div>
<div class="line number5 index4 alt2">
<code class="plain plain">E1: +</code></div>
<div class="line number6 index5 alt1">
<code class="plain plain">E2: (fn add </code></div>
<div class="line number7 index6 alt2">
<code class="plain spaces"> </code><code class="plain plain">([] 0)</code></div>
<div class="line number8 index7 alt1">
<code class="plain spaces"> </code><code class="plain plain">([a b] (+ a b)))</code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<em>Uwaga</em>. W odpowiedzi użyłem dziwnie wyglądającej funkcji anonimowej. Wcześniej napisałem, że funkcja <em>reduce</em>
potrzebuje za pierwszy argument funkcji, która potrafi przyjąć dwa
argumenty. Niestety, test T2 wymaga, by funkcja radziła sobie z brakiem
argumentów. Clojure pozwala skonstruować funkcje tak, by w jednej
definicji przewidywały odpowiedź na różną ilość argumentów. Te definicje
oddziela się nawiasami okrągłymi i mogą być w dowolnej kolejności. <br />
<br />
<h3>
Problem 22: Simple Recursion</h3>
<div>
<br /></div>
Rekurencja. Występuje wtedy, gdy funkcja wywołuje samą siebie. W tym zadaniu funkcja <em>foo</em> bierze liczbę za argument x. Jeżeli x jest większe od 0 (<a href="http://clojuredocs.org/clojure_core/clojure.core/when" rel="nofollow" target="_blank"><em>when</em></a>) wykonuje funkcję <em>conj</em>, która tworzy sekwencję z funkcji <em>foo</em> pomniejszonej o 1 i aktualnego x. Funkcja <em>conj</em>
łączy do początku listy, ale wykona się rekurencyjnie dopiero po
napotkaniu warunku brzegowego (x > 0 ). Jeżeli x będzie 0 funkcja <em>when</em> zwróci nil. <em>conj</em>
z nil i x daje (x). Ostatnim x przed warunkiem jest 1, pierwszym jest
5. Czyli łącząc do początku listy od 1 do 5 mamy listę w kolejności
odwrotnej.<br />
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_53197">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= __ ( (fn foo [x] </code></div>
<div class="line number2 index1 alt1">
<code class="plain spaces"> </code><code class="plain plain">(when (> x 0) </code></div>
<div class="line number3 index2 alt2">
<code class="plain spaces"> </code><code class="plain plain">(conj (foo (dec x)) </code></div>
<div class="line number4 index3 alt1">
<code class="plain spaces"> </code><code class="plain plain">x))) </code></div>
<div class="line number5 index4 alt2">
<code class="plain spaces"> </code><code class="plain plain">5 ))</code><br />
<code class="plain plain"><br /></code></div>
<div class="line number6 index5 alt1">
</div>
<div class="line number7 index6 alt2">
<code class="plain plain">E1: '(5 4 3 2 1)</code></div>
<div class="line number8 index7 alt1">
<code class="plain plain">E2: [5 4 3 2 1]</code><br />
<code class="plain plain"><br /></code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<br />
<h3>
Problem 23: Rearranging Code: -> </h3>
<div>
<br /></div>
Makro -> pozwala wykonywać na danych operacje sekwencyjnie zamiast zagnieżdżać w nawiasy. Co my tutaj mamy?<br />
<br />
Funkcja <a href="http://clojuredocs.org/clojure_core/clojure.string/reverse" rel="nofollow" target="_blank"><em>reverse</em></a> odwraca kolejność elementów w kolekcji, czyli będzie: [6 3 1 4 5 2]. <em>rest</em> zwraca wszystkie elementy oprócz pierwszego, więc: [3 1 4 5 2]. <a href="http://clojuredocs.org/clojure_core/clojure.core/sort" rel="nofollow" target="_blank"><em>sort</em></a>
porządkuje elementy w kolejności rosnącej: [1 2 3 4 5]. Zadanie polega
na zgadnięciu ostatniej funkcji, która po zastosowaniu na ostatnim
wyniku zwróci 5. <br />
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_819760">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= (__ (sort (rest (reverse [2 5 4 1 3 6]))))</code></div>
<div class="line number2 index1 alt1">
<code class="plain spaces"> </code><code class="plain plain">(-> [2 5 4 1 3 6] reverse rest sort __)</code></div>
<div class="line number3 index2 alt2">
<code class="plain spaces"> </code><code class="plain plain">5)</code><br />
<code class="plain plain"><br /></code></div>
<div class="line number4 index3 alt1">
</div>
<div class="line number5 index4 alt2">
<code class="plain plain">E1: last</code></div>
<div class="line number6 index5 alt1">
<code class="plain plain">E2: #(first (reverse %))</code><br />
<code class="plain plain"><br /></code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
Uwaga, może nie zadziałać na 4Clojure mimo, że odpowiedzi są poprawne.<br />
<br />
<h3>
Problem 24: Recurring Theme </h3>
<div>
<br /></div>
<div>
<br /></div>
Clojure
posiada konstrukcję, która pozwala na zapętlanie bez zapychania stosu -
taki odpowiednik for. W językach takich jak C, Java kolejne wywołania
funkcji powodują, że na stosie odkładane są kolejne ich parametry.
Dodatkowo na stosie odkładane są zmienne lokalne funkcji. Jako, że stos
nie jest nieskończony może się dość szybko zapchać, szczególnie, gdy
stosujemy pętle rekurencyjne, które polegają na wywołaniach funkcji
przez samą siebie. <br />
Jako anegdotę dodam, że twórcom gry MMO : Eve
Online udało się osiągnąć limit jaki stawia stos C. Wtedy w obroty
wzięli odnogę Pyhona: Stackless, który nie zużywa stosu. Jako, że Python
ma problemy ze skalowalnością horyzontalną (winowajca: GIL) ciekawi
mnie jak rozwiązali sprawę komunikacji pomiędzy procesami działającymi
na wielu rdzeniach. <br />
Wracając do tematu. Konstrukcją Clojure, która nie powoduje przepełnień stosu jest <a href="http://clojuredocs.org/clojure_core/clojure.core/loop" rel="nofollow" target="_blank"><em>loop</em></a> - <a href="http://clojuredocs.org/clojure_core/clojure.core/recur" rel="nofollow" target="_blank"><em>recur</em></a> . <br />
<em>loop</em> bierze wektor zmiennych tymczasowych podobnie do <em>let</em>, które są aktualizowane przez funkcję <em>recur</em>. <br />
Rozkładając
na czynniki pierwsze T1 mamy zainicjalizowaną zmienną x wartością 5 i
sekwencję result jako pusty wektor: []. Idąc dalej mamy test x > 0.
Jeżeli x będzie większe od 0 zostanie wywołana funkcja <em>recur</em> z
nowym x pomniejszonym o jeden, a do pustego result zostanie dodany wynik
powiększenia x o 2. Jeżeli warunek x > 0 nie będzie spełniony
zostanie zwrócona aktualna wartość result. Czyli zaczynając od 5 do 1
włącznie zostanie zbudowany wektor [7 6 5 4 3].<br />
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_102916">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain"> </code><br />
<code class="plain plain"><br /></code></div>
<div class="line number2 index1 alt1">
<code class="plain plain">T1: (= __</code></div>
<div class="line number3 index2 alt2">
<code class="plain spaces"> </code><code class="plain plain">(loop [x 5</code></div>
<div class="line number4 index3 alt1">
<code class="plain spaces"> </code><code class="plain plain">result []]</code></div>
<div class="line number5 index4 alt2">
<code class="plain spaces"> </code><code class="plain plain">(if (> x 0)</code></div>
<div class="line number6 index5 alt1">
<code class="plain spaces"> </code><code class="plain plain">(recur (dec x) (conj result (+ 2 x)))</code></div>
<div class="line number7 index6 alt2">
<code class="plain spaces"> </code><code class="plain plain">result)))</code><br />
<code class="plain plain"><br /></code></div>
<div class="line number8 index7 alt1">
</div>
<div class="line number9 index8 alt2">
<code class="plain plain">E1: [7 6 5 4 3]</code><br />
<code class="plain plain"><br /></code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h3>
Problem 25: Rearranging Code: ->> </h3>
<div>
<br /></div>
Makro <a href="http://clojuredocs.org/clojure_core/clojure.core/-%3E%3E" rel="nofollow" target="_blank">->></a>. Służy do poprawy czytelności kodu. Jest to rozwinięta wersja <em>-></em>,
gdzie funkcje były jedno-parametrowe. Makro bierze dane z pierwszego
argumentu i wstawia je na koniec listy podanej w kolejnym argumencie.
Jeżeli są dodatkowe listy, to wynik poprzedniego działania jest
wstawiany na koniec kolejnej. Na końcu tak zbudowana lista jest
ewaluowana (wykonywana).<br />
W zadaniu mamy wektor [2 5 4 1 3 6], który jest skracany o dwa elementy z przodu funkcją <a href="http://clojuredocs.org/clojure_core/clojure.core/drop" rel="nofollow" target="_blank"><em>drop</em></a>. Wynik to : [4 1 3 6] Następnie z wyniku brane są trzy pierwsze elementy : [4 1 3]. Kolejna rzecz, to za pomocą <em>map</em> zwiększenie elementów o 1, dając: [5 2 4]. <br />
Teraz
trzeba znaleźć taką funkcję, która zrobi jakoś z tych danych 11.
Okazuje się, że suma elementów to 11, więc użyję + wraz z funkcją
operująca na listach. <br />
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_901330">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= (__ (map inc (take 3 (drop 2 [2 5 4 1 3 6]))))</code></div>
<div class="line number2 index1 alt1">
<code class="plain spaces"> </code><code class="plain plain">(->> [2 5 4 1 3 6] (drop 2) (take 3) (map inc) (__))</code></div>
<div class="line number3 index2 alt2">
<code class="plain spaces"> </code><code class="plain plain">11)</code><br />
<code class="plain plain"><br /></code></div>
<div class="line number4 index3 alt1">
</div>
<div class="line number5 index4 alt2">
<code class="plain plain">E1: reduce +</code></div>
<div class="line number6 index5 alt1">
<code class="plain plain">E2: apply +</code><br />
<code class="plain plain"><br /></code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h3>
Problem 26: A nil key</h3>
<div>
<br /></div>
Zadanie
polega na znalezieniu funkcji, która pobierze dwa argumenty: klucz i
mapę, oraz zwróci prawdę jeżeli klucz istnieje w tej mapie i ma wartość
nil. Jest to dość ciekawe zadanie, bo mapa zwraca nil jeżeli klucz nie
istnieje. Jak więc dowiedzieć się, że klucz istnieje i ma wartość nil?<br />
<br />
Potrzebne będą dwa porównania. Jedno sprawdza, czy klucz istnieje za pomocą funkcji <a href="http://clojuredocs.org/clojure_core/clojure.core/contains_q" rel="nofollow" target="_blank"><em>contains?</em></a>,
a drugie, czy wartość przypisana do klucza jest nil. Stąd rozwiązanie
E1. Drugie rozwiązanie E2 jest lepsze, bo nie iteruje dwukrotnie po
mapie tylko raz. W pętli loop biorę pierwszą parę klucz-dane z mapy i
sprawdzam, czy nie dostaję nil. Dostanę nil jeżeli mapa będzie pusta.
Jeżeli jest pusta zwracam falsz. Jeżeli nie sprawdzam, czy pierwszy
element pary to mój klucz i przy okazji sprawdzam czy drugi to nil.
Jeżeli to nasz klucz i ma wartość nil zwracam true. W przeciwnym wypadku
biorę kolejny element z mapy oraz jej resztę i przekazuję jako nowe
wartości do <em>loop</em> za pomocą <em>recur</em>.<br />
<em>Update:</em><br />
<em><br /></em>
Przykład
E3 wykorzystuje możliwość przypisania do zmiennej lokalnej wartości
domyślnej jeżeli klucz w mapie nie istnieje. Trzeba jednak uważać, by
wartość domyślna nie mogła wystąpić w danych, bo dostaniemy niepoprawny
wynik.<br />
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_849746">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (true? (__ :a {:a nil :b 2}))</code></div>
<div class="line number2 index1 alt1">
<code class="plain plain">T2: (false? (__ :b {:a nil :b 2}))</code></div>
<div class="line number3 index2 alt2">
<code class="plain plain">T3: (false? (__ :c {:a nil :b 2}))</code><br />
<code class="plain plain"><br /></code></div>
<div class="line number4 index3 alt1">
</div>
<div class="line number5 index4 alt2">
<code class="plain plain">E1: #(and (contains? %2 %1) (nil? (%2 %1)))</code></div>
<div class="line number6 index5 alt1">
</div>
<div class="line number7 index6 alt2">
<code class="plain plain">E2: #(let [klucz %1 mapa %2]</code></div>
<div class="line number8 index7 alt1">
<code class="plain spaces"> </code><code class="plain plain">(loop [p (first mapa) r (rest mapa)]</code></div>
<div class="line number9 index8 alt2">
<code class="plain spaces"> </code><code class="plain plain">(if (nil? p) </code></div>
<div class="line number10 index9 alt1">
<code class="plain spaces"> </code><code class="plain plain">false</code></div>
<div class="line number11 index10 alt2">
<code class="plain spaces"> </code><code class="plain plain">(if (and (= (first p) klucz) (nil? (second p)))</code></div>
<div class="line number12 index11 alt1">
<code class="plain spaces"> </code><code class="plain plain">true</code></div>
<div class="line number13 index12 alt2">
<code class="plain spaces"> </code><code class="plain plain">(recur (first r) (rest r))))))</code></div>
<div class="line number14 index13 alt1">
</div>
<div class="line number15 index14 alt2">
<code class="plain plain">E3: #(let [dane (%1 %2 :not_exist)]</code></div>
<div class="line number16 index15 alt1">
<code class="plain spaces"> </code><code class="plain plain">(if (nil? dane)</code></div>
<div class="line number17 index16 alt2">
<code class="plain spaces"> </code><code class="plain plain">true</code></div>
<div class="line number18 index17 alt1">
<code class="plain spaces"> </code><code class="plain plain">false))</code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/08198769559694742403noreply@blogger.com0tag:blogger.com,1999:blog-5397603151062338268.post-6106625701446807402012-11-22T22:17:00.003+01:002013-01-31T21:04:01.146+01:00Clojure Elementary 2<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUV9XedZBaEc9tJ55oMegxd9na369Cqi6woCovgIXno3BBLeX9jZ7hYjE-Y9vsDgvARPJ4bxLIiriElNfHoXImH0UA64SDfATKlevJKKQbizqDwU_bzw7QGEfV5eYNbT4TAbBug_V_KeQ/s1600/2_0.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="258" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUV9XedZBaEc9tJ55oMegxd9na369Cqi6woCovgIXno3BBLeX9jZ7hYjE-Y9vsDgvARPJ4bxLIiriElNfHoXImH0UA64SDfATKlevJKKQbizqDwU_bzw7QGEfV5eYNbT4TAbBug_V_KeQ/s400/2_0.jpg" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
Jest wieczorek i jest chwilka czasu, więc kontynuuję to, co zacząłem w poprzednim wpisie.<br />
<br />
<h3>
Problem 9: Intro to Maps </h3>
<div>
<br /></div>
Mapa (inaczej zwana <a href="http://clojuredocs.org/clojure_core/clojure.core/hash-map" rel="nofollow" target="_blank">hash-map</a>)
to słownikowa struktura danych, która przechowuje dwa uporządkowane
rodzaje danych, to jest: klucz, który posiada unikalną wartość w całej
mapie i odpowiadającą mu wartość. Zarówno klucz jak i przypisane do
niego dane mogą być dowolnego typu. Mapa jest strukturą nieuporządkowaną
i nie zachowuje kolejności par klucz-dane. Podobnie jak w strukturze
Set. Mapę można traktować jako funkcję, która bierze za parametr klucz i
zwraca wartość przypisaną do klucza. Jeżeli użyję klucza Clojure (słowo
zaczynające się od dwukropka) jako funkcji i podam mu mapę jako
parametr, wyrażenie zwróci wartość pod kluczem w mapie. Jeżeli klucz nie
istnieje wyrażenie w obu przypadkach zwraca <i>nil</i>. Mapę można odróżnić po okrągłych nawiasach klamrowych.<br />
Zadanie polega na odgadnięciu wyniku podania mapie klucza jako parametr i kluczowi mapy.<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_841824">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= __ ((hash-map :a 10, :b 20, :c 30) :b))</code></div>
<div class="line number2 index1 alt1">
<code class="plain plain">T2: (= __ (:b {:a 10, :b 20, :c 30}))</code></div>
<div class="line number3 index2 alt2">
</div>
<div class="line number4 index3 alt1">
<code class="plain plain">E1: 20</code></div>
<div class="line number5 index4 alt2">
<code class="plain plain">E2: ({1 20} 1)</code></div>
<div class="line number6 index5 alt1">
<code class="plain plain">E3: (:k {:k 20})</code><br />
<code class="plain plain"><br /></code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h3>
Problem 10: Maps: conj</h3>
<div>
<br /></div>
Działanie funkcji <i><a href="http://clojuredocs.org/clojure_core/clojure.core/conj" rel="nofollow" target="_blank">conj</a></i> na zbiorze typu mapa. W przypadku mapy funkcja <i>conj</i>
bierze za pierwszy argument mapę, a kolejne argumenty dane ułożone w
pary, np. dwuelementowy wektor lub mapę. Nie da się zapodać Seta jako
parametr ze względu na niewiadomą kolejność jego elementów. <br />
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_619102">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= {:a 1, :b 2, :c 3} (conj {:a 1} __ [:c 3]))</code></div>
<div class="line number2 index1 alt1">
</div>
<div class="line number3 index2 alt2">
<code class="plain plain">E1: {:b 2}</code></div>
<div class="line number4 index3 alt1">
<code class="plain plain">E2: [:b 2]</code></div>
<div class="line number5 index4 alt2">
<code class="plain plain">E3: (hash-map :b 2)</code><br />
<code class="plain plain"><br /></code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h3>
Problem 11: Intro to Sequences</h3>
<div>
<br /></div>
Sekwencja
w Clojure to uogólniona struktura danych, która może być listą,
wektorem lub mapą. W związku z tym, że Clojure to Lisp wymagane jest by
można było się poruszać po elementach struktur danych z użyciem funkcji
first, last, second itd, które operują na listach. Chodzi o to by nie
rozdrabniać się i tworzyć różnych funkcji dla wektorów, list i map. <br />
<br />
Zadanie polega na odgadnięciu wyniku działania poszczególnych funkcji testowych. Funkcja <i><a href="http://clojuredocs.org/clojure_core/clojure.core/first" rel="nofollow" target="_blank">first</a></i> zwraca pierwszy element ciągu, <i><a href="http://clojuredocs.org/clojure_core/clojure.core/second" rel="nofollow" target="_blank">second</a></i> drugi, <i><a href="http://clojuredocs.org/clojure_core/clojure.core/last" rel="nofollow" target="_blank">last</a></i> ostatni.<br />
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_662851">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= __ (first '(3 2 1)))</code></div>
<div class="line number2 index1 alt1">
<code class="plain plain">T2: (= __ (second [2 3 4]))</code></div>
<div class="line number3 index2 alt2">
<code class="plain plain">T3: (= __ (last (list 1 2 3)))</code><br />
<code class="plain plain"><br /></code></div>
<div class="line number4 index3 alt1">
</div>
<div class="line number5 index4 alt2">
<code class="plain plain">E1: 3</code></div>
<div class="line number6 index5 alt1">
<code class="plain plain">E2: (first '(3))</code></div>
<div class="line number7 index6 alt2">
<code class="plain plain">E3: (last '(3))</code></div>
<div class="line number8 index7 alt1">
<code class="plain plain">E4: (second (first (list '(1 3) 2)))</code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h3>
Problem 12: Sequences: rest </h3>
<div>
<br /></div>
Zadanie polega na odgadnięciu wyniku działania funkcji <a href="http://clojuredocs.org/clojure_core/clojure.core/rest" rel="nofollow" target="_blank"><i>rest</i></a>. Funkcja <i>rest</i> zwraca wszystkie elementy ciągu poza pierwszym<br />
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_523692">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= __ (rest [10 20 30 40]))</code><br />
<code class="plain plain"><br /></code></div>
<div class="line number2 index1 alt1">
</div>
<div class="line number3 index2 alt2">
<code class="plain plain">E1: [20 30 40]</code></div>
<div class="line number4 index3 alt1">
<code class="plain plain">E2: '(20 30 40)</code><br />
<code class="plain plain"><br /></code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h3>
Problem 13: Intro to functions </h3>
<div>
<br /></div>
W Clojure istnieje wiele sposobów by zdefiniować funkcję:<br />
<br />
1. Za pomocą funkcji <a href="http://clojuredocs.org/clojure_core/clojure.core/fn" rel="nofollow" target="_blank"><i>fn</i></a>.
Dzięki niej tworzymy funkcje anonimowe. Nazwa za fn to nazwa funkcji.
Nie daje ona nic oprócz tego, że łatwiej rozpoznać miejsce błędu w
przypadku gdy program się posypie.<br />
<br />
2. Inny sposób tworzenia
funkcji anonimowych: za pomocą znaku number. np.: #(+ % 1). % - jest
parametrem przekazanym do funkcji. Jeżeli do tej funkcji przekazywane
jest więcej niż jeden argument, to można użyć znaku % z numerem. np. :
%1 , %2 itd.. <br />
<br />
3. Funcja <a href="http://clojuredocs.org/clojure_core/clojure.core/partial" rel="nofollow" target="_blank"><i>partial</i></a>
służy do uzupełniania parametrów funkcji, która jest jej pierwszym
argumentem. W ten sposób można sobie skrócić kod, gdy wartość jednego z
argumentów funkcji jest znana. W tym: T4 wypadku przekazywany jest
dodatkowy argument do funkcji '<a href="http://clojuredocs.org/clojure_core/clojure.core/+" rel="nofollow" target="_blank"><i>+</i></a>'.<br />
<br />
Aby zapisać funkcję pod daną nazwą można użyć makra <a href="http://clojuredocs.org/clojure_core/clojure.core/def" rel="nofollow" target="_blank"><i>def</i></a> do którego przekazujemy nazwę i funkcję anonimową, lub uproszczonego<a href="http://clojuredocs.org/clojure_core/clojure.core/defn" rel="nofollow" target="_blank"> <i>defn</i></a>.<br />
<br />
Tym razem trzeba zgadnąć wynik jaki ma pojawić się po przekazaniu parametru do funkcji anonimowej.<br />
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_694104">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= __ ((fn add-five [x] (+ x 5)) 3))</code></div>
<div class="line number2 index1 alt1">
<code class="plain plain">T2: (= __ ((fn [x] (+ x 5)) 3))</code></div>
<div class="line number3 index2 alt2">
<code class="plain plain">T3: (= __ (#(+ % 5) 3))</code></div>
<div class="line number4 index3 alt1">
<code class="plain plain">T4: (= __ ((partial + 5) 3))</code><br />
<code class="plain plain"><br /></code></div>
<div class="line number5 index4 alt2">
</div>
<div class="line number6 index5 alt1">
<code class="plain plain">E1: 8</code><br />
<code class="plain plain"><br /></code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h3>
Problem 14: Hello World </h3>
<div>
<br /></div>
Czas
na Hello World. Można zapytać. czemu tak późno? Temu, że to specjalny
Hello world. W tym miejscu powoli kończą się nasze zgadywanki, a zaczyna
praca. <br />
Zadanie polega na utworzeniu funkcji anonimowej, która
weźmie za parametr podany ciąg znaków i doda do niego Hello z !. Jako,
że z poprzedniego zadania wiemy już jak tworzyć funkcje anonimowe
zadanie jest trywialne. ;) .<br />
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_25260">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= (__ "Dave") "Hello, Dave!")</code></div>
<div class="line number2 index1 alt1">
<code class="plain plain">T2: (= (__ "Jenn") "Hello, Jenn!")</code></div>
<div class="line number3 index2 alt2">
<code class="plain plain">T3: (= (__ "Rhea") "Hello, Rhea!")</code><br />
<code class="plain plain"><br /></code></div>
<div class="line number4 index3 alt1">
</div>
<div class="line number5 index4 alt2">
<code class="plain plain">E1: #(str "Hello, " % "!")</code></div>
<div class="line number6 index5 alt1">
<code class="plain plain">E2: (fn [arg] (str "Hello," arg "!"))</code></div>
<div class="line number7 index6 alt2">
<code class="plain plain">E3: (fn hello-hi [arg] (str "Hello," arg "!"))</code></div>
<div class="line number8 index7 alt1">
<code class="plain plain">E4: #((partial str "Hello, ") % "!")</code><br />
<code class="plain plain"><br /></code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h3>
Problem 15: Double Down </h3>
<div>
<br /></div>
Podwójny daun. Zadanie polega na zgadnięciu postaci funkcji, która w magiczny sposób podwoi wartość jej argumentu. <br />
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_115416">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= (__ 2) 4)</code></div>
<div class="line number2 index1 alt1">
<code class="plain plain">T2: (= (__ 3) 6)</code></div>
<div class="line number3 index2 alt2">
<code class="plain plain">T3: (= (__ 11) 22)</code></div>
<div class="line number4 index3 alt1">
<code class="plain plain">T4: (= (__ 7) 14)</code><br />
<code class="plain plain"><br /></code></div>
<div class="line number5 index4 alt2">
</div>
<div class="line number6 index5 alt1">
<code class="plain plain">E1: #(* % 2)</code></div>
<div class="line number7 index6 alt2">
<code class="plain plain">E2: (fn [d] (* d 2))</code><br />
<code class="plain plain"><br /></code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h3>
Problem 16: Sequences: map </h3>
<div>
<br /></div>
Kolejna zgadywanka. Uwaga, by nie mylić funkcji <a href="http://clojuredocs.org/clojure_core/clojure.core/map" rel="nofollow" target="_blank"><i>map</i></a> z mapą (<i>hash-map</i>). Funkcja <i>map</i>
służy do zwracania leniwej kolekcji (leniwej, bo wartość jej elementów
liczona jest dopiero gdy są potrzebne - o tym później). Funkcja ta
bierze za argument funkcję i minimum jedną niepustą kolekcję elementów
(wektor, lista, mapa), na których kolumnami, po kolei wykonuje podaną
funkcję. Przykładowo:<br />
(map + [1 2 3]) daje: [1 2 3], bo (+ 1) daje 1<br />
(map + [1 2 3] [4 5 6]) daje : [5 7 9], bo (+ 1 4) to 5, (+ 2 5) to 7...<br />
<br />
Działanie
jest wykonywane kolumnami. Jako, że funkcja + może wziąć dowolną liczbę
parametrów można do map dawać dowolną ilość kolekcji. Jeżeli kolekcje
mają różne długości. Map wykona działanie na ilości elementów równej
długości najkrótszej kolekcji.<br />
Może narysuję o co chodzi:<br />
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_1618">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">(map + '(1 2 3) '(4 5 6) '(1 1 1)) to:</code></div>
<div class="line number2 index1 alt1">
<code class="plain spaces"> </code> </div>
<div class="line number3 index2 alt2">
<code class="plain spaces"> </code><code class="plain plain">1 | 2 | 3</code></div>
<div class="line number4 index3 alt1">
<code class="plain spaces"> </code><code class="plain plain">4 | 5 | 6</code></div>
<div class="line number5 index4 alt2">
<code class="plain spaces"> </code><code class="plain plain">1 | 1 | 1</code></div>
<div class="line number6 index5 alt1">
<code class="plain spaces"> </code><code class="plain plain">+ ---------</code></div>
<div class="line number7 index6 alt2">
<code class="plain spaces"> </code><code class="plain plain">6 | 8 |10</code><br />
<code class="plain plain"><br /></code></div>
<div class="line number8 index7 alt1">
</div>
<div class="line number9 index8 alt2">
<code class="plain plain">Wynik:</code></div>
<div class="line number10 index9 alt1">
<code class="plain spaces"> </code><code class="plain plain">'(6 8 10)</code><br />
<code class="plain plain"><br /></code></div>
<div class="line number11 index10 alt2">
</div>
<div class="line number12 index11 alt1">
<code class="plain plain">(map + '(1 2) '(4 5 6) '(1 1 1)) to:</code></div>
<div class="line number13 index12 alt2">
<code class="plain spaces"> </code> </div>
<div class="line number14 index13 alt1">
<code class="plain spaces"> </code><code class="plain plain">1 | 2 </code></div>
<div class="line number15 index14 alt2">
<code class="plain spaces"> </code><code class="plain plain">4 | 5 </code></div>
<div class="line number16 index15 alt1">
<code class="plain spaces"> </code><code class="plain plain">1 | 1 </code></div>
<div class="line number17 index16 alt2">
<code class="plain spaces"> </code><code class="plain plain">+ -----</code></div>
<div class="line number18 index17 alt1">
<code class="plain spaces"> </code><code class="plain plain">6 | 8 </code><br />
<code class="plain plain"><br /></code></div>
<div class="line number19 index18 alt2">
</div>
<div class="line number20 index19 alt1">
<code class="plain plain">Wynik:</code></div>
<div class="line number21 index20 alt2">
<code class="plain spaces"> </code><code class="plain plain">'(6 8) - 2 elementy, bo najkrótsza lista miała długość 2</code><br />
<code class="plain plain"><br /></code></div>
<div class="line number22 index21 alt1">
</div>
<div class="line number23 index22 alt2">
</div>
<div class="line number24 index23 alt1">
<code class="plain plain">(map #(+ % 5) '(1 2 3) '(4)) to:</code></div>
<div class="line number25 index24 alt2">
</div>
<div class="line number26 index25 alt1">
<code class="plain plain">ArityException Wrong number of args (2) passed to: core$eval1442$fn</code></div>
<div class="line number27 index26 alt2">
<code class="plain spaces"> </code><code class="plain plain">clojure.lang.AFn.throwArity (AFn.java:437)</code><br />
<code class="plain plain"><br /></code></div>
<div class="line number28 index27 alt1">
</div>
<div class="line number29 index28 alt2">
<code class="plain plain">Dlaczego błąd? Bo w przeciwieństwie do funkcji + funkcja anonimowa </code></div>
<div class="line number30 index29 alt1">
<code class="plain plain">#(+ % 5) przyjmuje tylko jeden parametr, a wiemy, że map przekazuje</code></div>
<div class="line number31 index30 alt2">
<code class="plain plain">parametry kolumnami. W tym przypadku map wysłał do funkcji 1 i 4</code></div>
<div class="line number32 index31 alt1">
</div>
<div class="line number33 index32 alt2">
<code class="plain plain"><br /></code>
<code class="plain plain">Aby wyrażenie było prawidłowe należy uwzględnić drugi parametr </code></div>
<div class="line number34 index33 alt1">
<code class="plain plain">w funkcji anonimowej: #(+ %1 %2 5)</code></div>
<div class="line number35 index34 alt2">
</div>
<div class="line number36 index35 alt1">
<code class="plain plain">(map #(+ %1 %2 5) '(1 2 3) '(4)) to: (10), bo 1 + 4 + 5 = 10 </code></div>
<div class="line number37 index36 alt2">
<code class="plain plain">- reguła o obcinaniu list wciąż obowiązuje. </code><br />
<code class="plain plain"><br /></code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
I zadanie:<br />
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_630148">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= __ (map #(+ % 5) '(1 2 3)))</code><br />
<code class="plain plain"><br /></code></div>
<div class="line number2 index1 alt1">
</div>
<div class="line number3 index2 alt2">
<code class="plain plain">E1: '(6 7 8)</code></div>
<div class="line number4 index3 alt1">
<code class="plain plain">E2: [6 7 8]</code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
Anonymoushttp://www.blogger.com/profile/08198769559694742403noreply@blogger.com0tag:blogger.com,1999:blog-5397603151062338268.post-80564982109764893312012-11-22T22:16:00.001+01:002012-12-08T21:04:00.613+01:00Clojure Elementary 1Tak sobie siedzę i
myślę, że można by tu coś napisać dla potomności. W szczególności dla
początkujących, a i osobiście samemu podciągnąć się z języka. <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0QkAENRlQ2HiY4mbVdsSySaX6pIVm3q0EHrUW1gKy5leQc-zoopLUBE0LHzu9GeGeXPlMJ54X8u-plAhpD71veO8DkgidHWNEo9lBXV0fXYPaMyjAaMdQhE8G5z4jFfM7v0oHuLyJr2U/s1600/53_0.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="337" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0QkAENRlQ2HiY4mbVdsSySaX6pIVm3q0EHrUW1gKy5leQc-zoopLUBE0LHzu9GeGeXPlMJ54X8u-plAhpD71veO8DkgidHWNEo9lBXV0fXYPaMyjAaMdQhE8G5z4jFfM7v0oHuLyJr2U/s400/53_0.jpg" width="400" /></a></div>
<br />
<div style="text-align: center; width: 100%;">
<div class="one imageWithDescription" style="text-align: center;">
<br />
<div class="data">
Twórca Clojure : Rich Hickey</div>
</div>
</div>
Postanowiłem więc, że napiszę wstępniaka wzorując się na problemach ze strony <a href="http://www.4clojure.com/" rel="nofollow" target="_blank">4Clojure</a>
. Strona zawiera zestaw problemów podzielonych na kategorie o różnych
stopniach trudności. Postaram się w każdym nowym wpisie na blogu
rozwiązać kilka z nich. Oczywiście zacznę od najłatwiejszych. Pomysł
poznawania Clojure dzięki przykładom, które mogą być testowane jest
wyjątkowo ciekawy. Nie spotkałem jeszcze czegoś podobnego dla innych
języków. Nie ma jednak tak wspaniale jakby się można było spodziewać.
Często zadania z pozoru trywialne rozwiązuje się dość długo ze względu
na zbyt uproszczoną dokumentację. Aby nie tracić czasu i nie zanudzać
może od razu przejdę do rzeczy.<br />
<h3>
Problem 1: Nothing but the truth</h3>
Zadanie
polega na podaniu w miejscu : ___ wyrażenia, które redukuje się do
postaci prawda/fałsz. Może to być wyrażenie logiczne lub po prostu :
true. Zadania będę oznaczać literą T i numerem, a przykładowe odpowiedzi
literą E i numerem. Odpowiedzi można wpisywać na stronie w polu
tekstowym i kliknąć w przycisk Run. Jeżeli zadanie zostanie rozwiązane
poprawnie, to przy każdym problemie zapali się zielona dioda. Jeżeli
nie, zapali się czerwona. Do testów polecam tę stronę: <a href="http://tryclj.com/" rel="nofollow" target="_blank">try Clojure</a>. Do bardziej zaawansowanych rzeczy będzie potrzebny prawdziwy Clojure z IDE. Polecam także <a href="http://clojure.org/cheatsheet" rel="nofollow" target="_blank">ściągawkę</a>, która posiada wiele przykładów.<br />
<br />
Zaczynamy:<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_881218">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= ___ true)</code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
Funkcje
zwracające prawdę lub fałsz w Clojure to : <, >, =, not, not=,
>=, <= oraz wszelkie funkcje kończące się znakiem: ? . Pytajnik
nie ma wpływu na działanie funkcji, to część jej nazwy. Po prostu taka
zasada została przyjęta w nazewnictwie funkcji, które zwracają wartości
logiczne. <em>nil</em> to odpowiednik znanego <em>null</em> z innych języków i oznacza wartość nieokreśloną.<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_905012">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">E1: true </code></div>
<div class="line number2 index1 alt1">
<code class="plain plain">E2: (= 1 1)</code></div>
<div class="line number3 index2 alt2">
<code class="plain plain">E3: (not false)</code></div>
<div class="line number4 index3 alt1">
<code class="plain plain">E4: (>= 2 1)</code></div>
<div class="line number5 index4 alt2">
<code class="plain plain">E5: (>= 2 2)</code></div>
<div class="line number6 index5 alt1">
<code class="plain plain">E6: (not= 2 3)</code></div>
<div class="line number7 index6 alt2">
<code class="plain plain">E7: (< 1 2 3 4)</code></div>
<div class="line number8 index7 alt1">
<code class="plain plain">E8: (> 4 3 2 1)</code></div>
<div class="line number9 index8 alt2">
<code class="plain plain">E9: (nil? nil)</code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h3>
Problem 2: Simple math</h3>
Zadanie polega na odgadnięciu liczby, bądź wyrażenia, które spełni warunek:<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_333308">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= (- 10 (* 2 3)) __)</code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
Rozkładając wyrażenie (- 10 (* 2 3)) na postać znaną ze szkoły mam wyrażenie:<br />
10 - (2 * 3) <br />
którego wynik to: 4, stąd, możliwe odpowiedzi:<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_906702">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">E1: 4</code></div>
<div class="line number2 index1 alt1">
<code class="plain plain">E2: (* 2 2)</code></div>
<div class="line number3 index2 alt2">
<code class="plain plain">E3: (+ 2 2)</code></div>
<div class="line number4 index3 alt1">
<code class="plain plain">E4: (/ 8 2)</code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
To:
(/ 4 1.0) wyrażenie mimo, że wydaje się, że poprawne zwraca fałsz. Co
się dzieje? Otóż wynikiem tego działania nie jest 4 a 4.0 - różny typ
danych. Pierwszy jest wartością całkowitą, drugi przybliżoną - tzw.
zmiennoprzecinkową. Reprezentacje bitowe tych liczb są różne. Aby
równanie było prawdziwe test musiałby wyglądać tak: (== ... ), czyli
zawierać funkcję <a href="http://clojuredocs.org/clojure_core/clojure.core/==" rel="nofollow" target="_blank">==</a>, która porównuje wartości bez zwracania uwagi na typ danych wykonując najpierw konwersję, a potem porównanie. <br />
<h3>
Problem 3: Intro to Strings</h3>
Teraz musimy zgadnąć co zwróci funkcja: <em>.toUpperCase</em>. Oczywiście funkcja zamienia w tekście małe znaki na duże.<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_520960">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= __ (.toUpperCase "hello world"))</code></div>
<div class="line number2 index1 alt1">
</div>
<div class="line number3 index2 alt2">
<code class="plain plain">E1: "HELLO WORLD"</code></div>
<div class="line number4 index3 alt1">
<code class="plain plain">E2: (str "HELLO" " " "WORLD")</code></div>
<div class="line number5 index4 alt2">
<code class="plain plain">E3: (str \H \E \L \L \O \ \W \O \R \L \D)</code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<a href="http://clojuredocs.org/clojure_core/clojure.core/str" rel="nofollow" target="_blank">str</a> = funkcja, która łączy wszystkie argumenty w jeden ciąg znaków. Można zapodać liczbę, symbol, znak : \A. Typ <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html" rel="nofollow" target="_blank">String</a>
w Clojure jest tym samym typem z Javy przeniesionym bez zmian. Działają
więc na nim wszystkie funkcje z Javy. Funkcję Javy można łatwo
rozpoznać po kropce na początku nazwy.<br />
<h3>
Problem 4: Intro to Lists </h3>
Zadanie polega na przekazaniu odpowiednich argumentów do funkcji <a href="http://clojuredocs.org/clojure_core/clojure.core/list" rel="nofollow" target="_blank"><em>list</em></a>. <br />
Listę
można utworzyć za pomocą polecenia list lub ujmując dane w: '( ) -
nawiasy przed którymi jest apostrof. Słowa zaczynające się dwukropkiem
nazywane są kluczami. Klucze to jeden z podstawowych typów danych, który
ewaluuje się na siebie, tak jak liczba. <br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_433772">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= (list __) '(:a :b :c))</code></div>
<div class="line number2 index1 alt1">
</div>
<div class="line number3 index2 alt2">
<code class="plain plain">E1: :a :b :c</code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h3>
Problem 5: Lists: conj</h3>
Funkcja <em><a href="http://clojuredocs.org/clojure_core/clojure.core/conj" rel="nofollow" target="_blank">conj</a></em>.
Wywołuje się ją podając pierwszy argument jako listę/wektor lub set, a
resztę już jako dowolny typ danych. Zwraca ona nową listę/wektor/set z
dodanymi polami do podanej struktury. Conj nowe elementy listy umieszcza
na jej początku, a do wektora łączy na końcu. W przypadku seta nie ma
znaczenia. Set jest strukturą o nieuporządkowanej kolejności elementów.
Funkcja zwróci wyjątek się jeżeli pierwszy argument nie będzie listą lub
wektorem/setem i nie będzie minimum dwóch argumentów. Co ciekawe,
funkcja porównawcza nie zaprotestuje jeżeli zapodać jej listę i wektor.
Pod względem działania z zewnątrz wektor jest równoważny liście, pod
spodem działa trochę inaczej.<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_530818">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= __ (conj '(2 3 4) 1))</code></div>
<div class="line number2 index1 alt1">
<code class="plain plain">T2: (= __ (conj '(3 4) 2 1))</code></div>
<div class="line number3 index2 alt2">
</div>
<div class="line number4 index3 alt1">
<code class="plain plain">E1: '(1 2 3 4)</code></div>
<div class="line number5 index4 alt2">
<code class="plain plain">E1: (list 1 2 3 4)</code></div>
<div class="line number6 index5 alt1">
<code class="plain plain">E3: [ 1 2 3 4 ]</code></div>
<div class="line number7 index6 alt2">
<code class="plain plain">E4: (vector 1 2 3 4)</code></div>
<div class="line number8 index7 alt1">
<code class="plain plain">E5: (vec '(1 2 3 4))</code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h3>
Problem 6: Intro to Vectors</h3>
Jak wspominałem wcześniej wektory mogą być porównywane bezpośrednio z listami.<br />
Zadanie polega na wypisaniu elementów wektora. <br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_381356">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= [__] (list :a :b :c) (vec '(:a :b :c)) (vector :a :b :c))</code></div>
<div class="line number2 index1 alt1">
</div>
<div class="line number3 index2 alt2">
<code class="plain plain">E1: :a :b :c</code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
Funkcja <em><a href="http://clojuredocs.org/clojure_core/clojure.core/vector" rel="nofollow" target="_blank">vector</a></em> tworzy wektor z argumentów. Funkcja <em><a href="http://clojuredocs.org/clojure_core/clojure.core/vec" rel="nofollow" target="_blank">vec</a></em> tworzy wektor z listy.<br />
<h3>
Problem 7: Intro to Sets</h3>
Set,
to lista, w której mogą znajdować się tylko unikalne wartości w losowej
kolejności. W związku z tym nigdy nie należy brać pod uwagę
rozmieszczenia jego elementów. Dla rozróżnienia oznacza się go
okrągłymi klamrami ze znaczkiem number przed pierwszą klamrą: #{ }.
Zadanie polega na odgadnięciu wyniku. Set tworzy się za pomocą funkcji <em><a href="http://clojuredocs.org/clojure_core/clojure.core/set" rel="nofollow" target="_blank">set</a></em> z listy lub wektora. Funkcja <em><a href="http://clojuredocs.org/clojure_core/clojure.set/union" rel="nofollow" target="_blank">union</a></em> łączy dwa sety w jeden. Kolejność elementów w secie nie ma znaczenia.<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_103029">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= __ (set '(:a :a :b :c :c :c :c :d :d)))</code></div>
<div class="line number2 index1 alt1">
<code class="plain plain">T2: (= __ (clojure.set/union #{:a :b :c} #{:b :c :d}))</code></div>
<div class="line number3 index2 alt2">
</div>
<div class="line number4 index3 alt1">
<code class="plain plain">E1: #{:a :b :c :d}</code></div>
<div class="line number5 index4 alt2">
<code class="plain plain">E2: #{:b :a :d :c}</code></div>
<div class="line number6 index5 alt1">
<code class="plain plain">E3: (clojure.set/union #{:a :b} #{:c} #{:d})</code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h3>
Problem 8: Sets: conj</h3>
Funkcja <em><a href="http://clojuredocs.org/clojure_core/clojure.core/conj" rel="nofollow" target="_blank">conj</a></em> w zastosowaniu do setów. <br />
<div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">T1: (= #{1 2 3 4} (conj #{1 4 3} __))</code></div>
<div class="line number2 index1 alt1">
</div>
<div class="line number3 index2 alt2">
<code class="plain plain">E1: 2</code></div>
</div>
Anonymoushttp://www.blogger.com/profile/08198769559694742403noreply@blogger.com0tag:blogger.com,1999:blog-5397603151062338268.post-16502473028305967322012-09-30T23:25:00.005+02:002012-12-23T13:13:46.614+01:00Smalltalk : Seaside z użyciem Pharo, cz.2<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 0px; margin-right: 0px; text-align: left;"><tbody>
<tr><td style="text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8rjItnZ2SDmORgec6chfu9ZfsgF94Kie54BjFbtbvTWt5ii0dBu3MN9i7tPR_kibWTiexkPoWM4CzdEVCjx_ZdwuXPN2eg5XTyE9uokp1pBKZa38AdyqSzsAUI9zGr-p3hzTOw7xfD1c/s1600/SmalltalkBalloon1998.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8rjItnZ2SDmORgec6chfu9ZfsgF94Kie54BjFbtbvTWt5ii0dBu3MN9i7tPR_kibWTiexkPoWM4CzdEVCjx_ZdwuXPN2eg5XTyE9uokp1pBKZa38AdyqSzsAUI9zGr-p3hzTOw7xfD1c/s400/SmalltalkBalloon1998.jpg" width="322" /></a></span></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: small;">(c) Robert Tinney</span></td></tr>
</tbody></table>
<div style="text-align: justify;">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><br />Dzisiaj postanowiłem pokazać jak w prosty sposób odczytać komentarze z bloga na portalu dobreprogramy.pl, który nie posiada usługi odczytu wiadomości za pomocą XML/JSON przez co trzeba parsować HTML. Dla niecierpliwych na końcu tekstu jest krótki film podsumowujący temat tego wpisu.<br /><br />Odczyt zawartości strony internetowej robi się dość banalnie. Wystarczy w Workspace Pharo wpisać :</span></div>
<div style="text-align: justify;">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><br /><span style="font-family: "Courier New",Courier,monospace;"><span style="color: purple;">'http://www.google.com'</span> asUrl retrieveContents contents.</span></span></div>
<div style="text-align: justify;">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"> </span><br />Potem umieścić kursor klawiatury za kropką (bądź zaznaczyć myszką cał<span style="font-size: small;">ą linijkę kodu</span>) i nacisnąć [Ctrl+p] ("Print it"). Powinna pojawić się zawartość z podanego adresu. Tekst, który się pojawia jest już zaznaczony, więc można nacisnąć klawisz Del by go usunąć.<br /><br />Jako, że tekst strony już mamy, to potrzebny będzie parser HTML. Będzie potrzebny, bo wbudowany parser XML tonie w zupie tagów luźno zapodanego HTMLa, gdzie zdarzają się niedomknięte tagi, ew. tagi zapisane niezgodnie z dokumentacją i wtrącenia w postaci JavaScriptu czy CSS i inne śmieci.<br /><br />Dodatkowe biblioteki Smalltalka są przechowywane w repozytoriach. Z takiego dziś skorzystam. Jest to repozytorium Squeaka (inna odmiana Smalltalka zgodna z Pharo).<br /><br />Aby zainstalować bibliotekę trzeba wejść do przeglądarki Monticello (dostępne z menu myszki). Następnie trzeba kliknąć w "+Package" nadać dowolną nazwę, np. "Soup". Potem klik w "+Repository" i wybieram opcję HTTP. Modyfikuję adres, który się pojawi na szablonie na:</span></div>
<div style="text-align: justify;">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><br /><span style="font-family: "Courier New",Courier,monospace;">location: <span style="color: purple;">'http://www.squeaksource.com/Soup'</span></span><br /><br />Klikam OK, potem w "Open". Załaduje się lista wersji pakietów. Trzeba teraz wybrać ConfigurationOfSoup - najnowszą wersję , u mnie jest 37 i kliknąć Load. ConfigurationOfSoup to pakiet obiektów, które pobiorą najnowszą wersję zupki. Aby się dowiedzieć jak go uruchomić trzeba otworzyć System Browser i znaleźć ConfigurationOfSoup. Można to zrobić poprzez menu z Find, górną belkę, lub przewinąć listę na sam koniec. Najnowsze pakiety są widoczne zawsze na końcu. W drugim okienku, które jest zwane klasowym lub instancji trzeba kliknąć jeszcze raz nazwę ConfigurationOfSoup, a potem pytajnik. Pod pytajnikiem zwykle jest dokumentacja obiektu.</span></div>
<div style="text-align: justify;">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><br />Widać tam dwie linijki. Jako, że kod Smalltaka można wykonać z każdego okienka, zaznaczam linijkę z wersją #stable i wykonuję <span style="color: #274e13;">"Do it"</span>. skrypt pobierze i skompiluje resztę biblioteki.<br /><br />Teraz można pobrać zupę do obiektu już za pomocą samej biblioteki (oczywiście wszystko to wpisuję w Workspace):</span></div>
<div style="text-align: justify;">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><br /></span><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="color: blue;">zupa</span> := <span style="color: blue;">Soup</span> fromUrl: <span style="color: purple;">'http://*dobreprog***.pl/aeroflyluby/Domowy-sposob-na-Diode,36474.html'</span>.</span></span><br />
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><br />Tym razem użyłem prawdziwego adresu z bloga. Mam więc zupę z tagów i w tym momencie zaczyna się zabawa. Trzeba dowiedzieć się pomiędzy jakimi tagami trzymany jest blok komentarzy. Potem znaleźć pojedyncze wpisy, a następnie rozbić na:</span></div>
<ul>
<li><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"> adres logo: <span style="color: purple;">#img</span></span></li>
<li><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"> nazwę komentującego: <span style="color: purple;">#nick</span></span></li>
<li><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"> treść komentarza: <span style="color: purple;">#text</span></span></li>
</ul>
<div style="text-align: justify;">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Zrobiłem małe rozeznanie i znalazłem id tagu, w którym te komentarze siedzą:</span></div>
<div style="text-align: justify;">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><br /><span style="font-family: "Courier New",Courier,monospace;">ctl00_phContentLeft_panUpdateComment</span><br /> </span></div>
<div style="text-align: justify;">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Niestety Soup nie ma możliwości wyciągania tagów po identyfikatorze. Trzeba sobie napisać swoją funkcję. Najlepiej to zrobić zrzynając już z istniejącej:</span></div>
<div style="text-align: justify;">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><br /><span style="font-family: "Courier New",Courier,monospace;"><b>findTagByClass:</b> <span style="color: blue;">aString</span><br /> <span style="color: #45818e;">^ self</span> findTagByClass: <span style="color: blue;">aString</span> ifAbsent: [<span style="color: #660000;">nil</span>]</span><br /><br />Oczywiście tworzymy ją w instancji klasy SoupTag w pakiecie Soup-Core. Widać w kodzie, że funkcja ta wywołuje jeszcze inną, z parametrem ifAbsent, która to jest główną (rozszerzoną funkcją) do wyciągania tagu. Jej nazwę też trzeba podmienić. W sumie tworzymy dwie funkcje:</span></div>
<div style="text-align: justify;">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><br /><span style="font-family: "Courier New",Courier,monospace;"><b>findTagByID:</b> <span style="color: blue;">aString</span><br /> <span style="color: #45818e;">^ self</span> findTagByID: <span style="color: blue;">aString</span> ifAbsent: [<span style="color: #660000;">nil</span>]</span><br /><br />i</span></div>
<div style="text-align: justify;">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><br /><span style="font-family: "Courier New",Courier,monospace;"><b>findTagByID:</b> <span style="color: blue;">aString</span> ifAbsent: <span style="color: blue;">aBlock</span><br /> <span style="color: #45818e;"> self</span> findTag: [<span style="color: blue;">:aTag</span> | (<span style="color: blue;">aTag</span> attributeAt: <span style="color: purple;">'id'</span>) = <span style="color: blue;">aString</span>]<br /> ifPresent: [<span style="color: blue;">:aTag</span> | ^ <span style="color: blue;">aTag</span>].<br /> <span style="color: #45818e;">^</span> <span style="color: blue;">aBlock</span> value</span><br /><br />Mając te dwie funkcje mogę już wyciągnąć tag, w którym siedzą komentarze:</span></div>
<div style="text-align: justify;">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><br /><span style="font-family: "Courier New",Courier,monospace;"><span style="color: blue;">root</span>:= <span style="color: blue;">aSoup</span> findTagByID: <span style="color: purple;">'ctl00_phContentLeft_panUpdateComment'</span>.</span><br /><br />Można użyć <span style="color: #274e13;">"<b>Print it</b>"</span>, które wyświetli treść tagu, lub dać <span style="color: #274e13;">"<b>Do it</b>"</span> i podejrzeć obiekt root przez zaznaczenie go i użycie <span style="color: #274e13;">"<b>Inspect it</b>"</span>.<br /><br />Teraz czas wyciągnąć pojedyncze pola komentarzy. Tutaj będzie trochę trudniej, bo id komentarzy zmienia się. To jest, id komentarzy jest w postaci: <span style="font-family: "Courier New",Courier,monospace;">komentarz_124234</span>. Niestety, Soup nie umożliwia wyciągania tagów z użyciem wyrażeń regularnych. Trzeba będzie sobie poradzić. I znów trzeba zmodyfikować nasze nowe funkcje:</span></div>
<div style="text-align: justify;">
<br />
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: "Courier New",Courier,monospace;">
</span></span>
<br />
<div align="LEFT">
<span style="font-family: Courier New, monospace;"><span style="font-size: small;"><b>findAllTagsByIDregX:</b>
<span style="color: #2323dc;">aString</span><br /> <span style="color: teal;">^</span>
<span style="color: #2323dc;">Array</span> streamContents: [ <span style="color: #2323dc;">:aStream</span>
|<br />
<span style="color: teal;">self</span> findAllTagsByIDregX:
<span style="color: #2323dc;">aString</span><br />
stream: <span style="color: #2323dc;">aStream</span> ]<br /><br /><span style="font-family: Arial, sans-serif;">i</span></span></span></div>
<div align="LEFT">
<br />
<span style="font-family: Courier New, monospace;"><span style="font-size: small;"><b>findAllTagsByIDregX:</b></span><span style="font-size: small;">
</span><span style="color: #2323dc;"><span style="font-size: small;">aString</span></span><span style="font-size: small;">
</span><span style="font-size: small;"><b>stream:</b></span><span style="font-size: small;"> </span><span style="color: #2323dc;"><span style="font-size: small;">aStream</span></span></span></div>
<div align="LEFT">
<span style="font-family: Courier New, monospace;"><span style="color: teal;"><span style="font-size: small;">self</span></span><span style="font-size: small;">
childTagsDo:</span></span></div>
<div align="LEFT">
[ :<span style="font-family: Courier New, monospace;"><span style="color: #2323dc;"><span style="font-size: small;">aTag</span></span><span style="font-size: small;">
|</span> ((<span style="color: #2323dc;"><span style="font-size: small;">aTag</span></span><span style="font-size: small;">
attributeAt: </span><span style="color: purple;"><span style="font-size: small;">'id'</span></span><span style="font-size: small;">)
isNil ) ifFalse:</span></span></div>
<div align="LEFT">
[((<span style="font-family: Courier New, monospace;"><span style="color: #2323dc;"><span style="font-size: small;">aTag</span></span><span style="font-size: small;">
id) matchesRegex: </span><span style="color: #2323dc;"><span style="font-size: small;">aString</span></span><span style="font-size: small;">)
ifTrue: [</span><span style="color: #2323dc;"><span style="font-size: small;">aStream</span></span><span style="font-size: small;">
nextPut: </span><span style="color: #2323dc;"><span style="font-size: small;">aTag</span></span><span style="font-size: small;">
]</span>].</span></div>
<div align="LEFT">
<span style="font-family: Courier New, monospace;"><span style="color: #2323dc;"><span style="font-size: small;">aTag
</span></span><span style="font-size: small;">findAllTagsByID: </span><span style="color: #2323dc;"><span style="font-size: small;">aString</span></span>
<span style="font-size: small;">stream: </span><span style="color: #2323dc;"><span style="font-size: small;">aStream</span></span><span style="font-size: small;">
]</span></span></div>
<div align="LEFT">
<br />
<span style="font-family: Arial, sans-serif;"><span style="font-size: small;">oraz:</span></span></div>
<div align="LEFT">
<br />
<span style="font-family: Courier New, monospace;"><span style="font-size: small;"><b>findAllTagsByID:</b></span><span style="font-size: small;">
</span><span style="color: #2323dc;"><span style="font-size: small;">aString</span></span><span style="font-size: small;"><br />
</span><span style="color: teal;"><span style="font-size: small;">^</span></span><span style="font-size: small;">
</span><span style="color: #2323dc;"><span style="font-size: small;">Array</span></span><span style="font-size: small;">
streamContents: [ </span><span style="color: #2323dc;"><span style="font-size: small;">:aStream</span></span><span style="font-size: small;">
|<br />
</span><span style="color: teal;"><span style="font-size: small;">self </span></span><span style="font-size: small;">findAllTagsByID:
</span><span style="color: #2323dc;"><span style="font-size: small;">aString </span></span><span style="font-size: small;">stream:
</span><span style="color: #2323dc;"><span style="font-size: small;">aStream</span></span><span style="font-size: small;">
]</span><span style="font-family: Arial, sans-serif;"><span style="font-size: small;">i</span></span></span></div>
<div align="LEFT">
<br />
<span style="font-family: Courier New, monospace;"><span style="font-size: small;"><b>findAllTagsByID:</b></span><span style="font-size: small;">
</span><span style="color: #2323dc;"><span style="font-size: small;">aString</span></span><span style="font-size: small;">
</span><span style="font-size: small;"><b>stream:</b></span><span style="color: #2323dc;"><span style="font-size: small;">
aStream</span></span><span style="font-size: small;"><br /> self
childTagsDo:<br /> [ :</span><span style="color: #2323dc;"><span style="font-size: small;">aTag</span></span><span style="font-size: small;">
| (</span><span style="color: #2323dc;"><span style="font-size: small;">aTag</span></span><span style="font-size: small;">
attributeAt: </span><span style="color: #94006b;"><span style="font-size: small;">'id'</span></span><span style="font-size: small;">)
= </span><span style="color: #2323dc;"><span style="font-size: small;">aString</span></span><span style="font-size: small;">
<br />
ifTrue: [</span><span style="color: #2323dc;"><span style="font-size: small;">aStream</span></span><span style="font-size: small;">
nextPut: </span><span style="color: #2323dc;"><span style="font-size: small;">aTag</span></span><span style="font-size: small;">
].<br /> </span><span style="color: #2323dc;"><span style="font-size: small;">aTag</span></span><span style="font-size: small;">
findAllTagsByID: </span><span style="color: #2323dc;"><span style="font-size: small;">aString</span></span><span style="font-size: small;">
stream: </span><span style="color: #2323dc;"><span style="font-size: small;">aStream</span></span><span style="font-size: small;">
]</span></span></div>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><br /><span style="font-family: Arial,Helvetica,sans-serif;">Mając te funkcje teraz mogę wyciągnąć komentarze do tablicy:</span></span></span><br />
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"></span><span style="color: blue;"><br />komentIDregX</span> := <span style="color: purple;">'komentarz_[0-9]+'</span>.<br /><span style="color: blue;">komentSoups</span> := <span style="color: blue;">root</span> findAllTagsByIDregX: <span style="color: blue;">komentIDregX</span>.</span><br /><br />Super. ;) Teraz utworzę obiekty na tagi komentarzy, nicków i logo komentujących:</span></div>
<div style="text-align: justify;">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><br /></span><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: "Courier New",Courier,monospace;">
</span></span><br />
<div align="LEFT">
<span style="font-family: Courier New, monospace;"><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">komentClass</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">
:= </span></span><span style="color: #94006b;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">'text-h75
tresc'</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">.</span></span><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;"> </span></span></span></span><br />
<span style="font-family: Courier New, monospace;"><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">imgClass</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">
:= </span></span><span style="color: #94006b;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">'border
small float-left'</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">.</span></span></span><br />
<span style="font-family: Courier New, monospace;"><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">nickClass</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">
:= </span></span><span style="color: #94006b;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">'text-h65
font-heading display-inl_blk nick'</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">.</span></span></span><br />
<span style="font-family: Courier New, monospace;"><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">nixesTags</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">
:= </span></span><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">root</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">
findAllTagsByClass: </span></span><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">nickClass</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">.</span></span></span><br />
<span style="font-family: Courier New, monospace;"><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">imgsTags</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">
:= </span></span><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">root</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">
findAllTagsByClass: </span></span><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">imgClass</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">.</span></span></span><br />
<span style="font-family: Courier New, monospace;"><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">komentTags</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">
:= </span></span><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">root</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">
findAllTagsByClass: </span></span><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">komentClass</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">.</span></span><span style="font-family: Arial, sans-serif;"><span style="font-size: small;">
</span></span></span>
</div>
<div align="LEFT" style="margin-bottom: 0cm;">
<br /></div>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">OK. Teraz wyciągamy tekst i inne ciekawe rzeczy:</span></div>
<div style="text-align: justify;">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><br /></span><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: "Courier New",Courier,monospace;">
</span></span><br />
<div align="LEFT">
<span style="font-family: Courier New, monospace;"><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">nixes</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">
:= </span></span><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">OrderedCollection</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">
new.</span></span><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">imgs</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">
:= </span></span><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">OrderedCollection</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">
new.</span></span><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;"> </span></span></span></span><br />
<span style="font-family: Courier New, monospace;"><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">koments</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">
:= </span></span><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">OrderedCollection</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">
new.</span></span><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">nixesTags</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">
do: [:</span></span><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">tag</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">
| </span></span><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">nixes</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">
add: (</span></span><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">tag</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">
text) ].</span></span></span><br />
<span style="font-family: Courier New, monospace;"><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">imgsTags</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">
do: [:</span></span><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">tag</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">
| </span></span><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">imgs</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">
add: (</span></span><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">tag</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">
src) ].</span></span></span><br />
<span style="font-family: Courier New, monospace;"><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">komentTags</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">
do: [:</span></span><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">tag</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">
| </span></span><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">koments</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">
add: (</span></span><span style="color: #2323dc;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">tag</span></span></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;">
text) ].</span></span><span style="font-family: Arial, sans-serif;"><span style="font-size: small;"> </span></span></span>
</div>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"></span><br /><br />Oto rezultat:</span></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4PAqxSaX6m65gW4OPe56A748LNN2QpQGpYPajKBdPC4DRVMhMosVi2wgFxXGlH_lmbOSpX3EY_-DGqberjloro3wvz20xRQXg3T83RbCqOCDLOiEViErBSYSNN7_-JcZAKs6QHc13Tss/s1600/Zrzut+ekranu+z+2012-09-29+22:17:09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="193" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4PAqxSaX6m65gW4OPe56A748LNN2QpQGpYPajKBdPC4DRVMhMosVi2wgFxXGlH_lmbOSpX3EY_-DGqberjloro3wvz20xRQXg3T83RbCqOCDLOiEViErBSYSNN7_-JcZAKs6QHc13Tss/s320/Zrzut+ekranu+z+2012-09-29+22:17:09.png" width="320" /></a></span></div>
<div style="text-align: justify;">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><br /><br />Jak ktoś chce sprawdzić czy adresy obrazków są dobre, to może wyświetlić np. pierwszy poleceniem:</span></div>
<div style="text-align: justify;">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><br /></span><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: "Courier New",Courier,monospace;">(<span style="color: blue;">ImageMorph</span> fromStream: ((<span style="color: blue;">imgs</span> at: 1) asUrl retrieveContents contentStream)) openInWorld.</span></span></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguXEbyxGriZeyVIy6C604fbW9ADHXib3GaQwdJNjhEY4ls_syYUZGRfcamyZjW6v-JezsdXz9vI5zvqJiRj_1lUc22xxpuk0YL3Ij0ULhQLudCdjZjP_AOSsiYSOC46sm6zWc1GSsQ3i4/s1600/Zrzut+ekranu+z+2012-09-29+23:06:58.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="221" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguXEbyxGriZeyVIy6C604fbW9ADHXib3GaQwdJNjhEY4ls_syYUZGRfcamyZjW6v-JezsdXz9vI5zvqJiRj_1lUc22xxpuk0YL3Ij0ULhQLudCdjZjP_AOSsiYSOC46sm6zWc1GSsQ3i4/s320/Zrzut+ekranu+z+2012-09-29+23:06:58.png" width="320" /></a></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><br /></span>
<span style="font-size: small;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Aby pozbyć się obrazka trzeba wcisnąć Shift i kliknąć na obrazku środkowym przyciskiem myszki.<br /><br />Oczywiście poprzedni kod można zapisać krócej używając słownika i listy. Słownik (Dictionary) to odpowiednik mapy w Javie. Ostateczna postać:</span></div>
<div style="text-align: justify;">
<div align="LEFT">
<br />
<span style="font-family: Courier New, monospace;"><span style="color: #2323dc;"><span style="font-size: small;">zupa</span></span><span style="font-size: small;">
:= </span><span style="color: #2323dc;"><span style="font-size: small;">Soup</span></span><span style="font-size: small;">
fromUrl:
</span><span style="color: #94006b;"><span style="font-size: small;">'http://www.d***y.pl/aeroflyluby/Domowy-sposob-na-Diode,36474.html'</span></span><span style="font-size: small;">.</span></span></div>
<span style="font-family: Courier New, monospace;"><span style="font-size: small;"><span style="color: #2323dc;">root</span>:=
<span style="color: #2323dc;">zupa</span> findTagByID:
<span style="color: #94006b;">'ctl00_phContentLeft_panUpdateComment'</span>.</span></span><br />
<br />
<span style="font-family: Courier New, monospace;"><span style="color: #2323dc;"><span style="font-size: small;">komentIDregX</span></span><span style="font-size: small;">
:= </span><span style="color: #94006b;"><span style="font-size: small;">'komentarz_[0-9]+'</span></span><span style="font-size: small;">.</span></span><br />
<span style="font-family: Courier New, monospace;"><span style="font-size: small;"><span style="color: #2323dc;">komentClass</span>
:= <span style="color: #94006b;">'text-h75 tresc'</span>.</span></span><br />
<span style="font-family: Courier New, monospace;"><span style="font-size: small;"><span style="color: #2323dc;">imgClass</span>
:= <span style="color: #94006b;">'border small float-left'</span>.</span></span><br />
<span style="font-family: Courier New, monospace;"><span style="font-size: small;"><span style="color: #2323dc;">nickClass</span>
:= <span style="color: #94006b;">'text-h65 font-heading display-inl_blk
nick'</span>.</span></span><br />
<br />
<span style="font-family: Courier New, monospace;"><span style="color: #2323dc;"><span style="font-size: small;">komentSoups</span></span><span style="font-size: small;">
:= </span><span style="color: #2323dc;"><span style="font-size: small;">root</span></span><span style="font-size: small;">
findAllTagsByIDregX: komentIDregX.</span></span><br />
<br />
<span style="font-family: Courier New, monospace;"><span style="color: #2323dc;"><span style="font-size: small;">komenty</span></span><span style="font-size: small;">
:= </span><span style="color: #2323dc;"><span style="font-size: small;">OrderedCollection</span></span><span style="font-size: small;">
new.</span></span><br />
<span style="font-family: Courier New, monospace;"><span style="font-size: small;"><span style="color: #2323dc;">komentSoups</span>
do: [:<span style="color: #2323dc;">ks</span> |</span></span><br />
<span style="font-family: Courier New, monospace;"><span style="color: #2323dc;"><span style="font-size: small;">koment</span></span><span style="font-size: small;">
:= </span><span style="color: #2323dc;"><span style="font-size: small;">Dictionary</span></span><span style="font-size: small;">
new.</span></span><br />
<span style="font-family: Courier New, monospace;"><span style="color: #2323dc;"><span style="font-size: small;">koment</span></span><span style="font-size: small;">
at: </span><span style="color: #94006b;"><span style="font-size: small;">#nick</span></span><span style="font-size: small;">
put: (</span><span style="color: #2323dc;"><span style="font-size: small;">ks</span></span><span style="font-size: small;">
findTagByClass: </span><span style="color: #2323dc;"><span style="font-size: small;">nickClass</span></span><span style="font-size: small;">)
text.</span></span><br />
<span style="font-family: Courier New, monospace;"><span style="color: #2323dc;"><span style="font-size: small;">koment</span></span><span style="font-size: small;">
at: </span><span style="color: #94006b;"><span style="font-size: small;">#img</span></span><span style="font-size: small;">
put: (</span><span style="color: #2323dc;"><span style="font-size: small;">ks</span></span><span style="font-size: small;">
findTagByClass: </span><span style="color: #2323dc;"><span style="font-size: small;">imgClass</span></span><span style="font-size: small;">)
src.</span></span><br />
<span style="font-family: Courier New, monospace;"><span style="color: #2323dc;"><span style="font-size: small;">koment</span></span><span style="font-size: small;">
at: </span><span style="color: #94006b;"><span style="font-size: small;">#text</span></span><span style="font-size: small;">
put: (</span><span style="color: #2323dc;"><span style="font-size: small;">ks</span></span><span style="font-size: small;">
findTagByClass: </span><span style="color: #2323dc;"><span style="font-size: small;">komentClass</span></span><span style="font-size: small;">)
text.</span></span><br />
<span style="font-family: Courier New, monospace;"><span style="color: #2323dc;"><span style="font-size: small;">komenty</span></span><span style="font-size: small;">
add: </span><span style="color: #2323dc;"><span style="font-size: small;">koment</span></span><span style="font-size: small;">.</span></span><br />
].<br />
<br />
(<span style="font-family: Courier New, monospace;"><span style="color: #2323dc;"><span style="font-size: small;">ImageMorph</span></span><span style="font-size: small;">
fromStream: (((</span><span style="color: #2323dc;"><span style="font-size: small;">komenty</span></span><span style="font-size: small;">
at: 1) at: </span><span style="color: #94006b;"><span style="font-size: small;">#img</span></span><span style="font-size: small;">)
asUrl retrieveContents contentStream)) openInWorld.</span></span><br />
<div align="LEFT">
<br /></div>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><br />Podsumowanie na video w jeszcze innym stylu:</span></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="font-size: small;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/iEDPriH2WsM?feature=player_embedded' frameborder='0'></iframe></span></div>
<div style="text-align: justify;">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><br /><br />Na filmie można zauważyć, że nie tworzę funkcji przed wykonaniem kodu. Środowisko Smalltalka informuje mnie, że takowej nie ma i pozwala utworzyć brakującą. Po utworzeniu funkcji można kliknąć "Proceed" i środowisko zachowa się jakby nic nie było. W ten sposób także bardzo łatwo i szybko pisze się testy w konwencji TDD - test first. To nie żadna nowość. Smalltalk był pierwszym szeroko dostępnym środowiskiem, które było wyposażone w bibliotekę do testów jednostkowych xUnit (jUnit - wersja na Javę). To, czym dziś ludzie się zachwycają i biorą za nowość, było używane grubo ponad 30 lat temu.<br /><br />W kolejnej części o tym jak to wszystko wyświetlić na stronie WWW.</span></div>
Anonymoushttp://www.blogger.com/profile/08198769559694742403noreply@blogger.com0tag:blogger.com,1999:blog-5397603151062338268.post-65663792022250055832012-09-22T23:04:00.000+02:002012-12-11T21:46:37.921+01:00Smalltalk: Seaside z użyciem Pharo<div style="text-align: right;">
</div>
<div class="entry-content" style="text-align: justify;">
<span style="font-size: small;"><br /></span>
<br />
<h3>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Chciałbym zaprezentować dwie rzeczy:</span></h3>
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><span style="font-size: small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8rjItnZ2SDmORgec6chfu9ZfsgF94Kie54BjFbtbvTWt5ii0dBu3MN9i7tPR_kibWTiexkPoWM4CzdEVCjx_ZdwuXPN2eg5XTyE9uokp1pBKZa38AdyqSzsAUI9zGr-p3hzTOw7xfD1c/s1600/SmalltalkBalloon1998.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8rjItnZ2SDmORgec6chfu9ZfsgF94Kie54BjFbtbvTWt5ii0dBu3MN9i7tPR_kibWTiexkPoWM4CzdEVCjx_ZdwuXPN2eg5XTyE9uokp1pBKZa38AdyqSzsAUI9zGr-p3hzTOw7xfD1c/s320/SmalltalkBalloon1998.jpg" width="258" /></a></span></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: small;">(c) Robert Tinney</span></td></tr>
</tbody></table>
<ul style="text-align: left;">
<li><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">język programowania <a href="http://pl.wikipedia.org/wiki/Smalltalk" rel="nofollow" target="_blank">Smalltalk</a></span></li>
</ul>
<ul style="text-align: left;">
<li><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"> i webowy framework zbudowany na jego podstawie: <a href="http://www.seaside.st/" rel="nofollow" target="_blank">Seaside</a>. W oparciu o nowoczesną, darmową implementację <a href="http://www.pharo-project.org/home" rel="nofollow" target="_blank">Pharo</a></span></li>
</ul>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Aby lepiej zrozumieć wpis najlepiej zacząć od ściągnięcia Seaside 3.0.7 w wersji <a href="http://www.seaside.st/distributions/Seaside-3.0.7-OneClick.zip" rel="nofollow" target="_blank">One-Click.</a> W katalogu Seaside.app, po rozpakowaniu będą skróty do uruchomienia na trzech systemach: Linux, Mac i Windows.</span><br />
<span style="font-size: small;"><br /></span>
<br />
<h3>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Krótko o Smalltaku</span></h3>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><i> dla tych, co im się nie chce czytać Wiki + moje własne obserwacje:</i></span></div>
<div class="entry-content" style="text-align: justify;">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><i> </i></span><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Smalltalk to dynamiczny
język zorientowany obiektowo, zaprojektowany z myślą o zintegrowanym
środowisku programowania. Smalltalk nie posiada struktury plików z
jakich korzystają inne języki programowania. Wszystko żyje w obrazie,
który jest obsługiwany przez maszynę wirtualną. Rozwiązanie bardzo
podobne do systemu operacyjnego uruchomionego w Virtual Box. Daje to m.
in. możliwość zapisania stanu w jakim jest w danej chwili - tzw.
snapshot. Język jest tak prosty, że wdraża się go w OLPC jako pomoc
edukacyjną dla dziesięciolatków.</span><br />
<span style="font-size: small;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Na dzień dzisiejszy popularne i darmowe odmiany Smalltalka : <i>Pharo, Squeak (OLPC), GNU Smalltalk,</i>
działają tylko na jednym rdzeniu. To jest spuścizna po latach '80 i
'90, gdzie nikt nie przejmował się skalowalnością horyzontalną na jednej
maszynie, bo procesory były wtedy jednordzeniowe. Mogę powiedzieć, że i
dziś nie jest to żadną wadą. System webowy w oparciu o Seaside tworzy
się najczęściej w oparciu o Apache, który zajmuje się rozsyłaniem żądań
do maszyn wirtualnych, które działają na różnych portach i różnych
procesorach. W systemie Linux łatwo wskazać na jakim rdzeniu ma się
uruchomić dany program. W przypadku awarii maszyny po prostu podnosi się
kolejną na tym samym porcie. Wszystko to w zwykłym skrypcie powłoki systemowej.</span><br />
<span style="font-size: small;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Smalltalk
to język, w którym nie wywołuje się funkcji tak jak w językach
imperatywnych, a jedynie przekazuje wiadomości do obiektów (wysyła).
Dość ciekawa sprawa, bo kompilator wysyła wiadomość do obiektu, a w
momencie, gdy obiekt i klasy macierzyste nie obsługują komunikatu
pokazuje się wyjątek 'doesNotUnderstand' ('nie rozumiem'). Nie jest to
wyjątek taki jak w Javie, czy C, że program podnosi ręce do góry i
często kończy działanie. Tutaj pokazuje się okienko z ostrzeżeniem i
możliwością dodania obsługi komunikatu do obiektu. Po edycji dajemy
restart i program działa dalej jakby nic. Ta wbrew pozorom błaha funkcja
pozwala na pisanie testów w konwencji TDD - 'test first'. </span><br />
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Smalltalk
posiada jedną z najczystszych składni językowych. Nie najkrótszą, a
najczystszą. Jest bardzo zbliżony w wyglądzie do zwykłego angielskiego. </span><br />
<span style="font-size: small;"><br /></span>
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_203829">
<table border="0" cellpadding="0" cellspacing="0" style="margin-left: 0px; margin-right: 0px; text-align: left;"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain">myArray at: 1 put: 'tekst'.</code></span><br />
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain"><br /></code></span></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Sentencję
kończy się kropką (w C średnikiem). Komentarz umieszcza się w
"podwójnym cudzysłowie". Łańcuchy znaków łączy się przecinkiem: <i>napi := 'aaaa','bddd'.</i></span><br />
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">W
języku występują tzw. bloki. Są to kawałki kodu ujęte w nawiasy
kwadratowe. Służą do przekazywania wykonania kodu w argumencie
wiadomości lub mogą być zwracane. Posiadają także argumenty, np.:</span><br />
<span style="font-size: small;"><br /></span>
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_814873">
<table border="0" cellpadding="0" cellspacing="0" style="margin-left: 0px; margin-right: 0px; text-align: left;"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain">elements := 5.</code></span></div>
<div class="line number2 index1 alt1">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain">tab := Array new: elements.</code></span></div>
<div class="line number3 index2 alt2">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain">1 to: elements do: [ :a | tab at: a put: (a * a)]</code></span><br />
<span style="font-size: small;"><br /></span></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Jak to działa: <br />- utwórz obiekt SmallInteger (32 bit) z wartością 5<br />- utwórz tabelę <i>tab</i> jako wektor 5 obiektów (wszystkie mają wartość nil)<br />- dla każdego elementu w tablicy przypisz kwadrat wartości jego indeksu</span><br />
<span style="font-size: small;"><br /></span>
<br />
<div style="text-align: center; width: 100%;">
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizAdnsTf-i2R5DbD77iIrcydDMbHGLgFqDyBMjPenxfkChtwL3UaXfsvNm32L0jZ9HVVRcW7ng5uU3KJpTEKJFwnIP4i6Qbffewpg3WyJ3TOh_XhRyYrpYkrWHnxagqMAeDzkFYO4J4C8/s1600/20120921143427_0.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="293" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizAdnsTf-i2R5DbD77iIrcydDMbHGLgFqDyBMjPenxfkChtwL3UaXfsvNm32L0jZ9HVVRcW7ng5uU3KJpTEKJFwnIP4i6Qbffewpg3WyJ3TOh_XhRyYrpYkrWHnxagqMAeDzkFYO4J4C8/s400/20120921143427_0.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-family: Georgia,"Times New Roman",serif; font-size: x-small;">Jak
widać na powyższym obrazku obiekt można podejrzeć zaznaczając go i
klikając w menu Inspect it. Okienko inspektora posiada na dole wygodne
miejsce, w którym można wpisywać kod i np. w ten sposób modyfikować
obiekt. </span></td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
</div>
</div>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><br /></span>
<br />
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Przydatne skróty klawiszowe:</span><br />
<ul>
<li><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: "Courier New",Courier,monospace;">Ctrl + s</span>, - (Accept) zapis zmian</span></li>
<li><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: "Courier New",Courier,monospace;">Ctrl + d</span>, - (Do it) wykonanie kodu</span></li>
<li><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: "Courier New",Courier,monospace;">Ctrl + p</span>, - (Print it) wykonanie kodu i pokazanie wyniku na końcu zaznaczonego bloku</span></li>
<li><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: "Courier New",Courier,monospace;">Ctrl + i</span>, - (Inspect it) - podgląd obiektu</span></li>
</ul>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Niektórzy zastanawiają się w tym momencie co to są te pola z dwukropkiem np. 'put:'. <br />Są
to tzw. settery - funkcje, które odpowiadają za odebranie i przeróbkę obiektu
podanego jako parametr. Setter obiektu może przyjąć tylko jeden
parametr. Bez dwukropka to getter, czyli funkcja, która zwraca wartość i/lub wykonuje działanie na obiekcie.
Zmienne instancji obiektu (są także zmienne klasowe - odpowiednik static
w Javie) nie są widoczne z zewnątrz, stąd użycie getterów i setterów. Obiekty są dzielone w IDE na dwie strony: część instancji (instance) i część klasową (class). Strona instancji jest miejscem, gdzie przechowuje się zmienne i funkcje, które mogą się zmieniać z każdą kopią obiektu. Część klasowa jest wspólna dla wszystkich kopii, a także jest dostępna bez potrzeby tworzenia nowego obiektu.</span><br />
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Klasa w Smalltalku ma postać:</span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: small;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: "Courier New",Courier,monospace;">Object subclass: #MojaKlasa<br /> instanceVariableNames: 'zmienna_prywatna1 zmienna_prywatna_2'<br /> classVariableNames: ''<br /> poolDictionaries: ''<br /> category: 'Moja-Kategoria'</span></span><br />
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Zwykle setter ma postać:</span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: small;"><br /></span>
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_193113">
<table border="0" cellpadding="0" cellspacing="0" style="margin-left: 0px; margin-right: 0px; text-align: left;"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<span style="font-family: "Courier New",Courier,monospace; font-size: small;"><code class="plain plain">zmienna_prywatna1: param</code></span></div>
<div class="line number2 index1 alt1">
<span style="font-family: "Courier New",Courier,monospace; font-size: small;"><code class="plain spaces"> </code><code class="plain plain"></code></span><span style="font-family: "Courier New",Courier,monospace; font-size: small;"><code class="plain plain"><span style="font-family: "Courier New",Courier,monospace;"><code class="plain plain">zmienna_prywatna1</code></span> := param.</code></span></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<span style="font-size: small;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">a getter:</span><br />
<span style="font-size: small;"><br /></span>
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_249517">
<table border="0" cellpadding="0" cellspacing="0" style="margin-left: 0px; margin-right: 0px; text-align: left;"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<span style="font-family: "Courier New",Courier,monospace; font-size: small;"><code class="plain plain">zmienna_prywatna1</code></span></div>
<div class="line number2 index1 alt1">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain spaces"> </code><code class="plain plain">^ <span style="font-family: "Courier New",Courier,monospace;"><code class="plain plain">zmienna_prywatna1</code></span></code></span><br />
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain"> </code></span><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"> </span><br />
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Pierwsza linijka to jednocześnie nazwa funkcji i parametry. Zamiast pisać znane z C: </span><br />
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: "Courier New",Courier,monospace;">typ getA(void) </span>, pisze się tylko <span style="font-family: "Courier New",Courier,monospace;">a</span> . Zamiast pisać </span><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: "Courier New",Courier,monospace;">void setA(int a)</span></span><span style="font-size: small;"> <span style="font-family: Georgia,"Times New Roman",serif;">pisze się </span><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: "Courier New",Courier,monospace;">a: aInt.</span></span></span><br />
<span style="font-size: small;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Znaczek ^ oznacza zwrócenie obiektu - słowo return z Javy/C. Średnika używa się do powtórzeń operacji na tym samym obiekcie. Zamiast pisać tak:</span></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<span style="font-size: small;"><br /></span>
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_664156">
<table border="0" cellpadding="0" cellspacing="0" style="margin-left: 0px; margin-right: 0px; text-align: left;"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain">tablica_do_liczenia_sensu_zycia = Array new: 3.</code></span></div>
<div class="line number3 index2 alt2">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain">tablica_do_liczenia_sensu_zycia at: 1 put: 'a'.</code></span></div>
<div class="line number4 index3 alt1">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain">tablica_do_liczenia_sensu_zycia at: 2 put: 'y'.</code></span></div>
<div class="line number5 index4 alt2">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain">tablica_do_liczenia_sensu_zycia at: 3 put: 'z'.</code></span></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<span style="font-size: small;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">można pisać tak:</span><br />
<span style="font-size: small;"><br /></span>
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_615657">
<table border="0" cellpadding="0" cellspacing="0" style="margin-left: 0px; margin-right: 0px; text-align: left;"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain">tablica_do_liczenia_sensu_zycia at: 1 put: 'a';</code></span></div>
<div class="line number2 index1 alt1">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain spaces"> </code><code class="plain plain">at: 2 put: 'y';</code></span></div>
<div class="line number3 index2 alt2">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain spaces"> </code><code class="plain plain">at: 3 put: 'z'.</code></span><br />
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain"><br /></code></span></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
</div>
<div class="entry-content" style="text-align: justify;">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Każdy
obiekt można edytować. I to w sposób jaki jest to nieosiągalny dla
innych języków. Mam tu na myśli przede wszystkim popularną rodzinę
języków C. Przykładowo mogę dodać brakującą funkcjonalność do klasy
String - nie do pomyślenia w Javie. </span><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Jako, że mamy do czynienia tylko z obiektami i przesyłaniem komunikatów w tym języku nie ma operatorów. Przykład:</span><br />
<span style="font-size: small;"><br /></span>
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_205687">
<table border="0" cellpadding="0" cellspacing="0" style="margin-left: 0px; margin-right: 0px; text-align: left;"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain">wynik_działania := 1 + 2 * 3.</code></span></div>
<div class="line number2 index1 alt1">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain">wynik_działania -> 9</code></span><br />
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain"><br /></code></span></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Działa
to w ten sposób: do obiektu '1' prześlij komunikat '+' i obiekt '2'. W
tym momencie obiekt '1' zwraca obiekt : '3' do którego przesyłany jest
komunikat '*' i obiekt '3'. <br />Aby dostać prawidłowy wynik trzeba iloczyn wziąć w nawias. Kod w nawiasach jest wykonywany jako pierwszy. </span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;"><br /></span>
<br />
<h3>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Podstawowe obiekty liczbowe</span></h3>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">Podstawowym obiektem, z którego wywodzą się inne (poprzez dziedziczenie) jest obiekt <span style="font-family: "Courier New",Courier,monospace;">Number</span>. Zawiera on podstawową obsługę wiadomości typu <span style="font-family: "Courier New",Courier,monospace;">'+' '-' '/' 'negated' 'abs', 'even', 'odd',</span>konwersję typów, testowanie, itp.</span></span><br />
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;"><br /></span></span>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">Kolejnym obiektem jest typ całkowity <span style="font-family: "Courier New",Courier,monospace;">Integer</span>. Nie jest jednak bezpośrednio używany, a posłużył do utworzenia dwóch klas pochodnych: <span style="font-family: "Courier New",Courier,monospace;">SmallInteger</span> i <span style="font-family: "Courier New",Courier,monospace;">LargeInteger</span>. <span style="font-family: "Courier New",Courier,monospace;">SmallInteger</span> posiada rozmiar 32-bit z wartościami od -2^30 do 2^30-1. <span style="font-family: "Courier New",Courier,monospace;">LargeInteger </span>przejmuje na siebie odpowiedzialność w przypadku sytuacji gdy jego wcześniejszy kolega próbuje 'przekręcić licznik'. <span style="font-family: "Courier New",Courier,monospace;">LargeInteger </span>jest ograniczony ilością dostępnej pamięci. Przykład:</span></span><br />
<span style="font-size: small;"><br /></span>
<span style="font-family: "Courier New",Courier,monospace; font-size: small;">a := 400000000 "-> SmallInteger" </span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: small;">a := a * 400000000 "-> zamiana typów"</span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: small;">a -> 80000000000000000 "-> LargeInteger"</span><br />
<span style="font-size: small;"><br /></span>
<span style="font-family: "Courier New",Courier,monospace; font-size: small;"><span style="font-family: Georgia, "Times New Roman", serif;">Kolejny typ to typ ułamkowy <span style="font-family: "Courier New",Courier,monospace;">Fraction</span>. Powstaje gdy w czasie dzielenia biorą udział wartości całkowite. Użycie typu ułamkowego nie powoduje utraty precyzji związanej z zaokrągleniem.</span></span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: small;"><br /></span>
<span style="font-family: "Courier New",Courier,monospace; font-size: small;">a := 1 / 2</span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: small;">a -> (1/2)</span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: small;"><br /></span>
<span style="font-family: "Courier New",Courier,monospace; font-size: small;">a asFloat</span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: small;">a -> 0.5</span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: small;"><br /></span>
<span style="font-family: "Courier New",Courier,monospace; font-size: small;">Float <span style="font-family: Georgia, "Times New Roman", serif;">to typ zmiennoprzecinkowy zgodny ze standardem IEEE-754 . Zakres do +/- 10^307</span></span></div>
<div class="entry-content" style="text-align: justify;">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Więcej</span><span style="font-family: "Courier New",Courier,monospace; font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;"> można zobaczyć przeglądając paczkę </span>Kernel-Numbers.</span><br />
<span style="font-size: small;"><br /></span>
<span style="font-family: "Courier New",Courier,monospace; font-size: small;"><span style="font-family: Georgia, "Times New Roman", serif;"><code></code> </span></span><br />
<h3>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Instrukcje warunkowe i pętle</span><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><br /></span></h3>
<span style="font-size: small;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">W Smalltalku nie ma instrukcji warunkowych i pętli. Są tylko komunikaty i operacje na blokach. Np. znana z C instrukcja: </span><br />
<span style="font-size: small;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: "Courier New",Courier,monospace;">if ( a > 0 ) a = a * 5;</span> </span><br />
<span style="font-size: small;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">w Smalltalku przyjmuje postać: </span><br />
<span style="font-size: small;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: "Courier New",Courier,monospace;">( a > 0 ) ifTrue: [ a := a * 5 ]. <span style="font-family: Georgia,"Times New Roman",serif;"> </span></span></span></span><br />
<span style="font-size: small;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Georgia,"Times New Roman",serif;">- do zmiennej a przesyłana jest wiadomość '<span style="font-family: "Courier New",Courier,monospace;">></span>' z parametrem <span style="font-family: "Courier New",Courier,monospace;">0</span>. Obiekt a następnie wysyła nowy obiekt Boolean z ustawioną wartością <span style="font-family: "Courier New",Courier,monospace;">true</span> lub <span style="font-family: "Courier New",Courier,monospace;">false</span>. Do tego obiektu wysyłana jest wiadomość <span style="font-family: "Courier New",Courier,monospace;">ifTrue:</span> z blokiem <span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: "Courier New",Courier,monospace;">[ a := a * 5 ] <span style="font-family: Georgia,"Times New Roman",serif;">jako parametr. Jeżeli warunek jest spełniony obiekt Boolean wykona blok.</span></span></span></span></span></span></span></span></div>
<div class="entry-content" style="text-align: justify;">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Georgia,"Times New Roman",serif;">Pętle są realizowane w podobny sposób, np.: </span></span></span></span></span></span></span></span></div>
<div class="entry-content" style="text-align: justify;">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: "Courier New",Courier,monospace;">[ a > 0 ] whileTrue: [ a := a - 1 ].</span></span></span></span></span></span></span></div>
<div class="entry-content" style="text-align: justify;">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: "Courier New",Courier,monospace;"><br /></span></span></span></span></span></span></span></div>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"> Tym razem to blok </span><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: "Courier New",Courier,monospace;">[ a > 0 ] </span></span></span></span></span></span></span></span>otrzymuje komunikat <span style="font-family: "Courier New",Courier,monospace;">whileTrue: <span style="font-family: Georgia,"Times New Roman",serif;">z blokiem </span></span><br />
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Georgia,"Times New Roman",serif;"> </span></span></span><span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: "Courier New",Courier,monospace;">[ a := a - 1 ]</span></span></span></span></span></span></span></span></span></span><span style="font-size: small;"> jako parametr<span style="font-family: Georgia,"Times New Roman",serif;">. Trochę więcej o blokach:</span></span><br />
<div class="entry-content" style="text-align: justify;">
<span style="font-size: small;"><br /></span>
<br />
<h3>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Bloki</span></h3>
<h3>
<span style="font-size: small;">
<span style="font-family: Georgia,"Times New Roman",serif;"> </span></span></h3>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Blokiem jest kod zapakowany w nawiasy kwadratowe. Np.:</span><br />
<span style="font-size: small;"><br /></span>
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_224965">
<table border="0" cellpadding="0" cellspacing="0" style="margin-left: 0px; margin-right: 0px; text-align: left;"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain">[ 1 + 2 ]</code></span><br />
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain"><br /></code></span></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Blok zawsze zwraca sam siebie, chyba, że poprosimy o wartość (value):</span><br />
<span style="font-size: small;"><br /></span>
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_502950">
<table border="0" cellpadding="0" cellspacing="0" style="margin-left: 0px; margin-right: 0px; text-align: left;"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain">blok := [ 1 + 2 ].</code></span></div>
<div class="line number2 index1 alt1">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain">blok -> [ clojure ] in UndefinedObject</code></span></div>
<div class="line number3 index2 alt2">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain">blok value. -> 3</code></span><br />
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain"><br /></code></span></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Blok może przyjmować parametry:</span><br />
<span style="font-size: small;"><br /></span>
<br />
<div>
<div class="syntaxhighlighter nogutter plain" id="highlighter_261527">
<table border="0" cellpadding="0" cellspacing="0" style="margin-left: 0px; margin-right: 0px; text-align: left;"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain">sqrt := [ :a | ( a >= 0) ifTrue: [a sqrt] </code></span></div>
<div class="line number2 index1 alt1">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain spaces"> </code><code class="plain plain">ifFalse: [Complex new real: 0 imaginary: (a abs sqrt)]].</code></span><br />
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain"><br /></code></span></div>
<div class="line number4 index3 alt1">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain">sqrt value: 4. -> 2</code></span></div>
<div class="line number5 index4 alt2">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain">sqrt value: -4. -> 0 + 2i </code></span><br />
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain"><br /></code></span></div>
<div class="line number7 index6 alt2">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain">suma2arg := [:a :b | a + b ].</code></span></div>
<div class="line number8 index7 alt1">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain">suma2arg value: 1 value: 2. -> 3</code></span><br />
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain"><br /></code></span></div>
<div class="line number10 index9 alt1">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><code class="plain plain">[:a :b | a + b ] value: 1 value: 2. -> 3</code></span></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
</div>
<div class="entry-content" style="text-align: justify;">
<span style="font-size: small;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Kolejny
szczegół: obiekt może mieć tylko jedną klasę bazową. Nie ma
wielokrotnego dziedziczenia. Interpreter i kompilator Smalltaka są
napisane w Smalltalku. Pozwala to uruchomić maszynę wirtualną wewnątrz
maszyny wirtualnej. To tak jakby się dało uruchomić Javę w Javie.</span><br />
<span style="font-size: small;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-size: small;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/2J1yjWtuwJU?feature=player_embedded' frameborder='0'></iframe></span></div>
<span style="font-size: small;"><br /></span>
<span style="font-size: small;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Praca w Smalltalku jest pracą z całym systemem. Nie ma tu podziałów na programy. Programem, jest wynik modyfikacji systemu. </span><br />
<span style="font-size: small;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Smalltalk
nie potrzebuje systemu operacyjnego by działać. Są wersje edukacyjne
dla dzieci, które bootują do Smalltalka. Jako ciekawostkę podam, że w
innych, bardziej rozwiniętych krajach <a href="http://wiki.laptop.org/go/Etoys" rel="nofollow" target="_blank">naukę programowania dla dzieci</a> zaczyna się od Smalltalka. U nas zaczyna się od Logo. Nie wiem czyj to wymysł, ale znając ten kraj można się było tego spodziewać.</span><br />
<span style="font-size: small;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Tworzenie
nowej klasy w Smalltalku to wysłanie komunikatu do obiektu, po którym
chcemy dziedziczyć lub do podstawowego obiektu 'Object'. Nie tworzy się
żadnego pliku tak jak w Javie. Oczywiście utworzony obiekt można zapisać
do pliku, np w celu archiwizacji.</span><br />
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">I ostatnia dość ciekawa cecha
środowiska, której nie spotkałem w żadnym języku, czy IDE, czyli:
wykonywanie kodu gdziekolwiek i kiedykolwiek. To cecha, która pozwala
bardzo szybko testować kod. Słabą namiastką tego są tak zwane REPL w
innych językach, czyli interaktywne konsole, gdzie kawałek kodu się
kopiuje bądź wysyła i on tam jest wykonywany. Przykład: (Transcript to odpowiednik stdout).</span><br />
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><br /></span>
<br />
<div style="width: 100%;">
<div class="one image">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZwtjWl4Zw2mOrU4nHJo3JJ0vbhf7vwptJt3b7S7gDr-i8iWcgG4eUSXPUl-1FAJn3mJyygFAwsV0FJ2UITXQbBvhll78xx6DG804MVLgPh4bLM5Z-mb7JAlgqiK2X1wPU5lLmiwW3FaE/s1600/20120920234953_0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="175" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZwtjWl4Zw2mOrU4nHJo3JJ0vbhf7vwptJt3b7S7gDr-i8iWcgG4eUSXPUl-1FAJn3mJyygFAwsV0FJ2UITXQbBvhll78xx6DG804MVLgPh4bLM5Z-mb7JAlgqiK2X1wPU5lLmiwW3FaE/s400/20120920234953_0.png" width="400" /></a></div>
<br /></div>
</div>
<span style="font-size: small;"><br /></span>
<span style="font-size: small;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Gdy chcę zobaczyć wynik operacji w okienku, którym piszę, używam opcji 'Print it'. Np.:</span><br />
<div style="width: 100%;">
<div class="one image">
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"></span></div>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMKUPS8tY1hcekZ_pfX-wTDbGQoGAsAvT5jzVMP-DxHKPhRAWohwMnxCx9szQHHLPNb5YVgbGy4KGomosjzboIh-Ry3zQn41P9L77lD2X05ogRbPlfgwf1Ioa7GcCe2mIsFeqwkzIc_ak/s1600/20120920235348_0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="175" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMKUPS8tY1hcekZ_pfX-wTDbGQoGAsAvT5jzVMP-DxHKPhRAWohwMnxCx9szQHHLPNb5YVgbGy4KGomosjzboIh-Ry3zQn41P9L77lD2X05ogRbPlfgwf1Ioa7GcCe2mIsFeqwkzIc_ak/s400/20120920235348_0.png" width="400" /></a></div>
<h3>
<span style="font-size: small;">
<span style="font-family: Georgia,"Times New Roman",serif;"> </span></span></h3>
<h3>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Teraz trochę o Seaside</span></h3>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Małe intro na początek:</span><br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-size: small;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/SEzFvcZFrc4?feature=player_embedded' frameborder='0'></iframe></span></div>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><br /><i>Widać
trochę machania myszką, ale to efekt usunięcia ścieżki dźwiękowej,
która nie nadawała się do publikacji. </i></span><br />
<span style="font-size: small;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Seaside jest oparty o model
komponentowy. Obiektowość Smalltalka bardzo ułatwia ich tworzenie i
edycję. Seaside pozbywa się także lub stara się pozbyć instrukcji GOTO.
Znanej i pogardzanej instrukcji, która została wypędzona w programowaniu
klasycznym dzięki licznym egzorcyzmom, a która w programowaniu webowym
manifestuje się w tagu HREF. W Seaside kliknięcie w odnośnik na stronie
powoduje wysłanie wiadomości do obiektu, który decyduje jak
odpowiedzieć. Seaside nie wykorzystuje szablonów. Tutaj wszystko tworzy
się w jednym języku. Chodzi o to, by jak najbardziej zbliżyć się w stylu
tworzenia do aplikacji desktopowych.</span><br />
<span style="font-size: small;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Seaside posiada wbudowane i przezroczyste wsparcie dla <a href="http://demo.seaside.st/javascript/jquery" rel="nofollow" target="_blank">jQuery</a> i <a href="http://demo.seaside.st/javascript/jquery-ui" rel="nofollow" target="_blank">jQuery UI</a>. Ajax jest bardziej bezbolesny niż w Ruby on Rails. Tutaj w ogóle <a href="http://demo.seaside.st/javascript/scriptaculous" rel="nofollow" target="_blank">można nie dotykać</a> JavaScriptu. </span><br />
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Ogólne
podejście z tego, co zauważyłem zamyka się w tworzeniu rdzenia
aplikacji w Seaside, a reszta treści: multimedia, css i inny statyczny
kontent serwuje się oddzielnie. Oczywiście można wciągnąć CSS i obrazki
do obrazu aplikacji, ale o ile nie jest to pojedyncza aplikacja, to
będzie tylko zajmować niepotrzebnie RAM.</span><br />
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">W Seaside dzięki użyciu
kontynuacji użycie przycisku przeglądarki 'Wstecz' i 'Następny' nie
powoduje zaburzenia w działaniu aplikacji. </span><br />
<span style="font-size: small;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;">Jako ciekawostkę dodam, że jest już maszyna wirtualna, <a href="http://code.google.com/p/squeakvm-tablet/" rel="nofollow" target="_blank">która działa na Androidzie</a>. Działa, bo sprawdziłem. ;) Polecam tablet 10 cali, bo będzie ciężko z rozdzielczością. Najlepiej ściągnąć i zainstalować <a href="http://lists.gforge.inria.fr/pipermail/pharo-project/2012-January/057838.html" rel="nofollow" target="_blank">samą maszynę wirtualną</a>,
a później skopiować plik .image i .changes na kartę SD. Aplikacja sama
znajdzie pliki i wyświetli listę, z której można uruchomić obraz
Seaside.</span><br />
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><br />To rozwiązanie z Androidem jest o tyle dobre, że ten sam
obraz można uruchomić na wielu systemach bez kompilacji. Nawet Java i
inne języki tak nie potrafią. Przede wszystkim to zaleta Open Source,
które to dzięki dostępności kodu źródłowego pozwoliło skompilować
maszynę na Androida. BTW. Ktoś czeka aż Java od Oracle pojawi się na
Androidzie? ;)</span><br />
<span style="font-family: Georgia,"Times New Roman",serif; font-size: small;"><br /></span></div>
Anonymoushttp://www.blogger.com/profile/08198769559694742403noreply@blogger.com0