Four Languages From
FortyYears Ago
@ScottWlaschin
fsharpforfunandprofit.com
a.k.a What can we learn
from the 1970's?
Me
The 1970's
Four languages from 40 years ago
• A brief history of programming languages
• Hammers and toolkits
• Four (or five) languages:
– SQL (1974)
– Prolog (1972)
– ML (1973)
– Smalltalk (1976,1980)
– Language X (1979)
^or five
A brief history of
programming languages
A language that doesn't affect the way you
think about programming, is not worth
knowing – Alan Perlis
Galaxy Brain
seal of approval
The 1950s
"Pre-Cambrian era"
Assembly
Languages
1950 1959
The 1950s
1950 1959
FORTRAN
(1957)
"Pre-Cambrian era"
The 1950s
1950 1959
"Pre-Cambrian era"
COBOL
(1959)
The 1950s
1950 1959
"Pre-Cambrian era"
LISP
(1959)
The 1960s
1960 1969
"IBM and the Seven Dwarfs."
ALGOL 60
(1960)
The 1960s
1969
"IBM and the Seven Dwarfs."
BASIC
(1964)
1960
The 1960s
1969
"IBM and the Seven Dwarfs."
1960
PL/I
(1964)
The 1960s
1969
"IBM and the Seven Dwarfs."
1960
ISWIM
(1966)
The 1960s
1969
"IBM and the Seven Dwarfs."
1960
APL
(1966)
The 1960s
1969
"IBM and the Seven Dwarfs."
1960
Simula 67
(1967)
The 1960s
1969
"IBM and the Seven Dwarfs."
1960
BCPL
(1967)
The 1960s
1969
"IBM and the Seven Dwarfs."
1960
Logo
(1967)
The 1960s
1969
"IBM and the Seven Dwarfs."
1960
ALGOL 68
(1968)
The 1970s
1970 1979
The Cambrian Explosion
The 1970s
1970 1979
FORTH
(1970)
The Cambrian Explosion
The 1970s
1970 1979
Pascal
(1970)
The Cambrian Explosion
The 1970s
1970 1979
C
(1972)
The Cambrian Explosion
The 1970s
1970 1979
Prolog
(1972)
The Cambrian Explosion
The 1970s
1970 1979
ML
(1973)
The Cambrian Explosion
The 1970s
1970 1979
SQL
(1974)
The Cambrian Explosion
The 1970s
1970 1979
CLU
(1975)
The Cambrian Explosion
The 1970s
1970 1979
Scheme
(1975)
The Cambrian Explosion
The 1970s
1970 1979
Microsoft Basic
(1975)
The Cambrian Explosion
The 1970s
1970 1979
Smalltalk
(1976, 1980)
Ex-practitioners are
very influential:
GoF Patterns, XP, Agile, Refactoring
The Cambrian Explosion
The 1970s
1970 1979
Modula-2
(1978)
The Cambrian Explosion
The 1970s
1970 1979
Language X
(1979)
The Cambrian Explosion
The most important programming paradigms
• Imperative-procedural
– ALGOL, 1960
• Object-oriented
– Simula 1967
– Smalltalk 1976
• Functional
– ML 1972
• Symbolic
– Lisp 1959
– Maclisp 1970's
– Scheme 1970's
• Logic
– Prolog 1973
• Stack-based
– Forth 1970
Are you caught up
with the 1980's state of the art?
Does your DIY toolkit look like this?
For hammering nails:
For screwing things in:
For cutting wood:
For tightening bolts:
Does your programming toolkit look like this?
For domain modeling:
For complex business rules:
For querying data:
For live coding:
The most popular programming languages
• Java
• JavaScript
• C++
• C
• C#
• Python
• PHP
• Ruby
• Visual Basic
• Go
Australian English
British English
"I speak three languages"
It's a big world out there
Not every language looks like C/C#/Java/JavaScript
Let's go exploring…
SQL (1974)
SQL Background
• Originally "SEQUEL" (Structured English
Query Language)
• Designed as part of IBM's System R, the first
practical relational database.
• Before SQL: the dark ages of proprietary and
custom database query APIs.
Learning from SQL #1:
A consistent model:
everything is a set of relations
TABLE PersonAge
| Name | Age |
|---------|-----|
| Liz | 92 |
| Charles | 69 |
| Wills | 35 |
| Harry | 33 |
TABLE ParentChild
| Parent | Child |
|---------|---------|
| Diana | Wills |
| Diana | Harry |
| Charles | Wills |
| Charles | Harry |
| Liz | Charles |
| Name | Age |
|---------|-----|
| Liz | 92 |
| Charles | 69 |
| Wills | 35 |
| Harry | 33 |
SELECT Name FROM PersonAge
The result is another set
of relations
| Name | Age |
|---------|-----|
| Liz | 92 |
| Charles | 69 |
| Wills | 35 |
| Harry | 33 |
SELECT * FROM PersonAge WHERE Age > 50
The result is another set
of relations
SELECT Parent,Age
FROM PersonAge
OUTER JOIN ParentChild
WHERE Parent = Person
"Set operations, huh?
I bet there's a way to do
cartesian products then."
Consistency => Predictability
Here you go:
Learning from SQL #2:
SQL is expression-based
SELECT Name
FROM PersonAge
WHERE Age > 50
You can take a query like this:
And embed it as a subquery
SELECT Child
FROM ParentChild
WHERE Parent IN
(SELECT Name
FROM PersonAge
WHERE Age > 50)
Expressions are great, part 1:
Expressions are composable

