OSCON - Emerging Languages - Seph (2011/07/27)

76
Ola Bini computational metalinguist [email protected] http://olabini.com/blog torsdag den 28 juli 2011

description

 

Transcript of OSCON - Emerging Languages - Seph (2011/07/27)

Page 1: OSCON - Emerging Languages - Seph (2011/07/27)

Ola  Binicomputational  metalinguist  

[email protected]://olabini.com/blog

torsdag den 28 juli 2011

Page 2: OSCON - Emerging Languages - Seph (2011/07/27)

Ola  BiniSwedish  language  geek

Works  for  ThoughtWorks  in  Chicago

JRuby  core  committer

Designer  of  Ioke  and  Seph

Member  of  JSR292  Expert  Group

torsdag den 28 juli 2011

Page 3: OSCON - Emerging Languages - Seph (2011/07/27)

Communication

Expressiveness

Simplicity

Homoiconicity

Language  flexibility

Language  design

torsdag den 28 juli 2011

Page 4: OSCON - Emerging Languages - Seph (2011/07/27)

Expressiveness

torsdag den 28 juli 2011

Page 5: OSCON - Emerging Languages - Seph (2011/07/27)

A  precursor:  Ioke

torsdag den 28 juli 2011

Page 6: OSCON - Emerging Languages - Seph (2011/07/27)

The  position  of  Ioke

torsdag den 28 juli 2011

Page 7: OSCON - Emerging Languages - Seph (2011/07/27)

Some  examples

torsdag den 28 juli 2011

Page 8: OSCON - Emerging Languages - Seph (2011/07/27)

0 fact = 1Number fact = method(self * (self - 1) fact)

10 fact println

torsdag den 28 juli 2011

Page 9: OSCON - Emerging Languages - Seph (2011/07/27)

"Command line arguments:" printlnSystem programArguments each(println)

torsdag den 28 juli 2011

Page 10: OSCON - Emerging Languages - Seph (2011/07/27)

fib = method( fn(a, b, [b, a + b]) iterate(1, 1) mapped(first))

(fib indexed(from: 1) takeWhile(second < 1000) last first + 1) printlnfib indexed(from: 1) droppedWhile(second < 1000) first first println

torsdag den 28 juli 2011

Page 11: OSCON - Emerging Languages - Seph (2011/07/27)

bottle = method(i, case(i, 0, "no more bottles of beer", 1, "1 bottle of beer", "#{i} bottles of beer"))

(99..1) each(i, "#{bottle(i)} on the wall, " println "take one down, pass it around," println "#{bottle(i - 1)} on the wall.\n" println)

torsdag den 28 juli 2011

Page 12: OSCON - Emerging Languages - Seph (2011/07/27)

use("mandarin")

帐户 = 本 摹拟 做( 转移 = 法(数量, 自: 自我, 至:, 自 平衡 -= 数量 至 平衡 += 数量 )

打印 = 法( "<帐户 名字: #{名字} 平衡: #{平衡}>" 打印行 ))

箫 = 帐户 带有(名字: "箫", 平衡: 142.0)俊 = 帐户 带有(名字: "俊", 平衡: 45.7)

帐户 转移(23.0, 自: 俊, 至: 箫)帐户 转移(10.0, 至: 俊, 自: 箫)俊 转移(57.4, 至: 箫)

箫 打印俊 打印

torsdag den 28 juli 2011

Page 13: OSCON - Emerging Languages - Seph (2011/07/27)

words = method(text, #/[a-z]+/ allMatches(text lower))

train = method(features, features fold({} withDefault(1), model, f, model[f] ++. model))

NWORDS = train(words(FileSystem readFully("small.txt")))

alphabet = "abcdefghijklmnopqrstuvwxyz" chars

edits1 = method(word, s = for(i <- 0..(word length + 1), [word[0...i], word[i..-1]]) set(*for(ab <- s, ab[0] + ab[1][1..-1]), ;deletes *for(ab <- s[0..-2], ab[0] + ab[1][1..1] + ab[1][0..0] + ab[1][2..-1]), ;transposes *for(ab <- s, c <- alphabet, ab[0] + c + ab[1][1..-1]), ;replaces *for(ab <- s, c <- alphabet, ab[0] + c + ab[1]))) ;inserts

knownEdits2 = method(word, for:set(e1 <- edits1(word), e2 <- edits1(e1), NWORDS key?(e2), e2))

known = method(words, for:set(w <- words, NWORDS key?(w), w))

correct = method(word, candidates = known([word]) ?| known(edits1(word)) ?| knownEdits2(word) ?| [word] candidates max(x, NWORDS[x]))

torsdag den 28 juli 2011

Page 14: OSCON - Emerging Languages - Seph (2011/07/27)

import(:javax:swing, :JFrame, :JButton)import java:awt:GridLayout

button = JButton new("Press me!") do( addActionListener(fn(e, button text = "Hello from Ioke")) addActionListener(fn(e, "button pressed" println)))

JFrame new("My Frame") do( layout = GridLayout new(2, 2, 3, 3) add(button) setSize(300, 80) visible = true)

torsdag den 28 juli 2011

Page 15: OSCON - Emerging Languages - Seph (2011/07/27)

ICheck

torsdag den 28 juli 2011

Page 16: OSCON - Emerging Languages - Seph (2011/07/27)

forAll(int x, int y, where: x < y, [x, y] sort should == [x, y])

torsdag den 28 juli 2011

Page 17: OSCON - Emerging Languages - Seph (2011/07/27)

forAll(int x, int y, where: y < x, classify(trivial) x == y, classifyAs(close) (x - y) abs < 2, [x,y] sort should == [y,x] sort)

torsdag den 28 juli 2011

Page 18: OSCON - Emerging Languages - Seph (2011/07/27)

forAll(list(int) xs, xs reverse reverse should == xs)

torsdag den 28 juli 2011

Page 19: OSCON - Emerging Languages - Seph (2011/07/27)

forEvery(integer x, integer y, [x, y] max should >= [x, y] min)

torsdag den 28 juli 2011

Page 20: OSCON - Emerging Languages - Seph (2011/07/27)

forAll(int x, int y, [x,y] sort should == [x,y])

torsdag den 28 juli 2011

Page 21: OSCON - Emerging Languages - Seph (2011/07/27)

Conditions

torsdag den 28 juli 2011

Page 22: OSCON - Emerging Languages - Seph (2011/07/27)

willFail = method( 10 / 0 )

torsdag den 28 juli 2011

Page 23: OSCON - Emerging Languages - Seph (2011/07/27)

bind( rescue( Condition Error Arithmetic DivisionByZero, fn(c, "Division by zero! Failing..." println nil)), result = willFail "got result: #{result}" println) println

torsdag den 28 juli 2011

Page 24: OSCON - Emerging Languages - Seph (2011/07/27)

bind( handle( Condition Error Arithmetic DivisionByZero, fn(c, "Division by zero! Restarting..." println invokeRestart(:useValue, 3))), result = willFail "got result: #{result}" println) println

torsdag den 28 juli 2011

Page 25: OSCON - Emerging Languages - Seph (2011/07/27)

comprehensions

conditions

tuplesdestructuring

operator shuffling

methods

macros

lexical blockssyntax

listsdictionaries

sets

messagesbooleans

blank slate

reflection/introspection

generalized assignmentaspects

java integration

pervasive documentation

sequences

enumerables

hooksdynamic places

mixins

decimal numbers

ratios

arbitrarily sized numbers

pairs

ranges

regular expressionsmulti-vm

symbols

prototype based OO

literalsdynamic typing

strong typing

homoiconicity

closures

icheck

torsdag den 28 juli 2011

Page 26: OSCON - Emerging Languages - Seph (2011/07/27)

Some  drawbacks

torsdag den 28 juli 2011

Page 27: OSCON - Emerging Languages - Seph (2011/07/27)

Slow!

torsdag den 28 juli 2011

Page 28: OSCON - Emerging Languages - Seph (2011/07/27)

VERY  mutable

torsdag den 28 juli 2011

Page 29: OSCON - Emerging Languages - Seph (2011/07/27)

No  concurrency

torsdag den 28 juli 2011

Page 30: OSCON - Emerging Languages - Seph (2011/07/27)

Library  support

torsdag den 28 juli 2011

Page 31: OSCON - Emerging Languages - Seph (2011/07/27)

Experiment

torsdag den 28 juli 2011

Page 32: OSCON - Emerging Languages - Seph (2011/07/27)

No  real  life  use!

torsdag den 28 juli 2011

Page 33: OSCON - Emerging Languages - Seph (2011/07/27)

JSR292

torsdag den 28 juli 2011

Page 34: OSCON - Emerging Languages - Seph (2011/07/27)

MethodHandle

torsdag den 28 juli 2011

Page 35: OSCON - Emerging Languages - Seph (2011/07/27)

Combinator  library

torsdag den 28 juli 2011

Page 36: OSCON - Emerging Languages - Seph (2011/07/27)

CallSite

torsdag den 28 juli 2011

Page 37: OSCON - Emerging Languages - Seph (2011/07/27)

ClassValue

torsdag den 28 juli 2011

Page 38: OSCON - Emerging Languages - Seph (2011/07/27)

InvokeDynamic

torsdag den 28 juli 2011

Page 39: OSCON - Emerging Languages - Seph (2011/07/27)

Bootstrap  Methods

torsdag den 28 juli 2011

Page 40: OSCON - Emerging Languages - Seph (2011/07/27)

Seph

torsdag den 28 juli 2011

Page 41: OSCON - Emerging Languages - Seph (2011/07/27)

Features

torsdag den 28 juli 2011

Page 42: OSCON - Emerging Languages - Seph (2011/07/27)

Dynamic  typing

torsdag den 28 juli 2011

Page 43: OSCON - Emerging Languages - Seph (2011/07/27)

Polymorphic  dispatch

torsdag den 28 juli 2011

Page 44: OSCON - Emerging Languages - Seph (2011/07/27)

Prototype  based  OOAKA  delegation

torsdag den 28 juli 2011

Page 45: OSCON - Emerging Languages - Seph (2011/07/27)

Immutable  objects

torsdag den 28 juli 2011

Page 46: OSCON - Emerging Languages - Seph (2011/07/27)

TCO

torsdag den 28 juli 2011

Page 47: OSCON - Emerging Languages - Seph (2011/07/27)

Mutable  lexical  scopes

torsdag den 28 juli 2011

Page 48: OSCON - Emerging Languages - Seph (2011/07/27)

Light  weightthreads

torsdag den 28 juli 2011

Page 49: OSCON - Emerging Languages - Seph (2011/07/27)

Clojure  STM

torsdag den 28 juli 2011

Page 50: OSCON - Emerging Languages - Seph (2011/07/27)

Module  system

torsdag den 28 juli 2011

Page 51: OSCON - Emerging Languages - Seph (2011/07/27)

Some  examples

torsdag den 28 juli 2011

Page 52: OSCON - Emerging Languages - Seph (2011/07/27)

fact = #(n, if(n == 0, 1, n * fact(n - 1)))

fact(10) println

torsdag den 28 juli 2011

Page 53: OSCON - Emerging Languages - Seph (2011/07/27)

fact = #(n, acc = #(acc, n, if(n == 0, acc, acc(n * acc, n - 1))) acc(1, n))

fact(10) println

torsdag den 28 juli 2011

Page 54: OSCON - Emerging Languages - Seph (2011/07/27)

"Command line arguments:" printlnSystem programArguments each(println)

torsdag den 28 juli 2011

Page 55: OSCON - Emerging Languages - Seph (2011/07/27)

fib = #( #(a, b, [b, a + b]) iterate(1, 1) mapped(first))

(fib indexed(from: 1) takeWhile(second < 1000) last first + 1) printlnfib indexed(from: 1) droppedWhile(second < 1000) first first println

torsdag den 28 juli 2011

Page 56: OSCON - Emerging Languages - Seph (2011/07/27)

bottle = #(i, case(i, 0, "no more bottles of beer", 1, "1 bottle of beer", "#{i} bottles of beer"))

(99..1) each(i, "#{bottle(i)} on the wall, " println "take one down, pass it around," println "#{bottle(i - 1)} on the wall.\n" println)

torsdag den 28 juli 2011

Page 57: OSCON - Emerging Languages - Seph (2011/07/27)

foo: #(n, #(i, n += i))

torsdag den 28 juli 2011

Page 58: OSCON - Emerging Languages - Seph (2011/07/27)

foop = #(n, receive( (p, i), val = n + i. p <- val. foop(val))),

foo: #(n, p = ->(foop(n)) #(i, p <- (currentProcess, i) receive( v, v)))

torsdag den 28 juli 2011

Page 59: OSCON - Emerging Languages - Seph (2011/07/27)

IntSet: Something with( empty?: false, adjoin: #(x, Adjoin with(s: self, obj: x)), ∪: #(x, Union with(left: self, right: x))),

Adjoin: IntSet with( contains?: #(y, obj == y || s contains?(y))),

Union: IntSet with( empty?: #(left empty? && right empty?), contains?: #(y, left contains?(y) || right contains?(y))),

Empty: IntSet with( empty?: true, contains?: #(_, false)),

IntegersMod: IntSet with( contains?: #(y, y % n == 0)),

(s, k, n) = (Empty, 2, 0)while(n < 1_000_000, if(prime?(k), s = s adjoin(k) n++ ) k++)s contains?(13) println

torsdag den 28 juli 2011

Page 60: OSCON - Emerging Languages - Seph (2011/07/27)

Implementation

torsdag den 28 juli 2011

Page 61: OSCON - Emerging Languages - Seph (2011/07/27)

Simple  dispatch

torsdag den 28 juli 2011

Page 62: OSCON - Emerging Languages - Seph (2011/07/27)

receiver. activationFor(3, false). invokeExact(receiver, arg0, arg1, arg2);

torsdag den 28 juli 2011

Page 63: OSCON - Emerging Languages - Seph (2011/07/27)

if(savedIdentity != receiver.identity()) { savedIdentity = receiver.identity(); savedMH = receiver.activationFor(2, false);}savedMH.invokeExact(receiver, arg0, arg1);

torsdag den 28 juli 2011

Page 64: OSCON - Emerging Languages - Seph (2011/07/27)

Arguments

torsdag den 28 juli 2011

Page 65: OSCON - Emerging Languages - Seph (2011/07/27)

private SephObject argument_1_42(boolean eval) { if(eval) { // compiled Seph code to eval the argument } else { return AST_ARGUMENT_1_42; }}

private final static MethodHandle ARGUMENT_1_42_MH = findVirtual(lookup().lookupClass(), "argument_1_42", methodType(SephObject.class, boolean.class));

torsdag den 28 juli 2011

Page 66: OSCON - Emerging Languages - Seph (2011/07/27)

Intrinsics

torsdag den 28 juli 2011

Page 67: OSCON - Emerging Languages - Seph (2011/07/27)

TCO

torsdag den 28 juli 2011

Page 68: OSCON - Emerging Languages - Seph (2011/07/27)

public class SThread { public MethodHandle tail;}// SThread

torsdag den 28 juli 2011

Page 69: OSCON - Emerging Languages - Seph (2011/07/27)

MethodHandle saved = insertArguments(receiver. activationFor(3, false), 0, arg0, arg1, arg2);thread.tail = saved;return SThread.TAIL_MARKER;

torsdag den 28 juli 2011

Page 70: OSCON - Emerging Languages - Seph (2011/07/27)

SephObject result = // real operationwhile(current == SThread.TAIL_MARKER) { current = thread.tail.invokeExact();}return result;

torsdag den 28 juli 2011

Page 71: OSCON - Emerging Languages - Seph (2011/07/27)

Activation  slow  path(useful  JSR292  trick)

torsdag den 28 juli 2011

Page 72: OSCON - Emerging Languages - Seph (2011/07/27)

MethodType#methodType(Class ret, Class... params)CallSite#type()MethodHandles#exactInvoker(MethodType type)MethodHandles#insertArguments(MethodHandle, int pos, Object... args)MethodHandles#filterArguments(MethodHandle, int pos, MethodHandle... filters)

torsdag den 28 juli 2011

Page 73: OSCON - Emerging Languages - Seph (2011/07/27)

interface SephObject { // ... MethodHandle activationFor(int arity); // ...}

torsdag den 28 juli 2011

Page 74: OSCON - Emerging Languages - Seph (2011/07/27)

class SephCallSite extends CallSite { public MethodHandle computeSlowPath() { MethodHandle invoker = exactInvoker(type()); MethodHandle activation = findVirtual(SephObject.class, "activationFor", methodType(MethodHandle.class, int.class)); MethodHandle boundActivation = insertArguments(activation, 0, arityOfThisCallSite()); return filterArguments(invoker, 0, boundActivation); }}

torsdag den 28 juli 2011

Page 75: OSCON - Emerging Languages - Seph (2011/07/27)

Current/Future

torsdag den 28 juli 2011