Re: Factor

Factor: the language, the theory, and the practice.

One-Liners

Tuesday, July 19, 2011

#language

Inspired by a blog post about “one-liners” in Clojure, I thought I’d demonstrate a few small pieces of Factor code doing some similar things:

Using the map word, we can apply a “doubling” quotation to each element.

IN: scratchpad { 4 8 15 16 23 42 } [ 2 * ] map .
{ 8 16 30 32 46 84 }

We can easily calculate the sum of a sequence (here the numbers 1 through 1000):

IN: scratchpad 1000 [1..b] sum .
500500

We check if any of a list of words are within a string:

IN: scratchpad { "factor" "concatenative" "stack-based" }
               [ "factor is awesome" subseq? ] any?

You can easily read the file-contents, or file-lines, with a specified encoding (e.g., UTF-8):

IN: scratchpad "/path/to/file.txt" utf8 file-contents

Sing the four verses to the “Happy Birthday” song:

IN: scratchpad 4 [1..b] [
                   "Happy Birthday " write
                   3 = "dear NAME" "to You" ? print
               ] each
Happy Birthday to You
Happy Birthday to You
Happy Birthday dear NAME
Happy Birthday to You

Use filter (or even partition) with some selection criteria:

IN: scratchpad { 49 58 76 82 88 90 } [ 60 > ] filter .
{ 76 82 88 90 }

Use the http.client vocabulary to access a web service, and then the xml vocabulary to parse the result from a string. You could use the json.reader vocabulary to parse JSON responses.

IN: scratchpad "https://search.twitter.com/search.atom?q=factor"
               http-get nip string>xml

Check the HTTP headers to find the version of a server used by a web server:

IN: scratchpad "https://apple.com" http-get drop
               header>> "server" swap at .
"Apache/2.2.3 (Oracle)"

Use infimum and supremum to find the minimum and maximum, respectively, of a list (alternatively, you could use my maximum/minimum functions):

IN: scratchpad { 14 36 -7 46 98 } infimum .
-7

IN: scratchpad { 14 36 -7 46 98 } supremum .
98

Parse a string into groups of two characters, then interpret those as hex values of characters, mapping the output as a string:

IN: scratchpad "474e552773204e6f7420556e6978"
               2 <groups> [ 16 base> ] "" map-as .
"GNU's Not Unix"

Use concurrency.combinators to perform certain tasks in parallel with futures:

IN: scratchpad { 1 0 -1 } [ 2 + ] parallel-map .
{ 3 2 1 }