There's another reason to prefer
expressions over statements…
void ifThenElseStatement(bool aBool)
{
int result;
if (aBool)
{
result = 42;
}
printfn("result=%i", result);
}
How many things could cause problems in this C-like code?
void ifThenElseStatement(bool aBool)
{
int result;
if (aBool)
{
result = 42;
}
printfn("result=%i", result);
}
How many things could cause problems in this C-like code?
void ifThenElseStatement(bool aBool)
{
int result;
if (aBool)
{
result = 42;
}
printfn("result=%i", result);
}
How many things could cause problems in this C-like code?
void ifThenElseStatement(bool aBool)
{
int result;
if (aBool)
{
result = 42;
}
printfn("result=%i", result);
}
How many things could cause problems in this C-like code?
void ifThenElseStatement(bool aBool)
{
int result;
if (aBool)
{
result = 42;
}
printfn("result=%i", result);
}
How many things could cause problems in this C-like code?
public void IfThenElseExpression(bool aBool)
{
int result = aBool ? 42 : 0;
Console.WriteLine("result={0}", result);
}
The same C-like code written in an expression-oriented way
public void IfThenElseExpression(bool aBool)
{
int result = aBool ? 42 : 0;
Console.WriteLine("result={0}", result);
}
The same C-like code written in an expression-oriented way
public void IfThenElseExpression(bool aBool)
{
int result = aBool ? 42 : 0;
Console.WriteLine("result={0}", result);
}
The same C-like code written in an expression-oriented way
public void IfThenElseExpression(bool aBool)
{
int result = aBool ? 42 : 0;
Console.WriteLine("result={0}", result);
}
The same C-like code written in an expression-oriented way
public void IfThenElseExpression(bool aBool)
{
int result = aBool ? 42 : 0;
Console.WriteLine("result={0}", result);
}
The same C-like code written in an expression-oriented way
int StandaloneSubexpression(bool aBool)
{
return aBool ? 42 : 0;
}
Expressions are great, part 2:
Expressions reduce bugs
and make refactoring easier

Learning from SQL #3:
It's declarative.
"What" not "How"
FILE *stream;
char *line = NULL;
size_t len = 0;
ssize_t nread;
stream = fopen(argv[1], "r");
while ((nread = getline(&line, &len, stream)) != -1) {
/* check what the age is */
if age > 50
fwrite(line, nread, 1, stdout);
}
free(line);
fclose(stream);
Example of "How" programming
SELECT * FROM PersonAge WHERE Age > 50
Example of "What" programming
Learning from SQL #4:
Separation of concerns
SQL: Separation of concerns
• It's a QUERY language, doh!
– A Data Query Language
• Insert/Update/Delete is a different language
– A Data Manipulation Language
• Defining tables etc. is a different language again
– A Data Definition Language
• "SQL" now means all of these together.
What can we learn from SQL?
• Be predictable
– use a consistent model
• Expression-based
– means code is composable
• Declarative interface
– Focus on exposing the what not the how
• Separation of concerns
• Interactivity is important
– You can play and experiment
Prolog (1972)
Prolog Background
• First mainstream logic programming language
• Designed in Marseille, France.
• From "programmation en logique"
• European answer to LISP for AI 
• Big in Japan ("Fifth generation" project)
Learning from Prolog #1:
A consistent model:
everything is a fact or a rule
Facts
age(liz,92).
age(charles,69).
age(wills,35).
age(harry,33).
parent(charles,wills).
parent(charles,harry).
parent(liz,charles).
Rules
olderThan(P,Age) :-
age(P,A),
A > Age.
isOlder(P1,P2) :-
age(P1,A1),
age(P2,A2),
A1 > A2.
Learning from Prolog #2:
It's declarative.
"What" not "How"
Age(liz,92).
true.
Age(P,92). % P is unbound
P=liz.
Age(liz,A). % A is unbound
A=92.
Prolog uses unification
grandparent(liz,harry).
true.
grandparent(liz,P). % P is unbound
P=harry.
P=wills.
Prolog uses unification
Q: "Would this make a good query
language as an alternative to SQL?"
A: "Yes, it exists and is called Datalog"
Get the names and addresses of employees who work for
at least one project located in Houston but whose
department does not have a location in Houston.
worksOnHoustonProj(Manager) :-
works_on(Manager,Proj,_),
project(_,Proj,'Houston',_).
notInHouston(Manager) :-
employee(_,_,_,Manager,_,_,_,_,_,Dept),
not dept_locations(Dept,'Houston').
answer(First,Middle,Last,Addr) :-
employee(First,Middle,Last,Mgr,_,Addr,_,_,_,_),
worksOnHoustonProj(Mgr), notInHouston(Mgr).
Datalog example
append([1], [2,3], X).
X = [1,2,3]
append(X, [2,3], [1,2,3]).
X = [1]
append(X, Y, [1,2,3]).
X = [] Y =[1,2,3]
X = [1] Y =[2,3]
X = [1,2] Y =[3]
X = [1,2,3] Y =[]
Bi-directional unification is awesome
Prolog demo
What can we learn from Prolog?
• Be consistent and predictable (again)
• Declarative (again)
• Unification is very cool
– Bi-directional queries
– Ask both "is true?" and "what matches?"
• Interactivity is important (again)
ML (1973)
ML
• "ML" for "Meta Language"
– Designed as part of a theorem-proving system
– Not to be confused with Machine Learning.
• An impure functional language
– Parent of Standard ML, OCaml, F#
Don't worry.
I'm not going to talk about
functional programming.
Learning from ML #1:
Type Inference
let doSomething f x =
let y = f (x + 1)
"hello" + y
let doSomething f x =
let y = f (x + 1)
"hello" + y
let doSomething f x =
let y = f (x + 1)
"hello" + y
Inferred type of doSomething :
f:(int -> string) -> x:int -> string
// C# code
public IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(
IEnumerable<TSource> source,
Func<TSource, TKey> keySelector
)
{
...
}
// F# code
let GroupBy source keySelector =
...
Benefits of type inference:
* Less typing
* Less noise, more logic
Here's a more complex example
Learning from ML #2:
Different defaults
Different defaults
• Immutable by default
– Mutable is a special case
• Non-null types by default
– Nullable is a special case
• Structural equality by default
– Reference equality is special case
• Everything must be initialized
Learning from ML #3:
Algebraic type system
New types are built from smaller types by:
Composing with “AND”
Composing with “OR”
Example: pairs, tuples, records
FruitSalad = One each of and and
Compose with “AND”
type FruitSalad = {
Apple: AppleVariety
Banana: BananaVariety
Cherry: CherryVariety
}
Snack = or or
Compose with “OR”
type Snack =
| Apple of AppleVariety
| Banana of BananaVariety
| Cherry of CherryVariety
A real world example
of composing types
Some requirements:
We accept three forms of payment:
Cash, Check, or Card.
For Cash we don't need any extra information
For Checks we need a check number
For Cards we need a card type and card number
type CheckNumber = int
type CardNumber = string
With an algebraic type system you would probably
implement by composing types, like this:
type CheckNumber = ...
type CardNumber = …
type CardType = Visa | Mastercard
type CreditCardInfo = {
CardType : CardType
CardNumber : CardNumber
}
type CheckNumber = ...
type CardNumber = ...
type CardType = ...
type CreditCardInfo = ...
type PaymentMethod =
| Cash
| Check of CheckNumber
| Card of CreditCardInfo
type CheckNumber = ...
type CardNumber = ...
type CardType = ...
type CreditCardInfo = ...
type PaymentMethod =
| Cash
| Check of CheckNumber
| Card of CreditCardInfo
type PaymentAmount = decimal
type Currency = EUR | USD
type CheckNumber = ...
type CardNumber = ...
type CardType = ...
type CreditCardInfo = ...
type PaymentMethod =
| Cash
| Check of CheckNumber
| Card of CreditCardInfo
type PaymentAmount = decimal
type Currency = EUR | USD
type Payment = {
Amount : PaymentAmount
Currency : Currency
Method : PaymentMethod }
Types can become
executable documentation
type Deal = Deck -> (Deck * Card)
type PickupCard = (Hand * Card) -> Hand
type Suit = Club | Diamond | Spade | Heart
type Rank = Two | Three | Four | Five | Six | Seven | Eight
| Nine | Ten | Jack | Queen | King | Ace
type Card = { Suit:Suit; Rank:Rank }
type Hand = Card list
type Deck = Card list
type Player = {Name:string; Hand:Hand}
type Game = { Deck:Deck; Players:Player list }
The domain on one screen!
type CardType = Visa | Mastercard
type CardNumber = string
type CheckNumber = int
type PaymentMethod =
| Cash
| Check of CheckNumber
| Card of CreditCardInfo
A big topic and not enough time  
More on DDD and designing with types at
fsharpforfunandprofit.com/ddd
ML demo
What can we learn from ML?
• Expression-based (again)
• Type inference is awesome
– Makes adding complicated parameters easy
• Make bad things harder
– E.g. immutable by default
• Parametric polymorphism (aka generics)
• Algebraic types are awesome
Smalltalk (1976,1980)
I
Smalltalk Background
• Developed at Xerox PARC
– Along with the first PC, the first GUI, the first
laser printer, ethernet, and more.
• Smalltalk introduced
– Message-based OO
– Model-View-Controller
– A windowing IDE
– Also had aVM, generational GC, etc.
Smalltalk-80 User Interface
Learning from Smalltalk #1:
A consistent model:
everything is an object
everything is an object
*everything* is an object
Learning from Smalltalk #2:
Minimal syntax.
Put the power in the language instead.
Learning from Smalltalk #3:
Late binding.
If you're going to be a dynamic language,
be a really dynamic language.
Learning from Smalltalk #4:
Who needs text files?
If everything is accessible
you have a lot of power
Smalltalk demo
What can we learn from Smalltalk?
• A consistent model, again
• Minimize syntax and make the language
powerful
• Be awesome and make people fall in love with
you!
"But surely self-contained interactive
languages like Smalltalk are a dead-end?"
Language X (1979)
Language X (1979)
• In the 1980's people would pay thousands of
dollars just to use this language.
• Its descendants have been at the heart of the
software products that dominate their field.
• Its grandchild is the most popular
programming language in the world.
A1 + B2 / 2
Why wasVisiCalc successful?
Like Smalltalk, a consistent model, a highly interactive
environment and a programming language: all fitting
together beautifully.
Like SQL, a domain-specific (expression-based!)
programming language that non-programmers could
understand:
Like ML, lots of expressive power in functions:
SUM(A1..A7)
Like Prolog, programming by filling in slots (aka "cells").
Like Smalltalk, no separate text files!
What can we learn fromVisiCalc?
• Programming languages appear in many guises.
• Programming is not just for programmers.
– People want to interact and explore.
– Programming for a specific domain is often more useful
than general purpose programming.
• Use the right tool for the job.
Summary
• There are many different approaches to
solving problems.
– A bigger toolbox is a good thing to have
• C-style syntax is not the only possible syntax.
– Sentences can end properly, with a period!
– No curly braces
– No dot syntax (not even Smalltalk)
A language that doesn't affect the way you
think about programming, is not worth
knowing – Alan Perlis
So go forth and expand your Galaxy Brain!
Slides and video here
fsharpforfunandprofit.com/fourfromforty
Thank you!
"Domain modelling Made Functional" book
fsharpforfunandprofit.com/books
@ScottWlaschin Me on twitter

Four Languages From Forty Years Ago

  • 1.
    Four Languages From FortyYearsAgo @ScottWlaschin fsharpforfunandprofit.com a.k.a What can we learn from the 1970's?
  • 2.
  • 3.
    Four languages from40 years ago • A brief history of programming languages • Hammers and toolkits • Four (or five) languages: – SQL (1974) – Prolog (1972) – ML (1973) – Smalltalk (1976,1980) – Language X (1979) ^or five
  • 4.
    A brief historyof programming languages
  • 5.
    A language thatdoesn't affect the way you think about programming, is not worth knowing – Alan Perlis Galaxy Brain seal of approval
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
    The 1960s 1960 1969 "IBMand the Seven Dwarfs." ALGOL 60 (1960)
  • 11.
    The 1960s 1969 "IBM andthe Seven Dwarfs." BASIC (1964) 1960
  • 12.
    The 1960s 1969 "IBM andthe Seven Dwarfs." 1960 PL/I (1964)
  • 13.
    The 1960s 1969 "IBM andthe Seven Dwarfs." 1960 ISWIM (1966)
  • 14.
    The 1960s 1969 "IBM andthe Seven Dwarfs." 1960 APL (1966)
  • 15.
    The 1960s 1969 "IBM andthe Seven Dwarfs." 1960 Simula 67 (1967)
  • 16.
    The 1960s 1969 "IBM andthe Seven Dwarfs." 1960 BCPL (1967)
  • 17.
    The 1960s 1969 "IBM andthe Seven Dwarfs." 1960 Logo (1967)
  • 18.
    The 1960s 1969 "IBM andthe Seven Dwarfs." 1960 ALGOL 68 (1968)
  • 19.
    The 1970s 1970 1979 TheCambrian Explosion
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
    The 1970s 1970 1979 MicrosoftBasic (1975) The Cambrian Explosion
  • 29.
    The 1970s 1970 1979 Smalltalk (1976,1980) Ex-practitioners are very influential: GoF Patterns, XP, Agile, Refactoring The Cambrian Explosion
  • 30.
  • 31.
    The 1970s 1970 1979 LanguageX (1979) The Cambrian Explosion
  • 32.
    The most importantprogramming paradigms • Imperative-procedural – ALGOL, 1960 • Object-oriented – Simula 1967 – Smalltalk 1976 • Functional – ML 1972 • Symbolic – Lisp 1959 – Maclisp 1970's – Scheme 1970's • Logic – Prolog 1973 • Stack-based – Forth 1970
  • 33.
    Are you caughtup with the 1980's state of the art?
  • 34.
    Does your DIYtoolkit look like this? For hammering nails: For screwing things in: For cutting wood: For tightening bolts:
  • 35.
    Does your programmingtoolkit look like this? For domain modeling: For complex business rules: For querying data: For live coding:
  • 36.
    The most popularprogramming languages • Java • JavaScript • C++ • C • C# • Python • PHP • Ruby • Visual Basic • Go
  • 37.
  • 38.
    It's a bigworld out there Not every language looks like C/C#/Java/JavaScript
  • 39.
  • 40.
  • 41.
    SQL Background • Originally"SEQUEL" (Structured English Query Language) • Designed as part of IBM's System R, the first practical relational database. • Before SQL: the dark ages of proprietary and custom database query APIs.
  • 42.
    Learning from SQL#1: A consistent model: everything is a set of relations
  • 43.
    TABLE PersonAge | Name| Age | |---------|-----| | Liz | 92 | | Charles | 69 | | Wills | 35 | | Harry | 33 | TABLE ParentChild | Parent | Child | |---------|---------| | Diana | Wills | | Diana | Harry | | Charles | Wills | | Charles | Harry | | Liz | Charles |
  • 44.
    | Name |Age | |---------|-----| | Liz | 92 | | Charles | 69 | | Wills | 35 | | Harry | 33 | SELECT Name FROM PersonAge The result is another set of relations
  • 45.
    | Name |Age | |---------|-----| | Liz | 92 | | Charles | 69 | | Wills | 35 | | Harry | 33 | SELECT * FROM PersonAge WHERE Age > 50 The result is another set of relations
  • 46.
    SELECT Parent,Age FROM PersonAge OUTERJOIN ParentChild WHERE Parent = Person "Set operations, huh? I bet there's a way to do cartesian products then." Consistency => Predictability Here you go:
  • 47.
    Learning from SQL#2: SQL is expression-based
  • 48.
    SELECT Name FROM PersonAge WHEREAge > 50 You can take a query like this:
  • 49.
    And embed itas a subquery SELECT Child FROM ParentChild WHERE Parent IN (SELECT Name FROM PersonAge WHERE Age > 50)
  • 50.
    Expressions are great,part 1: Expressions are composable 
  • 51.
    There's another reasonto prefer expressions over statements…
  • 52.
    void ifThenElseStatement(bool aBool) { intresult; if (aBool) { result = 42; } printfn("result=%i", result); } How many things could cause problems in this C-like code?
  • 53.
    void ifThenElseStatement(bool aBool) { intresult; if (aBool) { result = 42; } printfn("result=%i", result); } How many things could cause problems in this C-like code?
  • 54.
    void ifThenElseStatement(bool aBool) { intresult; if (aBool) { result = 42; } printfn("result=%i", result); } How many things could cause problems in this C-like code?
  • 55.
    void ifThenElseStatement(bool aBool) { intresult; if (aBool) { result = 42; } printfn("result=%i", result); } How many things could cause problems in this C-like code?
  • 56.
    void ifThenElseStatement(bool aBool) { intresult; if (aBool) { result = 42; } printfn("result=%i", result); } How many things could cause problems in this C-like code?
  • 57.
    public void IfThenElseExpression(boolaBool) { int result = aBool ? 42 : 0; Console.WriteLine("result={0}", result); } The same C-like code written in an expression-oriented way
  • 58.
    public void IfThenElseExpression(boolaBool) { int result = aBool ? 42 : 0; Console.WriteLine("result={0}", result); } The same C-like code written in an expression-oriented way
  • 59.
    public void IfThenElseExpression(boolaBool) { int result = aBool ? 42 : 0; Console.WriteLine("result={0}", result); } The same C-like code written in an expression-oriented way
  • 60.
    public void IfThenElseExpression(boolaBool) { int result = aBool ? 42 : 0; Console.WriteLine("result={0}", result); } The same C-like code written in an expression-oriented way
  • 61.
    public void IfThenElseExpression(boolaBool) { int result = aBool ? 42 : 0; Console.WriteLine("result={0}", result); } The same C-like code written in an expression-oriented way int StandaloneSubexpression(bool aBool) { return aBool ? 42 : 0; }
  • 62.
    Expressions are great,part 2: Expressions reduce bugs and make refactoring easier 
  • 63.
    Learning from SQL#3: It's declarative. "What" not "How"
  • 64.
    FILE *stream; char *line= NULL; size_t len = 0; ssize_t nread; stream = fopen(argv[1], "r"); while ((nread = getline(&line, &len, stream)) != -1) { /* check what the age is */ if age > 50 fwrite(line, nread, 1, stdout); } free(line); fclose(stream); Example of "How" programming
  • 65.
    SELECT * FROMPersonAge WHERE Age > 50 Example of "What" programming
  • 66.
    Learning from SQL#4: Separation of concerns
  • 67.
    SQL: Separation ofconcerns • It's a QUERY language, doh! – A Data Query Language • Insert/Update/Delete is a different language – A Data Manipulation Language • Defining tables etc. is a different language again – A Data Definition Language • "SQL" now means all of these together.
  • 68.
    What can welearn from SQL? • Be predictable – use a consistent model • Expression-based – means code is composable • Declarative interface – Focus on exposing the what not the how • Separation of concerns • Interactivity is important – You can play and experiment
  • 69.
  • 70.
    Prolog Background • Firstmainstream logic programming language • Designed in Marseille, France. • From "programmation en logique" • European answer to LISP for AI  • Big in Japan ("Fifth generation" project)
  • 71.
    Learning from Prolog#1: A consistent model: everything is a fact or a rule
  • 72.
  • 73.
    Learning from Prolog#2: It's declarative. "What" not "How"
  • 74.
    Age(liz,92). true. Age(P,92). % Pis unbound P=liz. Age(liz,A). % A is unbound A=92. Prolog uses unification
  • 75.
    grandparent(liz,harry). true. grandparent(liz,P). % Pis unbound P=harry. P=wills. Prolog uses unification
  • 76.
    Q: "Would thismake a good query language as an alternative to SQL?" A: "Yes, it exists and is called Datalog"
  • 77.
    Get the namesand addresses of employees who work for at least one project located in Houston but whose department does not have a location in Houston. worksOnHoustonProj(Manager) :- works_on(Manager,Proj,_), project(_,Proj,'Houston',_). notInHouston(Manager) :- employee(_,_,_,Manager,_,_,_,_,_,Dept), not dept_locations(Dept,'Houston'). answer(First,Middle,Last,Addr) :- employee(First,Middle,Last,Mgr,_,Addr,_,_,_,_), worksOnHoustonProj(Mgr), notInHouston(Mgr). Datalog example
  • 78.
    append([1], [2,3], X). X= [1,2,3] append(X, [2,3], [1,2,3]). X = [1] append(X, Y, [1,2,3]). X = [] Y =[1,2,3] X = [1] Y =[2,3] X = [1,2] Y =[3] X = [1,2,3] Y =[] Bi-directional unification is awesome
  • 79.
  • 80.
    What can welearn from Prolog? • Be consistent and predictable (again) • Declarative (again) • Unification is very cool – Bi-directional queries – Ask both "is true?" and "what matches?" • Interactivity is important (again)
  • 81.
  • 82.
    ML • "ML" for"Meta Language" – Designed as part of a theorem-proving system – Not to be confused with Machine Learning. • An impure functional language – Parent of Standard ML, OCaml, F#
  • 83.
    Don't worry. I'm notgoing to talk about functional programming.
  • 84.
    Learning from ML#1: Type Inference
  • 85.
    let doSomething fx = let y = f (x + 1) "hello" + y
  • 86.
    let doSomething fx = let y = f (x + 1) "hello" + y
  • 87.
    let doSomething fx = let y = f (x + 1) "hello" + y Inferred type of doSomething : f:(int -> string) -> x:int -> string
  • 88.
    // C# code publicIEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>( IEnumerable<TSource> source, Func<TSource, TKey> keySelector ) { ... } // F# code let GroupBy source keySelector = ... Benefits of type inference: * Less typing * Less noise, more logic Here's a more complex example
  • 89.
    Learning from ML#2: Different defaults
  • 90.
    Different defaults • Immutableby default – Mutable is a special case • Non-null types by default – Nullable is a special case • Structural equality by default – Reference equality is special case • Everything must be initialized
  • 91.
    Learning from ML#3: Algebraic type system
  • 92.
    New types arebuilt from smaller types by: Composing with “AND” Composing with “OR”
  • 93.
    Example: pairs, tuples,records FruitSalad = One each of and and Compose with “AND” type FruitSalad = { Apple: AppleVariety Banana: BananaVariety Cherry: CherryVariety }
  • 94.
    Snack = oror Compose with “OR” type Snack = | Apple of AppleVariety | Banana of BananaVariety | Cherry of CherryVariety
  • 95.
    A real worldexample of composing types
  • 96.
    Some requirements: We acceptthree forms of payment: Cash, Check, or Card. For Cash we don't need any extra information For Checks we need a check number For Cards we need a card type and card number
  • 97.
    type CheckNumber =int type CardNumber = string With an algebraic type system you would probably implement by composing types, like this:
  • 98.
    type CheckNumber =... type CardNumber = … type CardType = Visa | Mastercard type CreditCardInfo = { CardType : CardType CardNumber : CardNumber }
  • 99.
    type CheckNumber =... type CardNumber = ... type CardType = ... type CreditCardInfo = ... type PaymentMethod = | Cash | Check of CheckNumber | Card of CreditCardInfo
  • 100.
    type CheckNumber =... type CardNumber = ... type CardType = ... type CreditCardInfo = ... type PaymentMethod = | Cash | Check of CheckNumber | Card of CreditCardInfo type PaymentAmount = decimal type Currency = EUR | USD
  • 101.
    type CheckNumber =... type CardNumber = ... type CardType = ... type CreditCardInfo = ... type PaymentMethod = | Cash | Check of CheckNumber | Card of CreditCardInfo type PaymentAmount = decimal type Currency = EUR | USD type Payment = { Amount : PaymentAmount Currency : Currency Method : PaymentMethod }
  • 102.
  • 103.
    type Deal =Deck -> (Deck * Card) type PickupCard = (Hand * Card) -> Hand type Suit = Club | Diamond | Spade | Heart type Rank = Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | Jack | Queen | King | Ace type Card = { Suit:Suit; Rank:Rank } type Hand = Card list type Deck = Card list type Player = {Name:string; Hand:Hand} type Game = { Deck:Deck; Players:Player list } The domain on one screen!
  • 104.
    type CardType =Visa | Mastercard type CardNumber = string type CheckNumber = int type PaymentMethod = | Cash | Check of CheckNumber | Card of CreditCardInfo
  • 105.
    A big topicand not enough time   More on DDD and designing with types at fsharpforfunandprofit.com/ddd
  • 106.
  • 107.
    What can welearn from ML? • Expression-based (again) • Type inference is awesome – Makes adding complicated parameters easy • Make bad things harder – E.g. immutable by default • Parametric polymorphism (aka generics) • Algebraic types are awesome
  • 108.
  • 109.
  • 110.
    Smalltalk Background • Developedat Xerox PARC – Along with the first PC, the first GUI, the first laser printer, ethernet, and more. • Smalltalk introduced – Message-based OO – Model-View-Controller – A windowing IDE – Also had aVM, generational GC, etc.
  • 111.
  • 112.
    Learning from Smalltalk#1: A consistent model: everything is an object everything is an object *everything* is an object
  • 113.
    Learning from Smalltalk#2: Minimal syntax. Put the power in the language instead.
  • 114.
    Learning from Smalltalk#3: Late binding. If you're going to be a dynamic language, be a really dynamic language.
  • 115.
    Learning from Smalltalk#4: Who needs text files? If everything is accessible you have a lot of power
  • 116.
  • 117.
    What can welearn from Smalltalk? • A consistent model, again • Minimize syntax and make the language powerful • Be awesome and make people fall in love with you!
  • 118.
    "But surely self-containedinteractive languages like Smalltalk are a dead-end?"
  • 119.
  • 120.
    Language X (1979) •In the 1980's people would pay thousands of dollars just to use this language. • Its descendants have been at the heart of the software products that dominate their field. • Its grandchild is the most popular programming language in the world.
  • 122.
    A1 + B2/ 2 Why wasVisiCalc successful? Like Smalltalk, a consistent model, a highly interactive environment and a programming language: all fitting together beautifully. Like SQL, a domain-specific (expression-based!) programming language that non-programmers could understand: Like ML, lots of expressive power in functions: SUM(A1..A7) Like Prolog, programming by filling in slots (aka "cells"). Like Smalltalk, no separate text files!
  • 123.
    What can welearn fromVisiCalc? • Programming languages appear in many guises. • Programming is not just for programmers. – People want to interact and explore. – Programming for a specific domain is often more useful than general purpose programming. • Use the right tool for the job.
  • 124.
    Summary • There aremany different approaches to solving problems. – A bigger toolbox is a good thing to have • C-style syntax is not the only possible syntax. – Sentences can end properly, with a period! – No curly braces – No dot syntax (not even Smalltalk)
  • 125.
    A language thatdoesn't affect the way you think about programming, is not worth knowing – Alan Perlis So go forth and expand your Galaxy Brain!
  • 126.
    Slides and videohere fsharpforfunandprofit.com/fourfromforty Thank you! "Domain modelling Made Functional" book fsharpforfunandprofit.com/books @ScottWlaschin Me on twitter