<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6446336395300054197</id><updated>2012-01-08T17:05:06.156-08:00</updated><category term='stackbased'/><category term='factorial'/><category term='Factor'/><category term='fibonacci'/><category term='programming'/><title type='text'>Dressguardmeister</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dressguardmeister.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6446336395300054197/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dressguardmeister.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Hans Schmid</name><uri>http://www.blogger.com/profile/14348378552075646486</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>7</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6446336395300054197.post-7853173783334218418</id><published>2007-03-09T14:55:00.000-08:00</published><updated>2007-03-09T15:43:39.519-08:00</updated><title type='text'>Series in Factor</title><content type='html'>Played around with Factor again. Still feels strange but is even more fascinating. I tried to implement some helper functions for series. The lesson I learned and what I like the most about Factor: code is data!!! I think Factor surpasses by far the possibilities of Lisp with its defmacro system. Slowly I realize the meaning of a concatenative language. &lt;br /&gt;&lt;br /&gt;Here is the code:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;! TODO:&lt;br /&gt;! Define unit tests&lt;br /&gt;! help files&lt;br /&gt;! signatures&lt;br /&gt;! parsing words&lt;br /&gt;&lt;br /&gt;IN: series&lt;br /&gt;&lt;br /&gt;USING: math words sequences kernel tools quotations arrays ;&lt;br /&gt;&lt;br /&gt;TUPLE: il list quote ; ! il = infinite list&lt;br /&gt;&lt;br /&gt;: get-il-list ( il -- seq )&lt;br /&gt; dup il-list ;&lt;br /&gt;&lt;br /&gt;: get-il-quote ( il -- quot )&lt;br /&gt; dup il-quote ;&lt;br /&gt;&lt;br /&gt;: unfold ( seq -- stackseq )&lt;br /&gt; [ ] each ;&lt;br /&gt;&lt;br /&gt;: push-next-element ( il -- )&lt;br /&gt; over il-list push ;&lt;br /&gt;&lt;br /&gt;: rev-il-list ( il -- )&lt;br /&gt; get-il-list nreverse ;&lt;br /&gt;&lt;br /&gt;: (pop-first-element) ( il -- element )&lt;br /&gt; get-il-list pop ;&lt;br /&gt;&lt;br /&gt;: pop-first-element ( il -- element )&lt;br /&gt; rev-il-list (pop-first-element) ;&lt;br /&gt;&lt;br /&gt;: remove-first-element ( il -- element )&lt;br /&gt; pop-first-element &gt;r rev-il-list drop r&gt; ;&lt;br /&gt;&lt;br /&gt;: calc-next-element ( seq -- element )&lt;br /&gt; get-il-quote &gt;r get-il-list unfold r&gt; call ;&lt;br /&gt;&lt;br /&gt;: il-next ( il -- next )&lt;br /&gt; calc-next-element push-next-element remove-first-element ;&lt;br /&gt;&lt;br /&gt;: repeat-if ( il-quot crit-quot -- el ) ! acts as a filter&lt;br /&gt; over call 2dup swap call [ 2nip ] [ drop repeat-if ] if ;&lt;br /&gt;&lt;br /&gt;: collect ( n quot -- seq )&lt;br /&gt; V{ } -rot [ add ] append times ; &lt;br /&gt;&lt;br /&gt;: not-dividable ( n divisor -- ? )&lt;br /&gt; mod zero? not ;&lt;br /&gt;&lt;br /&gt;: naturals ( -- n )&lt;br /&gt; V{ 1 } [ 1+ ] &amp;lt;il&amp;gt; il-next ;&lt;br /&gt;&lt;br /&gt;: squares ( -- n )&lt;br /&gt; V{ } [ naturals dup * ] &amp;lt;il&amp;gt; il-next ;&lt;br /&gt;&lt;br /&gt;: ones ( -- n )&lt;br /&gt;  V{ } [ 1 ] &amp;lt;il&amp;gt; il-next ;&lt;br /&gt;&lt;br /&gt;: from2 ( -- n ) &lt;br /&gt; V{ 2 } [ 1+ ] &amp;lt;il&amp;gt; il-next ;&lt;br /&gt;&lt;br /&gt;: factorial ( -- n ) &lt;br /&gt;  V{ 1 } [ from2 * ] &amp;lt;il&amp;gt; il-next ;&lt;br /&gt;&lt;br /&gt;: powers-of-two ( -- n )&lt;br /&gt; V{ 1 } [ dup + ] &amp;lt;il&amp;gt; il-next ;&lt;br /&gt;&lt;br /&gt;: fib ( -- n )&lt;br /&gt; V{ 0 1 } [ + ] &amp;lt;il&amp;gt; il-next ;&lt;br /&gt;&lt;br /&gt;: odds (  -- n )&lt;br /&gt; [ naturals ] [ odd? ] repeat-if ;&lt;br /&gt;&lt;br /&gt;: evens (  -- n )&lt;br /&gt; [ naturals ] [ even? ] repeat-if ;&lt;br /&gt;&lt;br /&gt;: (primes) ( -- ) &lt;br /&gt; V{ 2 } [ 1+ ] &amp;lt;il&amp;gt; il-next ; ! =&gt; from2&lt;br /&gt;&lt;br /&gt;: call-word-def ( word -- res )&lt;br /&gt; word-def dup call dup ;&lt;br /&gt;&lt;br /&gt;: prime-criteria ( n -- quot )&lt;br /&gt; [ not-dividable ] curry ;&lt;br /&gt;&lt;br /&gt;: gen-quot ( -- quot )&lt;br /&gt; \ repeat-if 3array &gt;quotation ;&lt;br /&gt;&lt;br /&gt;: update-word ( x y z -- word-def )&lt;br /&gt; rot define-compound ;&lt;br /&gt;&lt;br /&gt;: primestep ( word -- n )&lt;br /&gt; dup &gt;r call-word-def &gt;r prime-criteria &lt;br /&gt; gen-quot r&gt; r&gt; update-word ;&lt;br /&gt;&lt;br /&gt;: primes ( -- n )&lt;br /&gt; \ (primes) primestep ;&lt;br /&gt;&lt;br /&gt;PROVIDE: demos/series ;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;You can use it as follows, e.g.&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt; &lt;code&gt;naturals&lt;/code&gt; returns because its invoked the first time "1"&lt;br /&gt;&lt;li&gt; &lt;code&gt;naturals&lt;/code&gt; returns "2" &lt;br /&gt;&lt;li&gt; &lt;code&gt;10 [ primes ] collect&lt;/code&gt; returns the first 10 primes in a vector&lt;br /&gt;&lt;li&gt; &lt;code&gt;10 [ fib ] collect&lt;/code&gt; returns the first 10 fibonacci numbers in a vector&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Here is a screenshot:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RijpwzePP9U/RfHxBB39uxI/AAAAAAAAABM/IoFbeTZDTGo/s1600-h/series.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_RijpwzePP9U/RfHxBB39uxI/AAAAAAAAABM/IoFbeTZDTGo/s400/series.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5040074457989626642" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6446336395300054197-7853173783334218418?l=dressguardmeister.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dressguardmeister.blogspot.com/feeds/7853173783334218418/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6446336395300054197&amp;postID=7853173783334218418' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6446336395300054197/posts/default/7853173783334218418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6446336395300054197/posts/default/7853173783334218418'/><link rel='alternate' type='text/html' href='http://dressguardmeister.blogspot.com/2007/03/series-in-factor.html' title='Series in Factor'/><author><name>Hans Schmid</name><uri>http://www.blogger.com/profile/14348378552075646486</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_RijpwzePP9U/RfHxBB39uxI/AAAAAAAAABM/IoFbeTZDTGo/s72-c/series.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6446336395300054197.post-1494787744190581932</id><published>2007-02-16T05:22:00.000-08:00</published><updated>2007-02-16T22:15:12.521-08:00</updated><title type='text'>Factor Development Environment</title><content type='html'>The Factor command line switches have been changed so that I give you an updated version for rlwrap.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;rlwrap -b '(){}[],+=&amp;^%$#@"";|\' -f factor.words -r -s 2000 -D 2 -l factor.log /scratch/repos/Factor/f -i=/scratch/repos/Factor/factor.image -shell=tty&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;When you are on the command line you can run the Factor graphical user interface in the background by typing:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;[ ui ] in-thread&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Isn't that great? So you have the best of both worlds at hand at the same time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6446336395300054197-1494787744190581932?l=dressguardmeister.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dressguardmeister.blogspot.com/feeds/1494787744190581932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6446336395300054197&amp;postID=1494787744190581932' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6446336395300054197/posts/default/1494787744190581932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6446336395300054197/posts/default/1494787744190581932'/><link rel='alternate' type='text/html' href='http://dressguardmeister.blogspot.com/2007/02/factor-development-environment.html' title='Factor Development Environment'/><author><name>Hans Schmid</name><uri>http://www.blogger.com/profile/14348378552075646486</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6446336395300054197.post-4307373152224212174</id><published>2007-01-09T04:46:00.000-08:00</published><updated>2007-01-09T08:33:47.503-08:00</updated><title type='text'>Screencasts demonstrating rlwrap with Factor</title><content type='html'>First screencast demonstrates completion by pressing TABs.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://farm1.static.flickr.com/124/351611276_dd4c0af9ff_o.gif"&gt;&lt;br /&gt;&lt;br /&gt;The second screencast demonstrates mainly the history functionality of readline and also editor integration. (Reverse search is invoked by pressing C-r. Please see the readline documentation -&gt; info readline)&lt;br /&gt;&lt;br /&gt;&lt;img src="http://farm1.static.flickr.com/144/351603394_df4dfc6016_o.gif"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6446336395300054197-4307373152224212174?l=dressguardmeister.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dressguardmeister.blogspot.com/feeds/4307373152224212174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6446336395300054197&amp;postID=4307373152224212174' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6446336395300054197/posts/default/4307373152224212174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6446336395300054197/posts/default/4307373152224212174'/><link rel='alternate' type='text/html' href='http://dressguardmeister.blogspot.com/2007/01/blog-post.html' title='Screencasts demonstrating rlwrap with Factor'/><author><name>Hans Schmid</name><uri>http://www.blogger.com/profile/14348378552075646486</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6446336395300054197.post-6269933561449336257</id><published>2007-01-08T07:05:00.000-08:00</published><updated>2007-01-08T14:16:03.917-08:00</updated><title type='text'>GNU Readline</title><content type='html'>Today I was playing around with the command-line version of Factor. I am one of those guys who don't wanna touch the mouse whenever possible. So the command line is always a good option esp. when you have completion available. As far as I can see Factor doesn't use the GNU readline library. But there is a cheap workaround. Just download &lt;a href="http://utopia.knoware.nl/~hlub/uck/rlwrap/"&gt;rlwrap&lt;/a&gt; and you can wrap readline around Factor. Installation is a piece of cake. Next step is to have command completion in Factor. So you must tell rlwrap all the words that are available in Factor. &lt;br /&gt;&lt;br /&gt;Piece of cake: Just give rlwrap a file with all the words and you can call it like this:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;rlwrap -f factor.words ./f -shell=tty&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;where all Factor words have been written in the file "factor.words".&lt;br /&gt;&lt;br /&gt;So the question is: how do you get all the Factor words. Nothing easier than that. Factor is very reflective. What you have to do in the Factor listener is this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;all-words&lt;br /&gt;[ word-name ] map&lt;br /&gt;"allcomms.txt" &amp;lt;file-writer&amp;gt;&lt;br /&gt;swap&lt;br /&gt;[ dupd swap stream-write stream-terpri ] each-with &lt;br /&gt;stream-flush&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Just for cosmetic reasons I sorted this file with "sort" in the GNU/Linux shell:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sort allcomms.txt &gt; factor.words&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Per default some characters are word separators in rlwrap. Unfortunately "-" too which is heavily used in Factor. Therefore just define all word breaking characters leaving out the dash. I put the whole thing in a file called "rf" and that's it's content:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;rlwrap -b '(){}[],+=&amp;^%$#@"";|\' -f factor.words -r ./f -shell=tty&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;(Added also the -r option which remembers words you type that are not in the completion file.)&lt;br /&gt;&lt;br /&gt;I run Factor from the command-line by invoking "rf" and when I need the user interface I call "ui" in the Factor listener. &lt;br /&gt;&lt;br /&gt;In the Factor listener you can also complete words. It's actually much better because its fuzzier. Whereas in the command-line with rlwrap you have to type in the first correct letters.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6446336395300054197-6269933561449336257?l=dressguardmeister.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dressguardmeister.blogspot.com/feeds/6269933561449336257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6446336395300054197&amp;postID=6269933561449336257' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6446336395300054197/posts/default/6269933561449336257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6446336395300054197/posts/default/6269933561449336257'/><link rel='alternate' type='text/html' href='http://dressguardmeister.blogspot.com/2007/01/gnu-readline.html' title='GNU Readline'/><author><name>Hans Schmid</name><uri>http://www.blogger.com/profile/14348378552075646486</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6446336395300054197.post-8361822398081072534</id><published>2007-01-07T14:56:00.000-08:00</published><updated>2007-01-10T17:34:34.697-08:00</updated><title type='text'>FFT</title><content type='html'>Wrote FFT in Factor. Developing is very nice. Just the final code looks a bit ugly because of all the stack operations. I guess that's the price you have to pay for a stack based programming language.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;IN: fft&lt;br /&gt;&lt;br /&gt;USING: arrays sequences math kernel ;&lt;br /&gt;&lt;br /&gt;: omega ( n -- n )&lt;br /&gt; recip -2 pi i * * * exp ;&lt;br /&gt;&lt;br /&gt;: n^v ( n v -- w ) &lt;br /&gt; [ ^ ] map-with ;&lt;br /&gt;&lt;br /&gt;: v^n ( v n -- w ) &lt;br /&gt; swap n^v ;&lt;br /&gt;&lt;br /&gt;: even ( seq -- seq )&lt;br /&gt; 2 group 0 &amp;lt;column&amp;gt; ;&lt;br /&gt;&lt;br /&gt;: odd ( seq -- seq )&lt;br /&gt; 2 group 1 &amp;lt;column&amp;gt ;&lt;br /&gt;&lt;br /&gt;: two ( seq -- seq )&lt;br /&gt; 1/2 v*n dup append ;&lt;br /&gt;&lt;br /&gt;: twiddle ( seq -- seq )&lt;br /&gt; dup length dup omega v^n v* ; &lt;br /&gt;&lt;br /&gt;: fft ( seq -- seq )&lt;br /&gt; dup length 1 =&lt;br /&gt; [ dup odd fft two twiddle swap even fft two v+ ] unless ;&lt;br /&gt;&lt;br /&gt;PROVIDE: demos/fft ;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6446336395300054197-8361822398081072534?l=dressguardmeister.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dressguardmeister.blogspot.com/feeds/8361822398081072534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6446336395300054197&amp;postID=8361822398081072534' title='203 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6446336395300054197/posts/default/8361822398081072534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6446336395300054197/posts/default/8361822398081072534'/><link rel='alternate' type='text/html' href='http://dressguardmeister.blogspot.com/2007/01/fft.html' title='FFT'/><author><name>Hans Schmid</name><uri>http://www.blogger.com/profile/14348378552075646486</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>203</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6446336395300054197.post-7652860329583850932</id><published>2007-01-07T06:43:00.000-08:00</published><updated>2007-01-10T11:30:57.380-08:00</updated><title type='text'>Haar in Factor</title><content type='html'>So the journey went on today. Tried to implement the Haar transformation. Slava already wrote it but I wanted to do it on my own. &lt;a href="http://factorcode.org/repos/Factor/demos/haar.factor"&gt;Slava's version&lt;/a&gt; is much more condense whereas mine looks like real beginner's code. I must apologize again but I'm a rookie if it comes to stackbased programming.&lt;br /&gt;&lt;br /&gt;Here we go:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;IN: haarwavelet&lt;br /&gt;USING: sequences math kernel ;&lt;br /&gt;&lt;br /&gt;: sdup ( x y -- y x x )&lt;br /&gt; swap dup ;&lt;br /&gt;&lt;br /&gt;: get-avgs-diffs ( avg-diff -- diff avg avg )&lt;br /&gt; first2 sdup ;&lt;br /&gt;&lt;br /&gt;: mean ( avg -- avg-next )&lt;br /&gt; get-avgs-diffs 2 group [ first2 + 2 / ] map ;&lt;br /&gt;&lt;br /&gt;: append-diffs ( diff avg diff-next -- avg diff )&lt;br /&gt; rot append ;&lt;br /&gt;&lt;br /&gt;: make-avg-diff ( avg diff -- avg-diff )&lt;br /&gt; { } swap add swap add* ;&lt;br /&gt;&lt;br /&gt;: diffs ( avg avg-next -- avg-next diff )&lt;br /&gt; dup rot 2 group 1 &lt;column&gt; [ - ] 2map&lt;br /&gt; append-diffs make-avg-diff ;&lt;br /&gt;&lt;br /&gt;: concat-first2 ( avg-diff -- haar-result )&lt;br /&gt; first2 append ;&lt;br /&gt;&lt;br /&gt;: haar-finished? ( avg-diff -- avg-diff bool )&lt;br /&gt; dup first length 1 &lt;= ;&lt;br /&gt;&lt;br /&gt;: mean&amp;diffs&lt;br /&gt; mean diffs ;&lt;br /&gt;&lt;br /&gt;: haar-wavelet ( avg-diff -- avg-diff )&lt;br /&gt; haar-finished?&lt;br /&gt; [ mean&amp;diffs haar-wavelet ] unless ;&lt;br /&gt;&lt;br /&gt;: haar ( avg-diff -- haar-result )&lt;br /&gt; haar-wavelet concat-first2 ;&lt;br /&gt;&lt;br /&gt;: rev-diffs&lt;br /&gt; sdup first2 length dup rot length + swap - swap &lt;br /&gt; second swap tail make-avg-diff ;&lt;br /&gt;&lt;br /&gt;: frame-x-with-y ( x y -- y x x y )&lt;br /&gt; dup rot dup rot ;&lt;br /&gt;&lt;br /&gt;: -rswap ( x y z -- y x z )&lt;br /&gt; -rot swap  ;&lt;br /&gt;&lt;br /&gt;: rev-mean &lt;br /&gt; frame-x-with-y + -rswap - make-avg-diff ;&lt;br /&gt;&lt;br /&gt;: rev-means&lt;br /&gt; dup first2 [ rev-mean ] 2map flatten ; &lt;br /&gt;&lt;br /&gt;: rev-means&amp;diffs&lt;br /&gt; rev-means rev-diffs ;&lt;br /&gt;&lt;br /&gt;: haar-inv-finished?&lt;br /&gt; dup second length zero? ; &lt;br /&gt;&lt;br /&gt;: haar-wavelet-inv ( avg-diff -- avg-diff )&lt;br /&gt; haar-inv-finished?&lt;br /&gt; [ rev-means&amp;diffs haar-wavelet-inv ] unless ;  &lt;br /&gt; &lt;br /&gt;PROVIDE: demos/haarwavelet ; &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;You can use it like this:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;{ { 56 40 8 24 48 48 40 16 } { } } haar-wavelet haar-wavelet-inv&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RijpwzePP9U/RaEN5ANqddI/AAAAAAAAAAM/AVo2UaysauM/s1600-h/haarFactor.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_RijpwzePP9U/RaEN5ANqddI/AAAAAAAAAAM/AVo2UaysauM/s400/haarFactor.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5017306732828456402" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;In Ocaml it would look like this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;let rec haar ?(s=[]) ?(d=[]) l = match l, s with&lt;br /&gt;  | ([] | [_] as s), [] -&gt; s @ d&lt;br /&gt;  | [], s -&gt; haar ~s:[] ~d s&lt;br /&gt;  | h1::h2::t, s -&gt; haar ~s:(h1+h2::s) ~d:(h1-h2::d) t&lt;br /&gt;  | _ -&gt; invalid_arg "haar";;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Not bad either!&lt;br /&gt;&lt;br /&gt;I'd say the actual core lines of my Factor code is this:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;: haar-wavelet ( avg-diff -- avg-diff )&lt;br /&gt; haar-finished?&lt;br /&gt; [ mean&amp;diffs haar-wavelet ] unless ;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;This is very terse, too.&lt;br /&gt;&lt;br /&gt;I can't really say why I am so thrilled by Factor. I think it's the interactivity. It doesn't really feel like programming. It feels more like talking to Factor.&lt;br /&gt;&lt;br /&gt;Haar code is of course not finished. It would need some polishing. Next things I wanna try is the help and unit testing facility of Factor. Stay tuned!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6446336395300054197-7652860329583850932?l=dressguardmeister.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dressguardmeister.blogspot.com/feeds/7652860329583850932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6446336395300054197&amp;postID=7652860329583850932' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6446336395300054197/posts/default/7652860329583850932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6446336395300054197/posts/default/7652860329583850932'/><link rel='alternate' type='text/html' href='http://dressguardmeister.blogspot.com/2007/01/haar-in-factor.html' title='Haar in Factor'/><author><name>Hans Schmid</name><uri>http://www.blogger.com/profile/14348378552075646486</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_RijpwzePP9U/RaEN5ANqddI/AAAAAAAAAAM/AVo2UaysauM/s72-c/haarFactor.gif' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6446336395300054197.post-5489066470430650163</id><published>2007-01-06T11:33:00.000-08:00</published><updated>2007-01-13T05:30:24.015-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fibonacci'/><category scheme='http://www.blogger.com/atom/ns#' term='factorial'/><category scheme='http://www.blogger.com/atom/ns#' term='stackbased'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Factor'/><title type='text'>First Steps with Factor</title><content type='html'>Today I did my first steps in &lt;a href="http://factorcode.org/" target="_blank"&gt;Factor&lt;/a&gt; a stackbased programming language developed mainly by Slava Pestov. This guy must be a bloody genius!! Factor's development environment is great because it is very interactive. I never had the chance to get access to a Lisp Symbolics box but Factor must come very close to it. Slava wants to make Factor the best stackbased programming language. Hey, Slava, you already did!&lt;br /&gt;&lt;br /&gt;So I played around with it and wrote the Hello programs of the Lisp world: factorial and fibonacci. Here we go:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;: factorial ( n -- n! )&lt;br /&gt;  dup 1 &lt;=        &lt;br /&gt;  [ dup 1 - factorial * ] unless ;    &lt;br /&gt;&lt;br /&gt;: fibonacci ( n -- fib-n )        &lt;br /&gt;  dup 1 &lt;=        &lt;br /&gt;  [ dup 1 - fibonacci swap 2 - fibonacci + ] unless ;  &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Looks strange and bizarr. But once you get the hang of it you never wanna stop.&lt;br /&gt;&lt;br /&gt;I wrote the Factor code in Emacs. There is a &lt;a href="http://factorcode.org/repos/Factor/libs/factor.el"&gt;factor mode file&lt;/a&gt; in the Factor distribution. The factor-listener function is broken (telnet function is not available any more in the latest release 0.87). But there is so much interactivity in the Factor listener that you don't need Emacs for it.&lt;br /&gt;&lt;br /&gt;So these are the steps you have to do for Emacs integration:&lt;br /&gt;1.) Add the following lines to your .emacs file:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;(load-file "&lt;span style="font-style: italic;"&gt;path-to&lt;/span&gt;/Factor/libs/factor.el")&lt;br /&gt;(server-start)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;2.) In Factor load the Emacs library from the listener&lt;br /&gt;&lt;code&gt;&lt;br /&gt;"libs/emacs" require&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;That's it. When you want to edit code press 'C+e' in Factor, choose the file from the pop-up, switch to your Emacs session and happy factoring.&lt;br /&gt;&lt;br /&gt;Helpful functions in the listener:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;see&lt;/b&gt;, e.g "\ dup see" to see definition of duplicate&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;help&lt;/b&gt;, e.g. "\ dup help" to get online help for duplicate&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;where&lt;/b&gt;, e.g. "\ send-button-up where" to see in which file the word (Factor term for a function) 'send-button-up' is defined&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;edit&lt;/b&gt;, e.g. "\ send-button-up edit" opens file where 'send-button-up' is defined and jumps to the appropriate line&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Thank you, Slava!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6446336395300054197-5489066470430650163?l=dressguardmeister.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dressguardmeister.blogspot.com/feeds/5489066470430650163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6446336395300054197&amp;postID=5489066470430650163' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6446336395300054197/posts/default/5489066470430650163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6446336395300054197/posts/default/5489066470430650163'/><link rel='alternate' type='text/html' href='http://dressguardmeister.blogspot.com/2007/01/first-steps-with-factor.html' title='First Steps with Factor'/><author><name>Hans Schmid</name><uri>http://www.blogger.com/profile/14348378552075646486</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry></feed>
