Functional Dreams

综合编程 2017-07-03

zzzzzz

sometimes

i dream in code

class Book:
  def __init__(self, a, t, p):
    self.author = a
    self.title = t
    self.published = p

  def description(self):
    return self.title + " by " + self.author + 
           " published in " + self.published

bits of programs

glide around

in my head

function Book (t, a, p) {
  this.title = t;
  this.author = a;
  this.published = p;

  this.description = function() {
    return this.title + ' by ' + this.author + 
           ' published in ' + this.published;
  };
  return this;
}

i close my eyes

and there it is

code

0800 Rem One
0900 Dim thisBook As book
1000 Rem The next one

always the code

pointy k's

and bumpy m's

it follows me

from one rem cycle

to the next

01  BOOK
    05  TITLE           PIC X(15).
    05  AUTHOR          PIC X(15).
    05  YEARPUB         PIC 9(4).

i've used

a lot of

programming languages

class Book {
  private String title;
  private String author;
  private int year_published;

  public Book(t, a, p) {
    title = t;
    author = a;
    year_published = p;
  }

  public getDescription() {
    return title  + " by " + author +
           " published in " + year_published;
  }
}

from basic to fortran

0100 author = "Tolstoy"
0200 title = "War and Peace"
0300 published = 1869

to ruby and python

class Book
  attr_accessor :author, :title, :published

  def initialize(a, t, p)
    @title = t;
    @author = a;
    @published = p;
  end

  def description
    "#{@title} by #{@author} published in #{@published}"
  end
end

sometimes

it all

runs together

0100  class Book:
 0200    attr_accessor :author, :title, :published
 0300
 0400    public Book(t, a, p) {
 0500      title = t;
 0600      author = a;
 0700      year_published = p;
 0800    }
 0900  end

these dreams

of code

they are hell

var codeBook = Book("Inferno", "Dante", 1320);

coding is my job

five days a week

i'm coding man

but i don't want to code

when i'm sleeping

i just want to sleep

when i'm asleep

hell

pride = Book.new("Pride and Prejudice", "Austen", 1813)

since i can't

get away from the code

i try to make it

as easy as i can

after all

i’m tired

in fact i'm asleep

life should be easy

when i'm asleep

C  DONT LET THE SOUND OF YOUR OWN WHEELS DRIVE YOU CRAZY

       NOW = TIME(0)
       CALL MAKEEASY(NOW)

sometimes

when i'm dreaming

in code

i make an array

pride = new Book("Pride and Prejudice", "Austen", 1813);
war = new Book("War and Peace", "Tolstoy", 1869);

books = {pride, war};

and i let your code

borrow my array

your_nefarious_code(books);

and your code

changes my array

// Your nefarious code.

public your_nefarious_code(Book[] books) {
  zombies = new Book("Pride and Prejudice and Zombies", 
                     "Grahame-Smith", 2009);
  books[0] = zombies;
}

it's my array

i didn't want you

to change it

truth be told

sometimes

i do it to myself

// An honest mistake

public my_function(Book[] books) {
  jaws = new Book("Jaws", "Benchley", 1974);
  books[0] = jaws;
}

i have an excuse though

i’m asleep

# Don't modify this code unless you are unconscious.

this changing

behind my back

makes me

thrash in my sleep

def []=(idx, value)
  raise "YouCantChangeMyArraySucker"
end

so in my dream

i make

a new rule

no more

changing arrays

ever

// Your nefarious code foiled.
// Blam! Throws a YouCantChangeMyArraySuckerException!

  books[0] = zombies;

once i create an array

that's it

you can't change it

neither can i

your_impossible_to_be_nefarious_code(books);

now

i don't

have to worry

about your code or threads

messing with my arrays

or my code

or my threads

it’s just easier

0600 REM I like zombies

but sometimes

i need

to change my array

GoTo 0000

but if i do

i'm back to square one

i don't want to deal with it

function justLikeTheOldOneExcept(a, i, x){
  result = a.slice(0);
  result[i] = x
  return result
}

so i'll let arrays make

copies of themselves

copies that are

the same as the original

only different

var pride = new Book("Pride and Prejudice", "Austen", 1813);
var war = new Book("War and Peace", "Tolstoy", 1869);
var zombies = new Book("Pride & Prejudice & Zombies", "Grahame-Smith", 2009);

var books = [pride, war];

var other_books = justLikeTheOldOneExcept(books, 0, zombies);

then i can have

my old array

and

my new array

C  ZOMBIES ARE BACK

now i don't have to

expend the effort

to trust you

/* I trust me more than you. */

or me

/* I don't trust me. */

but sometimes you

change my objects too

public void aNefariousBookMethod(Book b) {
  b.setTitle("Dirk Gently's Holistic Detective Agency");
}

sometimes i forget

and change them myself

// Going about my sleepy business..

Book war = new Book("War and Peace", "Tolstoy", 1869);
aNefariousBookMethod(war);

// Wait what?

System.out.println(war.title);

it's been a long night

so let's have the same rules for objects

and arrays

def justLikeTheOldOneExcept(v, i, x):
  result = copy(v)
  if isinstance(result, list):
    result[i] = x
  else:
     setattr(result, i, x)
  return result

no changing

just modified copies

Book book1 = new Book("War and Peace", "Tolstoy", 1869);

Book book2 = book1.justLikeTheOldOneExcept(
                 "title", 
                 "Dirk Gently's Holistic Detective Agency");

after all

it's just a dream

// Rules are like spouses. There is an optimal number to have.

now there are fewer

rules to remember

sometimes i make an object

with private fields

class Book {
  private String title;
  private String author;
  private int year_published;

  // ...
}

then i discover

that i need

to get at

those private fields

class Book {
  private String title;
  private String author;
  private int year_published;

  public String getTitle(){
    return title;
  }

  public String getAuthor(){
    return author;
  }

  public int getYearPublished(){
    return year_published;
  }
}

so i make them public

C TOTAL UP THE EFFORT

       EFFORT = PRIVEFFT + PUBLEFFT

i had to make the

private fields private

and then i had to make

the private fields public

C ITS HARD TO SLEEP WHEN YOUR CODE IS SHOUTING
C BUT FORTRAN IV HAS NO LOWERCASE
C NO INSIDE VOICE

that’s a lot of work

and then it's more work

class Book {
  public String title;
  public String author;
  public int year_published;
}

so i'll just use a

map or a hash or a dictionary

or whatever we call it in this language

and make an open

name/value thing

var pride = {"title": "Pride and Prejudice",
             "author": "Austen", 
             "published": 1813};

now i can make

new objects full of data

as fast as i can type

which isn't very fast

since

my eyes are closed

var zombies = {"title": "Pride and Prejudice and Zombies",
               "author": "Grahame-Smith", 
               "published": 2009};

var war =  {"title": "War and Peace", 
            "author": "Tolstoy", 
            "published": 1869};

if all my data

is in

hashes or

dictionaries

or maps

whatever we call them

in this language

then i don't have a place for my code

interface Function {
  public Object invoke(Object arg);
}

class MakeDescription implements Function {
  public Object invoke(Object arg) {
    Book book = (Book)arg;

    return book.get("title") +
           " by " +   
           book.get("author") + 
           " published in " +  
           book.get("yearPublished");
  }
}

so i'll just make little

one method

no data

objects

and put my code there

i'll call these things

functions

that’s a word i learned in

math class

before i feel asleep

var make_description = function (b){
  return b.title + 
         " by " + b.author +
         " published in " + b.published
};

sometimes i dream

that these function things

are already there

make_description = lambda do |b|
  "#{@title} by #{@author} / #{@year_publ}"
end

and i don't have to do anything

then it's a good dream

function pipeline(value, funcs) {
  for(i in funcs) {
    value = funcs[i](value);
  }
  return value;
}

function compose(funcs){
  return function(value){
    return pipeline(value, funcs);
  }
}

now

my functions are things

i can start with an array

of function things

and turn them into a new function

def upper(s)
  s.upcase
end

def title(book)
  #puts "title for book #{book}"
  book[:title]
end

upperCaseTitle=compose([method(:title), method(:upper)])

big_title = upperCaseTitle.call(pride)

i can assemble

functions

like legos

new_array = []
for b in books:
  new_array.append(big_title(b))

sometimes i want to

loop over an array

doing something

to each element

but

loops are hard

there's

loop variables

and making a new array

for the result

and

my code is all wrapped up

in these function things

def nap_map(f, arry):
  result = []
  for i in range(len(arry)):
    result.append(f(arry[i]))
  return result

new_array = nap_map(upperCaseTitle, books)

so i write a function

that does the loop for me

var new_array = books.map(upperCaseTitle);

sometimes in my dream

this function is

already there

and i roll over

and make yummy noises

/*  Java coding standard - method parameters
 *  The number of parameters that required by a method
 *  should be proportional to the good that the method does
 *  0-4: Ordinary application methods
 *  5-6: System accounting and free pretzels
 *  7-8: With mustard
 *  9-10: Methods generating world peas
 *  11+: No excuse
 */

sometimes i have

a function

lots of arguments

i already know the values

of the first few arguments

writing out all those arguments

over and over

is hard

def placid_partial(f, *args):
  return lambda *more_args: f(*args, *more_args)

so i write a function

that gives me a function

that does the same thing

function add2(a, b) {return a + b}

  var increment = placid_partial(add2, 1);

but fills in the arguments

it's a pain

but less pain

than writing this stuff

over and over

var pride = {"title": "Pride and Prejudice",
             "author": "Austen", 
             "published": 1813};

sometimes

i'm tired of typing

semicolons

and commas

and all the rest

in my dream

i make them

go away

pride = {"title" "Pride and Prejudice" 
         "author" "Austen" 
         "published" 1813}

better

but there are still

a lot of rules

a lot

function nap_map(f, arry) {
  result = [];
  for(i in arry){
    result.push(f(arry[i]));
  }
  return result;
}

do i have parentheses

do i have braces?

is END a thing?

too hard

function(nap_map [f arry]
  set(result [])
  for(i in arry
    push(result f(get(arry i)))
  )
  return(result))

make everything

look like

a function call

now there is less to remember

i can end

this exhausting REM sleep

and go back

to being truly unconscious

REM Sleep

[1 2 3 4]

sometimes i’m making an array

add2(1 3)

sometimes i’m calling a function

sometimes i forget

to put the name of the function

on the outside

(add2 1 3)

in my dream i

stick the name of the function

on the inside

like an array

(function upper [s] (return (toUpperCase s)))

(function title [book] (return (title book)))

(def upperCaseTile (compose [title, upper]))

(def bigTitle (upperCaseTitle pride))

and now there's

two kinds of collections

the ones with

parentheses

do something

like call a function

the ones with square brackets

are data

time my-program.jsrbpyjavaftnco

real    0m0.018s
user    0m0.001s
sys    0m0.006s

and in the predawn hours

just before i wake up

i dreamed

that i

waved my hands

and it all runs

fast

very fast

(def pride {:title "Pride and Prejudice"
            :author "Austen" 
            :published 1813})

(def war {:title "War and Peace"
          :author "Tolstoy" 
          :published 1869})

(def zombies {:title "Pride and Prejudice and Zombies"
              :author "Grahame-Smith" 
              :published 2009})

(def books [pride war])

and as reality

folds into my dream

and i think now

(def other-books (assoc books 0 zombies))

i can look away

from my data

without worrying

that someone will

mess with it

(defn description [b]
  (str (:title b) 
       " by " (:author b) 
       " published in " (:published b)))

i can write code

without

so much

syntax

(defn upper [s] (.toUpperCase s))

my code lives

in tidy little function

which are things

my functions operate

(def yelling-title (upper "War and Peace"))

on simple values

(def yelling-titles (map upper ["Emma" "Jaws" "The Giver"]))

on collections

(def extract-yelling-title (comp upper :title))

on each other

it all runs fast

in my dream

the living is good

the programming is easy

live the dream

clojure

您可能感兴趣的

Release It Second Edition in Beta I’m excited to announce the beta of Release It! Second edition . It’s been ten years since the first edition was released. Many of the lessons...
2017 Retrospective I look back a lot more than what I suspect people realise. Not in a reminiscent way, but rather because I find it helps me put things in perspective....
time.gif This is a GIF that always shows the current time in UTC: Source Code It is written in Haskell and works by dynamically generating each frame o...
Problem Solving: Lateral Thinking If you make a 13 minute video on watch screws you had better have a good reason. Chopping this video down to the few seconds of visually arresting tri...
Pattern Matching in a Dynamic OOP Language Another long weekend and another fun milestone for Magpie . I've finally managed to pull off something that I've wanted to support for a ...