gilad bracha ministry of truth embedding dsls in newspeak: newshell, ebnf and hopscotch
TRANSCRIPT
![Page 1: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/1.jpg)
Gilad BrachaMinistry of Truth
Embedding DSLs in Newspeak:
NewShell, EBNF and Hopscotch
![Page 2: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/2.jpg)
Three DSLs
Shell Scripting
Parsing
UI
![Page 3: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/3.jpg)
Newspeak Syntax for Java
Programmers
![Page 4: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/4.jpg)
Newspeak Syntax for Java
Programmers
![Page 5: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/5.jpg)
Newspeak Syntax for C#
Programmers
![Page 6: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/6.jpg)
Syntax: Unary Expressions
x foo
means
x.foo()
![Page 7: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/7.jpg)
Syntax: Unary Expressions
x foo
means
x.foo()
![Page 8: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/8.jpg)
Binary Expressions
6 + 3 factorial
evaluates to 12.
In javanese, we’d write
6.+(3.factorial()) or, really
6.plus(3.factorial())
![Page 9: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/9.jpg)
Keyword Expressions
Windows version: 7 + 0i .
is equivalent to all these:
Windows version: (7 + 0i).
Windows version: (7 + (0 i)).
Windows.version(7 + 0.i()) ;
![Page 10: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/10.jpg)
Keyword Expressions
add: 1 to: Cobol
in javanese would be
add(1, Cobol);
Big advantage - no arity errors
![Page 11: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/11.jpg)
Three DSLs
Shell Scripting
Parsing
UI
![Page 12: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/12.jpg)
NewShell
class NewShell = (
ls value: ‘-l’.
ls - ‘lt’.
echo value: ‘Hello World’.
svn value: ‘ls’ value: ‘svn://myDir’.
(ls value findTokens: {Character cr}) collect: ls.
)()
![Page 13: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/13.jpg)
Three DSLs
Shell Scripting
Parsing
UI
![Page 14: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/14.jpg)
BNF
id = letter (letter | digit) *
Parser Combinators
![Page 15: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/15.jpg)
BNF
id = letter (letter | digit) *
Newspeak
id = letter, (letter | digit) star.
Parser Combinators
![Page 16: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/16.jpg)
BNF
id = letter (letter | digit) *
Newspeak
id = letter, (letter | digit) star.
Javanese
id = letter().seq(letter().or(digit()).star());
Parser Combinators
![Page 17: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/17.jpg)
How it Works
id = letter, (letter | digit) star.
![Page 18: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/18.jpg)
How it Works
id = letter, (letter | digit) star.
![Page 19: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/19.jpg)
How it Works
id = letter, (letter | digit) star.
![Page 20: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/20.jpg)
How it Works
id = letter, (letter | digit) star.
![Page 21: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/21.jpg)
How it Works
id = letter, (letter | digit) star.
letter
![Page 22: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/22.jpg)
How it Works
id = letter, (letter | digit) star.
letter
![Page 23: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/23.jpg)
How it Works
id = letter, (letter | digit) star.
letter
![Page 24: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/24.jpg)
How it Works
id = letter, (letter | digit) star.
letter
![Page 25: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/25.jpg)
How it Works
id = letter, (letter | digit) star.
letter
![Page 26: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/26.jpg)
How it Works
id = letter, (letter | digit) star.
letter
![Page 27: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/27.jpg)
How it Works
id = letter, (letter | digit) star.
letter
letter
![Page 28: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/28.jpg)
How it Works
id = letter, (letter | digit) star.
letter
letter
![Page 29: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/29.jpg)
How it Works
id = letter, (letter | digit) star.
letter
digitletter
![Page 30: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/30.jpg)
How it Works
id = letter, (letter | digit) star.
letter
|
digitletter
![Page 31: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/31.jpg)
How it Works
id = letter, (letter | digit) star.
letter star
|
digitletter
![Page 32: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/32.jpg)
How it Works
id = letter, (letter | digit) star.
letter star
|
digitletter
,
![Page 33: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/33.jpg)
Why is this Pretty?
id = letter, (letter | digit) star.
![Page 34: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/34.jpg)
Why is this Ugly?
id = letter().seq(letter().or(digit()).star());
![Page 35: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/35.jpg)
Why is this Ugly?
id = letter().seq(letter().or(digit()).star());
vs.
id = letter (letter | digit) *
vs.
id = letter, (letter | digit) star.
![Page 36: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/36.jpg)
Why is this Ugly?
id = letter().seq(letter().or(digit()).star());
vs.
id = letter (letter | digit) *
vs.
id = letter, (letter | digit) star.
![Page 37: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/37.jpg)
Why is it Ugly?
A programming language is low level when its programs require attention to the irrelevant
- Alan Perlis
![Page 38: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/38.jpg)
class ExampleGrammar1 = ExecutableGrammar ( |
digit = charBetween: ‘0’ and: ‘9’.
letter = (charBetween: ‘a’ and:’z’) | (charBetween: ‘A’ and:’Z’).
id = letter, (letter | digit) star.
identifier = tokenFor: id.
hat = tokenFromChar: ‘ˆ’.
expression = identifier.
returnStatement = hat, expression.
| )()
A Complete Grammar
![Page 39: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/39.jpg)
returnStatement = hat, expression wrapper:[:r : e | ReturnStatAST on: e ]
Building an AST
![Page 40: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/40.jpg)
Building an AST
returnStatement = hat, expression
wrapper:[:r : e |
ReturnStatAST on: e
]wrapper: ,
expression
^
![Page 41: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/41.jpg)
returnStatement = hat, expression
wrapper:[:r : e |
ReturnStatAST on: e
]
Grammar
![Page 42: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/42.jpg)
returnStatement = hat, expression
wrapper:[:r : e |
ReturnStatAST on: e
]
Semantic Action
![Page 43: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/43.jpg)
Superclass (pure grammar specification):
returnStatement = hat, expression
Subclass (AST builder):
returnStatement = (
super returnStatement
wrapper:[:r : e | ReturnStatAST on: e] )
Factor out Grammar
![Page 44: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/44.jpg)
class ExampleParser1= ExampleGrammar1 () (
id = (
ˆsuper id
wrapper:[:fst :snd | fst asString, (String withAll: snd)]
)
identifier = (
ˆsuper identifier
wrapper:[:v | VariableAST new name: v token;
start: v start; end: v end].
)
r
Modular Parser
![Page 45: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/45.jpg)
…
returnStatement = (
ˆsuper returnStatement
wrapper:[:r :e | ReturnStatAST new expr:e;
start: r start; end: e end].
)
)
Modular Parser
![Page 46: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/46.jpg)
class ExampleGrammar2 = ExampleGrammar1 (
|
if = tokenFromSymbol:#if.
then = tokenFromSymbol:#then.
else = tokenFromSymbol:#else.
ifStatement = if, expression, then, statement, else, statement.
statement = ifStatement | returnStatement.
|
)()
Extending a Grammar
![Page 47: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/47.jpg)
Mutual RecursionIfStmtreturnStat
|
if then else
stmt
![Page 48: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/48.jpg)
Mutual Recursion
statement
ifStatement
letterid
identifierhat
expressionreturnStatement
if
thenelse
digit nilnilnilnilnilnilnil
nil
nilnilnil
nil
![Page 49: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/49.jpg)
Mutual Recursion
statement
ifStatement
letterid
identifierhat
expressionreturnStatement
if
thenelse
digit a parsernilnilnilnilnilnil
nil
nilnilnil
nil
![Page 50: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/50.jpg)
Mutual Recursion
statement
ifStatement
letterid
identifierhat
expressionreturnStatement
if
thenelse
digit a parsera parser
nilnilnilnilnil
nil
nilnilnil
nil
![Page 51: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/51.jpg)
Mutual Recursion
statement
ifStatement
letterid
identifierhat
expressionreturnStatement
if
thenelse
digit a parsera parsera parser
nilnilnilnil
nil
nilnilnil
nil
![Page 52: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/52.jpg)
Mutual Recursion
statement
ifStatement
letterid
identifierhat
expressionreturnStatement
if
thenelse
digit a parsera parsera parsera parser
nilnilnil
nil
nilnilnil
nil
![Page 53: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/53.jpg)
Mutual Recursion
statement
ifStatement
letterid
identifierhat
expressionreturnStatement
if
thenelse
digit a parsera parsera parsera parsera parser
nilnil
nil
nilnilnil
nil
![Page 54: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/54.jpg)
Mutual Recursion
statement
ifStatement
letterid
identifierhat
expressionreturnStatement
if
thenelse
digit a parsera parsera parsera parsera parsera parsera parser
nil
nilnilnil
nil
![Page 55: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/55.jpg)
Mutual Recursion
statement
ifStatement
letterid
identifierhat
expressionreturnStatement
if
thenelse
digit a parsera parsera parsera parsera parsera parsera parser
a parser
nilnilnil
nil
![Page 56: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/56.jpg)
Mutual Recursion
statement
ifStatement
letterid
identifierhat
expressionreturnStatement
if
thenelse
digit a parsera parsera parsera parsera parsera parsera parser
a parser
a parsernilnil
nil
![Page 57: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/57.jpg)
Mutual Recursion
statement
ifStatement
letterid
identifierhat
expressionreturnStatement
if
thenelse
digit a parsera parsera parsera parsera parsera parsera parser
a parser
a parsera parser
nil
nil
![Page 58: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/58.jpg)
Mutual Recursion
statement
ifStatement
letterid
identifierhat
expressionreturnStatement
if
thenelse
digit a parsera parsera parsera parsera parsera parsera parser
a parser
a parsera parserboom!
nil
![Page 59: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/59.jpg)
Addressed with laziness in Haskell
Can be addressed with closures
ifStatement = if, [expression], [then], [statement],
[else], [statement].
statement = ifStatement | [returnStatement].
Mutual Recursion
![Page 60: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/60.jpg)
Addressed with laziness in Haskell
Can be addressed with closures
ifStatement = if, [expression], [then], [statement],
[else], [statement].
statement = ifStatement | [returnStatement].
Mutual Recursion
![Page 61: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/61.jpg)
Use Reflection instead of Laziness.
Framework initializes all slots to “stand-in” parsers which act as forward references
Being Reflective rather than Lazy
![Page 62: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/62.jpg)
Mutual Recursion
statementifStatement
letterid
identifierhat
expressionreturnStatement
ifthenelse
digit fwd reffwd reffwd reffwd reffwd reffwd reffwd ref
fwd reffwd reffwd reffwd reffwd ref
![Page 63: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/63.jpg)
Mutual Recursion
statementifStatement
letterid
identifierhat
expressionreturnStatement
ifthenelse
digit a parserfwd reffwd reffwd reffwd reffwd reffwd ref
fwd reffwd reffwd reffwd reffwd ref
![Page 64: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/64.jpg)
Mutual Recursion
statementifStatement
letterid
identifierhat
expressionreturnStatement
ifthenelse
digit a parsera parserfwd reffwd reffwd reffwd reffwd ref
fwd reffwd reffwd reffwd reffwd ref
![Page 65: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/65.jpg)
Mutual Recursion
statementifStatement
letterid
identifierhat
expressionreturnStatement
ifthenelse
digit a parsera parsera parserfwd reffwd reffwd reffwd ref
fwd reffwd reffwd reffwd reffwd ref
![Page 66: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/66.jpg)
Mutual Recursion
statementifStatement
letterid
identifierhat
expressionreturnStatement
ifthenelse
digit a parsera parsera parsera parserfwd reffwd reffwd ref
fwd reffwd reffwd reffwd reffwd ref
![Page 67: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/67.jpg)
Mutual Recursion
statementifStatement
letterid
identifierhat
expressionreturnStatement
ifthenelse
digit a parsera parsera parsera parsera parserfwd reffwd ref
fwd reffwd reffwd reffwd reffwd ref
![Page 68: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/68.jpg)
Mutual Recursion
statementifStatement
letterid
identifierhat
expressionreturnStatement
ifthenelse
digit a parsera parsera parsera parsera parsera parsera parser
fwd reffwd reffwd reffwd reffwd ref
![Page 69: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/69.jpg)
Mutual Recursion
statementifStatement
letterid
identifierhat
expressionreturnStatement
ifthenelse
digit a parsera parsera parsera parsera parsera parsera parser
a parserfwd reffwd reffwd reffwd ref
![Page 70: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/70.jpg)
Mutual Recursion
statementifStatement
letterid
identifierhat
expressionreturnStatement
ifthenelse
digit a parsera parsera parsera parsera parsera parsera parser
a parsera parserfwd reffwd reffwd ref
![Page 71: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/71.jpg)
Mutual Recursion
statementifStatement
letterid
identifierhat
expressionreturnStatement
ifthenelse
digit a parsera parsera parsera parsera parsera parsera parser
a parsera parsera parserfwd reffwd ref
![Page 72: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/72.jpg)
Mutual Recursion
statementifStatement
letterid
identifierhat
expressionreturnStatement
ifthenelse
digit a parsera parsera parsera parsera parsera parsera parser
a parsera parsera parsera parserfwd ref
![Page 73: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/73.jpg)
Mutual Recursion
statementifStatement
letterid
identifierhat
expressionreturnStatement
ifthenelse
digit a parsera parsera parsera parsera parsera parsera parser
a parsera parsera parsera parsera parser
![Page 74: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/74.jpg)
Mutual RecursionIfStmtreturnStat
|
if then else
stmt
FwdRef
![Page 75: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/75.jpg)
Being Reflective rather than Lazy
Use Reflection instead of Laziness.
Framework initializes all slots to “stand-in” parsers which act as forward references
When grammar is completely initialized, stand-ins are connected to originals and forward calls to them
![Page 76: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/76.jpg)
Mutual RecursionIfStmtreturnStat
|
if then else
stmt
FwdRef
![Page 77: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/77.jpg)
The Mirror is Mightier Than the Sloth
![Page 78: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/78.jpg)
Grammar1
Grammar2 Parser1
Parser2
![Page 79: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/79.jpg)
Grammar1
Grammar2 Parser1
Parser2
![Page 80: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/80.jpg)
Grammar1
Grammar2
Parser1
Parser2
![Page 81: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/81.jpg)
class ExampleParser2 = ExampleParser1 mixin | >
ExampleGrammar2 ()
(
ifStatement = (
ˆsuper ifStatement
wrapper:[:ifKw :e :thenKw :s1 :elseKw :s2 | …
]
)
)
Composing Parsers
![Page 82: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/82.jpg)
Shareable among several IDEs/compilers that require distinct ASTs
Shareable among other language tools: syntax colorizers, postprocessing tools
Grammar is shared executable
specification
![Page 83: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/83.jpg)
Three DSLs
Shell Scripting
Parsing
UI
![Page 84: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/84.jpg)
Hopscotch
A GUI application framework
Higher level of abstraction than widgets
Provides DSL for composing presentations out of pieces known as fragments
![Page 85: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/85.jpg)
Fragments
Fragments of presentation
Atomic widgets correspond to leaf fragments
Aggregates represented via compound fragments
Composed via combinators
![Page 86: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/86.jpg)
Fragment Combinators
blank, filler
button:action:, link:action:, image:, menuWithLabelsAndActions:
row:, column:, centered:, collapsed:expanded:
deferred:, draggable:subject:
![Page 87: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/87.jpg)
Dispatching up the fragment hierarchy
Dispatching up the visual containment hierarchy makes sense
Old idea (at least since NewtonScript)
Realized using doesNotUnderstand:
![Page 88: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/88.jpg)
Demo
![Page 89: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/89.jpg)
Connections
Self & Smalltalk
![Page 90: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/90.jpg)
ConnectionsParser Combinators.
Too much to survey; some highlights:
Parsec (Haskell parser combinator library)
Swierstra et al.
Sparsec (Scala parser combinator library)
PEGs (Ford, POPL04, ICFP)
![Page 91: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/91.jpg)
Connections
Parser Combinators (continued)
Tedir (Plesner-Hansen’s masters thesis)
Ometa (OOPLA 07 DLS)
![Page 92: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/92.jpg)
Conclusions
Newspeak supports DSLs via
Unconventional syntax
keywords
operators as methods
implicit receivers
Dynamic typing and Reflection
doesNotUnderstand:
![Page 93: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/93.jpg)
Conclusions
Newspeak also supports DSLs via
Mixins, Modules, Hierarchy inheritance
IDE
Combinators are a powerful technique
Compositional
Useful in libraries and languages
![Page 94: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/94.jpg)
Status Available at http://newpeaklanguage.org
Open source under Apache 2.0 license
Work in Progress
Expect some tweaks to syntax and semantics
Implementation still not complete - especially libraries
![Page 95: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/95.jpg)
Credits
Peter Ahe
Vassili Bykov
Yaron Kashai
Bill Maddox
Eliot Miranda
![Page 96: Gilad Bracha Ministry of Truth Embedding DSLs in Newspeak: NewShell, EBNF and Hopscotch](https://reader036.vdocument.in/reader036/viewer/2022062423/5697bfdf1a28abf838cb2690/html5/thumbnails/96.jpg)
This file is licensed under the Creative Commons Attribution ShareAlike 3.0 License. In short: you are free to share and make derivative works of the file under the conditions that you appropriately attribute it, and that you distribute it only under a license identical to this one. Official
license.
The Newspeak eye used in the bullets, slide background etc. was designed by Victoria Bracha and is used by permission.