A couple of weeks ago, I came across this talk by Slava Pestov, the creator of Factor, and it made a strong impression on me. The language is more minimal than Lisp, more compositional than Haskell, and unusually extensible. It has the property of homoiconicity, but without the parentheses soup that is usually associated with homoiconic languages. The metaprogramming capabilities are excellent. The feature set is quite wide, but most of it is implemented as libraries in the language itself. Despite being such a high-level language, Factor exposes all internals to the programmer. You can even manage memory manually or do pointer arithmetic if you want to.
After two busy weeks, I finally got some time to play around with Factor. Factor ships with a Listener, which is a great tool for exploring and learning the language and its libraries. I was reminded of the “10 one-liners” meme that was going around a few months ago, and I thought I should give it a whirl in Factor. I managed to solve the first nine problems, but the tenth was beyond me at the time. If someone has a solution, I’d be glad to see it.
USING: math.ranges io.encodings.utf8 xml concurrency.combinators ;
! 1. Multiply Each Item in a List by 210 [1,b] [ 2 * ] map
! 2. Sum a List of Numbers1000 [1,b] sum
! 3. Verify if Exists in a String: word-list ( -- seq ) { "Factor" "Concatenative" "Point-free" } ;: tweet ( -- str ) "This is an example tweet that talks about Factor." ;word-list [ tweet subseq? ] any?
! 4. Read in a File"F:/data.txt" utf8 file-contents"F:/data.txt" utf8 file-lines
! 5. Happy birthday to you!4 [1,b] [ "Happy birthday " swap 3 = "dear Pradnya!" "to you!" ? append ] map [ . ] each! Or: (suggested by @abeaumont on #concatenative)"Happy birthday " 4 [ 2 = "dear Pradnya!" "to you!" ? append . ] with each-integer
! 6. Partition List of Numbers as per the Predicate{ 49 58 76 82 88 90 } [ 60 < ] partition
! 7. Fetch and Parse an XML web service"http://search.twitter.com/search.atom?&q=factor" <pull-xml>
! 8. Find minimum (or maximum) in a List{ 14 35 -7 46 98 } infimum{ 14 35 -7 46 98 } supremum
! 9. Parallel Processingdata-list [ process-item ] parallel-mapThere are probably better ways to write some of these examples, and some of them may contain errors. Corrections and improvements are welcome.
More resources on Factor and concatenative programming: