zzzzzz
sometimes
i dream in code
123456789class 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
1234567891011function 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
1230800 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
123401 BOOK
05 TITLE PIC X(15).
05 AUTHOR PIC X(15).
05 YEARPUB PIC 9(4).
i've used
a lot of
programming languages
12345678910111213141516class 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
1230100 author = "Tolstoy"
0200 title = "War and Peace"
0300 published = 1869
to ruby and python
12345678910111213class 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
1234567890100 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
1var 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
1pride = 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
1234C 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
1234pride = 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
1your_nefarious_code(books);
and your code
changes my array
1234567// 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
123456// 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
1# Don't modify this code unless you are unconscious.
this changing
behind my back
makes me
thrash in my sleep
123def []=(idx, value)
raise "YouCantChangeMyArraySucker"
end
so in my dream
i make
a new rule
no more
changing arrays
ever
1234// 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
1your_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
10600 REM I like zombies
but sometimes
i need
to change my array
1GoTo 0000
but if i do
i'm back to square one
i don't want to deal with it
12345function 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
1234567var 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
1C ZOMBIES ARE BACK
now i don't have to
expend the effort
to trust you
1/* I trust me more than you. */
or me
1/* I don't trust me. */
but sometimes you
change my objects too
123public void aNefariousBookMethod(Book b) {
b.setTitle("Dirk Gently's Holistic Detective Agency");
}
sometimes i forget
and change them myself
12345678// 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
1234567def 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
12345Book 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
1// 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
1234567class Book {
private String title;
private String author;
private int year_published;
// ...
}
then i discover
that i need
to get at
those private fields
1234567891011121314151617class 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
123C 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
123C 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
12345class 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
123var 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
1234567var 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
123456789101112131415interface 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
12345var make_description = function (b){
return b.title +
" by " + b.author +
" published in " + b.published
};
sometimes i dream
that these function things
are already there
123make_description = lambda do |b|
"#{@title} by #{@author} / #{@year_publ}"
end
and i don't have to do anything
then it's a good dream
123456789101112function 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
123456789101112def 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
123new_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
1234567def 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
1var new_array = books.map(upperCaseTitle);
sometimes in my dream
this function is
already there
and i roll over
and make yummy noises
123456789/* 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
12def 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
123function 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
123var 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
123pride = {"title" "Pride and Prejudice"
"author" "Austen"
"published" 1813}
better
but there are still
a lot of rules
a lot
1234567function 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
123456function(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
123REM Sleep
[1 2 3 4]
sometimes i’m making an array
1add2(1 3)
sometimes i’m calling a function
sometimes i forget
to put the name of the function
on the outside
1(add2 1 3)
in my dream i
stick the name of the function
on the inside
like an array
1234567(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
12345time 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
12345678910111213(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
1(def other-books (assoc books 0 zombies))
i can look away
from my data
without worrying
that someone will
mess with it
1234(defn description [b]
(str (:title b)
" by " (:author b)
" published in " (:published b)))
i can write code
without
so much
syntax
1(defn upper [s] (.toUpperCase s))
my code lives
in tidy little function
which are things
my functions operate
1(def yelling-title (upper "War and Peace"))
on simple values
1(def yelling-titles (map upper ["Emma" "Jaws" "The Giver"]))
on collections
1(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