Eliot Miranda uploaded a new version of Collections to project The Trunk:
http://source.squeak.org/trunk/Collections-eem.760.mcz
==================== Summary ====================
Name: Collections-eem.760
Author: eem
Time: 12 July 2017, 5:29:57.850345 pm
UUID: 622a9db4-e0d8-4c28-886a-d9b71a8fac49
Ancestors: Collections-pre.759
Make Interval>>, answer another Interval if possible, so that (1 to: 2), (3 to: 4) answers (1 to: 4) not #(1 2 3 4).
Correct a misapprension in String>>hash.
Use the preferred var:type: and nuke an unused declaration in some translated primitives.
=============== Diff against Collections-pre.759 ===============
Item was changed:
----- Method: ByteString class>>indexOfAscii:inString:startingAt: (in category 'primitives') -----
indexOfAscii: anInteger inString: aString startingAt: start
| stringSize |
<primitive: 'primitiveIndexOfAsciiInString' module: 'MiscPrimitivePlugin'>
+ <var: #aString type: #'unsigned char *'>
- <var: #aCharacter declareC: 'int anInteger'>
- <var: #aString declareC: 'unsigned char *aString'>
stringSize := aString size.
start to: stringSize do: [:pos |
(aString basicAt: pos) = anInteger ifTrue: [^ pos]].
+ ^ 0!
- ^ 0
- !
Item was changed:
----- Method: ByteString>>findSubstring:in:startingAt:matchTable: (in category 'comparing') -----
findSubstring: key in: body startingAt: start matchTable: matchTable
"Answer the index in the string body at which the substring key first occurs, at or beyond start. The match is determined using matchTable, which can be used to effect, eg, case-insensitive matches. If no match is found, zero will be returned.
The algorithm below is not optimum -- it is intended to be translated to C which will go so fast that it wont matter."
| index |
<primitive: 'primitiveFindSubstring' module: 'MiscPrimitivePlugin'>
+ <var: #key type: #'unsigned char *'>
+ <var: #body type: #'unsigned char *'>
+ <var: #matchTable type: #'unsigned char *'>
- <var: #key declareC: 'unsigned char *key'>
- <var: #body declareC: 'unsigned char *body'>
- <var: #matchTable declareC: 'unsigned char *matchTable'>
key size = 0 ifTrue: [^ 0].
(start max: 1) to: body size - key size + 1 do:
[:startIndex |
index := 1.
+ [(matchTable at: (body basicAt: startIndex+index-1) + 1)
+ = (matchTable at: (key basicAt: index) + 1)]
+ whileTrue:
- [(matchTable at: (body basicAt: startIndex+index-1) + 1)
- = (matchTable at: (key basicAt: index) + 1)]
- whileTrue:
[index = key size ifTrue: [^ startIndex].
index := index+1]].
^ 0
"
' ' findSubstring: 'abc' in: 'abcdefabcd' startingAt: 1 matchTable: CaseSensitiveOrder 1
' ' findSubstring: 'abc' in: 'abcdefabcd' startingAt: 2 matchTable: CaseSensitiveOrder 7
' ' findSubstring: 'abc' in: 'abcdefabcd' startingAt: 8 matchTable: CaseSensitiveOrder 0
' ' findSubstring: 'abc' in: 'abcdefABcd' startingAt: 2 matchTable: CaseSensitiveOrder 0
' ' findSubstring: 'abc' in: 'abcdefABcd' startingAt: 2 matchTable: CaseInsensitiveOrder 7
"!
Item was added:
+ ----- Method: Interval>>, (in category 'adding') -----
+ , otherCollection
+ "Override to answer an Interval if otherCollection is an adjacent and congruent interval."
+ ^(otherCollection isInterval
+ and: [otherCollection increment = step
+ and: [otherCollection first = (self last + step)]])
+ ifTrue: [self class from: start to: otherCollection last by: step]
+ ifFalse: [super, otherCollection]!
Item was changed:
----- Method: String>>hash (in category 'comparing') -----
hash
"#hash is implemented, because #= is implemented"
"ar 4/10/2005: I had to change this to use ByteString hash as initial
hash in order to avoid having to rehash everything and yet compute
the same hash for ByteString and WideString.
md 16/10/2006: use identityHash as initialHash, as behavior hash will
+ use String hash (name) to have a better hash soon.
+ eem 4/17/2017 it's not possible to use String hash (name) for the
+ initial hash because that would be recursive."
+ ^self class stringHash: self initialHash: ByteString identityHash!
- use String hash (name) to have a better hash soon"
- ^ self class stringHash: self initialHash: ByteString identityHash!
Eliot Miranda uploaded a new version of EToys to project The Trunk:
http://source.squeak.org/trunk/EToys-eem.305.mcz
==================== Summary ====================
Name: EToys-eem.305
Author: eem
Time: 12 July 2017, 5:17:21.792431 pm
UUID: 6180f254-4baa-41f9-a31d-adb1fa208d77
Ancestors: EToys-eem.304
Fix the ScriptCompiler's evaluate:in:to:notifying:ifFail:logged: method for non-cil contexts (e.g. the ContextVariablesInspector bottom right pane in the debugger). The old code used aContext methodClass which would exclude the variables of a receiver whose class inherited the method, rather than implemented it directly (e.g. debug (1@2) printString and in the context inspector on the Point(Object)>>printString activation try and evaluate x@y. Using methodClass excludes Point's inst vars.
At the same time eliminate its reliance on DoIt: and DoItIn:
=============== Diff against EToys-eem.304 ===============
Item was changed:
----- Method: ScriptCompiler>>evaluate:in:to:notifying:ifFail:logged: (in category 'as yet unclassified') -----
evaluate: textOrStream in: aContext to: receiver notifying: aRequestor ifFail: failBlock logged: logFlag
"Compiles the sourceStream into a parse tree, then generates code into a
method. This method is then installed in the receiver's class so that it
can be invoked. In other words, if receiver is not nil, then the text can
refer to instance variables of that receiver (the Inspector uses this). If
aContext is not nil, the text can refer to temporaries in that context (the
Debugger uses this). If aRequestor is not nil, then it will receive a
+ notify:at: message before the attempt to evaluate is aborted."
- notify:at: message before the attempt to evaluate is aborted. Finally, the
- compiled method is invoked from here as DoIt or (in the case of
- evaluation in aContext) DoItIn:. The method is subsequently removed
- from the class, but this will not get done if the invocation causes an
- error which is terminated. Such garbage can be removed by executing:
- Smalltalk allBehaviorsDo: [:cl | cl removeSelector: #DoIt; removeSelector:
- #DoItIn:]."
+ | methodNode method value toLog itsSelectionString itsSelection |
- | class methodNode method value selector toLog itsSelectionString itsSelection |
- class := (aContext == nil ifTrue: [receiver] ifFalse: [aContext receiver]) class.
methodNode := self parser new
parse: textOrStream readStream
+ class: (self classForReceiver: receiver context: aContext)
- class: class
noPattern: true
context: aContext
notifying: aRequestor
+ ifFail: [^ failBlock value]
+ for: receiver.
+ method := methodNode generate: (CompiledMethodTrailer empty sourceCode: methodNode sourceText; yourself).
- ifFail: [^ failBlock value] for: receiver.
- method := methodNode generate: (CompiledMethodTrailer empty sourceCode: (methodNode sourceText); yourself).
self interactive ifTrue:
[method := method copyWithTempNames: methodNode tempNames].
+ value := receiver
+ withArgs: (aContext ifNil: [#()] ifNotNil: [{aContext}])
+ executeMethod: method.
- selector := aContext isNil
- ifTrue: [#DoIt]
- ifFalse: [#DoItIn:].
- class addSelectorSilently: selector withMethod: method.
- value := aContext isNil
- ifTrue: [receiver DoIt]
- ifFalse: [receiver DoItIn: aContext].
- InMidstOfFileinNotification signal
- ifFalse: [class basicRemoveSelector: selector].
logFlag ifTrue:
[toLog := ((aRequestor respondsTo: #selection) and:
[(itsSelection := aRequestor selection) notNil] and:
[(itsSelectionString := itsSelection asString) isEmptyOrNil not] )
ifTrue:
[itsSelectionString]
ifFalse:
[textOrStream readStream contents].
SystemChangeNotifier uniqueInstance evaluated: toLog context: aContext].
+ ^value!
- ^ value!
Eliot Miranda uploaded a new version of Compiler to project The Trunk:
http://source.squeak.org/trunk/Compiler-eem.357.mcz
==================== Summary ====================
Name: Compiler-eem.357
Author: eem
Time: 12 July 2017, 5:14:16.035903 pm
UUID: 3965b31d-87f6-47e3-b23e-57dd1dd273b9
Ancestors: Compiler-eem.356
Fix the Compiler's evaluate:in: methods for non-cil contexts (e.g. the ContextVariablesInspector bottom right pane in the debugger). The old code used aContext methodClass which would exclude the variables of a receiver whose class inherited the method, rather than implemented it directly (e.g. debug (1@2) printString and in the context inspector on the Point(Object)>>printString activation try and evaluate x@y. Using methodClass excludes Point's inst vars.
=============== Diff against Compiler-eem.356 ===============
Item was added:
+ ----- Method: Compiler>>classForReceiver:context: (in category 'private') -----
+ classForReceiver: receiver context: contextOrNil
+ "Answer the class to compile in for a receiver and aContext.
+ If aContext is non-nil use its receiver's class (if we use the context's
+ methodClass we may exclude instance variables of the receiver).
+ Access the class of the receiver via the mirror primitive to avoid issues with proxies."
+
+ ^thisContext objectClass: (contextOrNil ifNil: [receiver] ifNotNil: [contextOrNil receiver])!
Item was changed:
----- Method: Compiler>>compiledMethodFor:in:to:notifying:ifFail: (in category 'public access') -----
compiledMethodFor: textOrStream in: aContext to: receiver notifying: aRequestor ifFail: failBlock
"Compiles the sourceStream into a parse tree, then generates code
into a method, and answers it. If receiver is not nil, then the text can
refer to instance variables of that receiver (the Inspector uses this).
If aContext is not nil, the text can refer to temporaries in that context
(the Debugger uses this). If aRequestor is not nil, then it will receive a
notify:at: message before the attempt to evaluate is aborted."
+ | methodNode method |
- | methodNode method theClass |
- theClass := (aContext == nil ifTrue: [receiver] ifFalse: [aContext receiver]) class.
methodNode := self
compileNoPattern: textOrStream
+ in: (self classForReceiver: receiver context: aContext)
- in: theClass
context: aContext
notifying: aRequestor
ifFail: [^failBlock value].
method := self interactive
ifTrue: [ methodNode generateWithTempNames ]
ifFalse: [ methodNode generate ].
^method!
Item was changed:
----- Method: Compiler>>evaluate:in:to:environment:notifying:ifFail:logged: (in category 'public access logging') -----
evaluate: textOrStream in: aContext to: receiver environment: anEnvironment notifying: aRequestor ifFail: failBlock logged: logFlag
"Same as #evaluate:in:to:notifying:ifFail:logged: but with an explicit environment"
- | theClass |
- theClass := (aContext == nil ifTrue: [receiver class] ifFalse: [aContext methodClass]).
^self
evaluateCue: (CompilationCue
source: textOrStream
context: aContext
receiver: receiver
+ class: (self classForReceiver: receiver context: aContext)
- class: theClass
environment: anEnvironment
requestor: aRequestor)
ifFail: failBlock
logged: logFlag!
Item was changed:
----- Method: Compiler>>evaluate:in:to:notifying:ifFail: (in category 'public access') -----
evaluate: textOrStream in: aContext to: receiver notifying: aRequestor ifFail: failBlock
"Compiles the sourceStream into a parse tree, then generates code into
a method. If aContext is not nil, the text can refer to temporaries in that
context (the Debugger uses this). If aRequestor is not nil, then it will receive
a notify:at: message before the attempt to evaluate is aborted. Finally, the
compiled method is invoked from here via withArgs:executeMethod:, hence
the system no longer creates Doit method litter on errors."
| theClass |
+ theClass := self classForReceiver: receiver context: aContext.
- theClass := aContext ifNil: [receiver class] ifNotNil: [:ctx | ctx methodClass].
^self
evaluateCue: (CompilationCue
source: textOrStream
context: aContext
receiver: receiver
class: theClass
environment: theClass environment
requestor: aRequestor)
ifFail: failBlock!
Item was changed:
----- Method: Compiler>>evaluate:in:to:notifying:ifFail:logged: (in category 'public access logging') -----
evaluate: textOrStream in: aContext to: receiver notifying: aRequestor ifFail: failBlock logged: logFlag
"Compiles the sourceStream into a parse tree, then generates code into
a method. If aContext is not nil, the text can refer to temporaries in that
context (the Debugger uses this). If aRequestor is not nil, then it will receive
a notify:at: message before the attempt to evaluate is aborted. Finally, the
compiled method is invoked from here via withArgs:executeMethod:, hence
the system no longer creates Doit method litter on errors."
| theClass |
+ theClass := self classForReceiver: receiver context: aContext.
- theClass := (aContext == nil ifTrue: [receiver class] ifFalse: [aContext methodClass]).
^self
evaluateCue: (CompilationCue
source: textOrStream
context: aContext
receiver: receiver
class: theClass
environment: theClass environment
requestor: aRequestor)
ifFail: failBlock
logged: logFlag!
Eliot Miranda uploaded a new version of Tools to project The Trunk:
http://source.squeak.org/trunk/Tools-eem.765.mcz
==================== Summary ====================
Name: Tools-eem.765
Author: eem
Time: 12 July 2017, 5:09:06.400984 pm
UUID: 7859773d-1bc1-4955-920b-121cac1570cd
Ancestors: Tools-pre.764
Fix bug in DictionaryInspector when browsing references but selecting an inst var of the receiver.
=============== Diff against Tools-pre.764 ===============
Item was changed:
----- Method: DictionaryInspector>>selectionReferences (in category 'menu') -----
selectionReferences
"Create a browser on all references to the association of the current selection."
+ self selectionIndex <= self numberOfFixedFields ifTrue: [^ self changed: #flash].
- self selectionIndex = 0 ifTrue: [^ self changed: #flash].
object class == MethodDictionary ifTrue: [^ self changed: #flash].
+ self systemNavigation browseAllCallsOn: (object associationAt: (keyArray at: selectionIndex - self numberOfFixedFields))!
- self systemNavigation browseAllCallsOn: (object associationAt: (keyArray at: selectionIndex - self numberOfFixedFields)).
- !
Eliot Miranda uploaded a new version of EToys to project The Trunk:
http://source.squeak.org/trunk/EToys-eem.304.mcz
==================== Summary ====================
Name: EToys-eem.304
Author: eem
Time: 12 July 2017, 10:09:25.400282 am
UUID: ae9828e4-4a18-4fb5-ad3f-027689693cfa
Ancestors: EToys-eem.303
Make allExtantPlayers robust in the presence of a newly instantiated EtoysPresenter, which is something that happens during project loading. With this change I can now load saved projects.
=============== Diff against EToys-eem.303 ===============
Item was changed:
----- Method: EtoysPresenter>>allExtantPlayers (in category 'intialize') -----
allExtantPlayers
"The initial intent here was to produce a list of Player objects associated with any Morph in the tree beneath the receiver's associatedMorph. whether it is the submorph tree or perhaps off on unseen bookPages. We have for the moment moved away from that initial intent, and in the current version we only deliver up players associated with the submorph tree only. <-- this note dates from 4/21/99
Call #flushPlayerListCache; to force recomputation."
| fullList |
playerList ifNotNil:
[^ playerList].
+ associatedMorph ifNil:
+ [^ #()].
fullList := associatedMorph allMorphs select:
[:m | m player ~~ nil] thenCollect: [:m | m player].
fullList copy do:
[:aPlayer |
aPlayer class scripts do:
[:aScript | aScript isTextuallyCoded ifFalse:
[aScript currentScriptEditor ifNotNil: [:ed |
| objectsReferredToByTiles |
objectsReferredToByTiles := ed allMorphs
select:
[:aMorph | (aMorph isKindOf: TileMorph) and: [aMorph type == #objRef]]
thenCollect:
[:aMorph | aMorph actualObject].
fullList addAll: objectsReferredToByTiles]]]].
^ playerList := fullList asSet asArray sort:
[:a :b | a externalName < b externalName]!
Eliot Miranda uploaded a new version of Morphic to project The Trunk:
http://source.squeak.org/trunk/Morphic-eem.1346.mcz
==================== Summary ====================
Name: Morphic-eem.1346
Author: eem
Time: 11 July 2017, 4:59:01.683267 pm
UUID: b8f78376-c9f0-4abe-8fd1-0edba1f3c1c4
Ancestors: Morphic-eem.1345
EToys expects MorphicProject>>exportSegmentWithChangeSet:fileName:directory:withoutInteraction: to send cleanUpReferences, but not base Squeak. So make it an optional send.
=============== Diff against Morphic-eem.1345 ===============
Item was changed:
----- Method: MorphicProject>>exportSegmentWithChangeSet:fileName:directory:withoutInteraction: (in category 'file in/out') -----
exportSegmentWithChangeSet: aChangeSetOrNil fileName: aFileName
directory: aDirectory withoutInteraction: noInteraction
"Store my project out on the disk as an *exported*
ImageSegment. All outPointers will be in a form that can be resolved
in the target image. Name it <project name>.extSeg. Whatdo we do
about subProjects, especially if they are out as local image
segments? Force them to come in?
Player classes are included automatically."
| is str ans revertSeg roots holder collector fd mgr stacks |
"Files out a changeSet first, so that a project can contain
its own classes"
world ifNil: [^ false].
world presenter ifNil: [^ false].
ScrapBook default emptyScrapBook.
+ (world respondsTo: #cleanUpReferences) ifTrue:
+ [world cleanUpReferences].
- world cleanUpReferences.
world currentHand pasteBuffer: nil. "don't write the paste buffer."
world currentHand mouseOverHandler initialize. "forget about any
references here"
"Display checkCurrentHandForObjectToPaste."
Command initialize.
world clearCommandHistory.
world fullReleaseCachedState; releaseViewers.
world cleanseStepList.
world localFlapTabs size = world flapTabs size ifFalse: [
noInteraction ifTrue: [^ false].
self error: 'Still holding onto Global flaps'].
world releaseSqueakPages.
Smalltalk at: #ScriptEditorMorph ifPresent: [:s |
s writingUniversalTiles: (self projectParameterAt: #universalTiles ifAbsent: [false])].
holder := Project allProjects. "force them in to outPointers, where
DiskProxys are made"
"Just export me, not my previous version"
revertSeg := self parameterAt: #revertToMe.
self removeParameter: #revertToMe.
roots := OrderedCollection new.
roots add: self; add: world; add: transcript; add: aChangeSetOrNil; add: thumbnail; add: world activeHand.
"; addAll: classList; addAll: (classList collect: [:cls | cls class])"
roots := roots reject: [ :x | x isNil]. "early saves may not have
active hand or thumbnail"
fd := aDirectory directoryNamed: self resourceDirectoryName.
fd assureExistence.
"Clean up resource references before writing out"
mgr := self resourceManager.
self resourceManager: nil.
ResourceCollector current: ResourceCollector new.
ResourceCollector current localDirectory: fd.
ResourceCollector current baseUrl: self resourceUrl.
ResourceCollector current initializeFrom: mgr.
ProgressNotification signal: '2:findingResources' extra:
'(collecting resources...)' translated.
"Must activate old world because this is run at #armsLength.
Otherwise references to ActiveWorld, ActiveHand, or ActiveEvent
will not be captured correctly if referenced from blocks or user code."
world becomeActiveDuring:[
is := ImageSegment copySmartRootsExport: roots asArray.
"old way was (is := ImageSegment new
copyFromRootsForExport: roots asArray)"
].
self resourceManager: mgr.
collector := ResourceCollector current.
ResourceCollector current: nil.
ProgressNotification signal: '2:foundResources' extra: ''.
is state = #tooBig ifTrue: [
collector replaceAll.
^ false].
str := ''.
"considered legal to save a project that has never been entered"
(is outPointers includes: world) ifTrue: [
str := str, '\Project''s own world is not in the segment.' translated withCRs].
str isEmpty ifFalse: [
ans := UIManager default chooseFrom: {
'Do not write file' translated.
'Write file anyway' translated.
'Debug' translated.
} title: str.
ans = 1 ifTrue: [
revertSeg ifNotNil: [projectParameters at:
#revertToMe put: revertSeg].
collector replaceAll.
^ false].
ans = 3 ifTrue: [
collector replaceAll.
self halt: 'Segment not written' translated]].
stacks := is findStacks.
is
writeForExportWithSources: aFileName
inDirectory: fd
changeSet: aChangeSetOrNil.
SecurityManager default signFile: aFileName directory: fd.
"Compress all files and update check sums"
collector forgetObsolete.
self storeResourceList: collector in: fd.
self storeHtmlPageIn: fd.
self storeManifestFileIn: fd.
self writeStackText: stacks in: fd registerIn: collector.
"local proj.005.myStack.t"
self compressFilesIn: fd to: aFileName in: aDirectory
resources: collector.
"also deletes the resource directory"
"Now update everything that we know about"
mgr updateResourcesFrom: collector.
revertSeg ifNotNil: [projectParameters at: #revertToMe put: revertSeg].
holder.
collector replaceAll.
world flapTabs do: [:ft |
(ft respondsTo: #unhibernate) ifTrue: [ft unhibernate]].
is arrayOfRoots do: [:obj |
obj isScriptEditorMorph ifTrue: [obj unhibernate]].
^ true
!
------------------------------------------------------------------------------------
<Programming> 2018 : The Art, Science, and Engineering of Programming
Mon 9 - Thu 12 April 2018 Nice, France
http://2018.programming-conference.org/
In 2017, we started a new conference and journal focused on everything
to do with programming, including the experience of programming, called
<Programming> for short. The first edition of <Programming> was a great
success (seehttp://twitter.com/programmingconffor testimonies).
Paper submissions and publications are handled by the journal. Accepted
papers must be presented at the conference.
********************************************************
CALL FOR PAPERS
********************************************************
<Programming> 2018 accept scholarly papers including essays that advance
the knowledge of programming. Almost anything about programming is in
scope, but in each case there should be a clear relevance to the act and
experience of programming.
PAPER SUBMISSIONS:
August 1 2017 (Research Papers Second Submission Deadline)
December 1 2017 (Research Papers Third Submission Deadline)
We accept submissions covering several areas of expertise. These areas
include, but are not limited to:
• General-purpose programming
• Distributed systems programming
• Parallel and multi-core programming
• Graphics and GPU programming
• Security programming
• User interface programming
• Database programming
• Visual and live programming
• Data mining and machine learning programming
• Interpreters, virtual machines and compilers
• Modularity and separation of concerns
• Model-based development
• Metaprogramming and reflection
• Testing and debugging
• Program verification
• Programming education
• Programming environments
• Social coding
********************************************************
IMPORTANT DATES
********************************************************
Research paper submissions:
August 1 2017 (Research Papers Second Submission Deadline)
December 1 2017 (Research Papers Third Submission Deadline)
Research paper first notification (for second submission deadline):
October 1 2017
Research paper final notification (for second submission deadline):
November 7 2017
Research paper first notification (for third submission deadline):
February 1 2018
Research paper final notification (for third submission deadline): March
7 2018
Workshop Proposals: October 1 2017
All important dates can also be found
athttp://programming-journal.org/timeline/
********************************************************
ORGANIZATION
********************************************************
General Chair:
Manuel Serrano, INRIA France
Local Organizing Chair:
Tamara Rezk, INRIA France
Organizing Committee:
Stefan Marr (workshops), Johannes Kepler University Linz
Jennifer B. Sartor (workshops), Software Languages Lab, Vrije
Universiteit Brussel Belgium
Philipp Haller (student research competition), KTH Royal Institute of
Technology, Sweden
Tobias Pape (web technology), HPI - University of Potsdam
Sylvia Grewe (publicity), Technische Universität Darmstadt Germany
Program Committee:
Guido Salvaneschi (program chair), Technische Universität Darmstadt, Germany
Davide Ancona, University of Genova, Italy
Alberto Bacchelli, Delft University of Technology, Netherlands
Shigeru Chiba, University of Tokyo, Japan
Yvonne Coady, University of Victoria, Canada
Susan Eisenbach, Imperial College London, UK
Patrick Eugster, TU Darmstadt, Germany and Purdue University, United States
Antonio Filieri, Imperial College London, UK
Matthew Flatt, University of Utah, United States
Lidia Fuentes, Universidad de Málaga, Spain
Richard P. Gabriel, Dream Songs, Inc. & HPI, California
Jeremy Gibbons, University of Oxford, UK
Yossi Gil, Israel Institute of Technology
Elisa Gonzalez Boix, Vrije Universiteit Brussel, Belgium
Phlipp Haller, KTH Royal Institute of Technology, Sweden
Matthew Hammer, University of Colorado, Boulder, United States
Felienne Hermans, Delft University of Technology, Netherlands
Robert Hirschfeld, Hasso Plattner Institute (HPI), Germany
Roberto Ierusalimschy, Pontifical Catholic University of Rio de Janeiro,
Brazil
Jun Kato, National Institute of Advanced Industrial Science and
Technology, Japan
Jörg Kienzle, McGill University, Canada
Neelakantan R. Krishnaswami, University of Cambridge, UK
Ralf Lämmel, University of Koblenz-Landau, Germany
Hidehiko Masuhara, Tokyo Institute of Technology, Japan
Mira Mezini, Technische Universität Darmstadt, Germany
Emerson Murphy-Hill, North Carolina State University, United States
Mario Südholt, IMT Atlantique, Nantes, France
Sam Tobin-Hochstadt, Indiana University, United States
Eelco Visser, Delft University of Technology, Netherlands
Tijs van der Storm, CWI & University of Groningen, Netherlands
********************************************************
<Programming> 2018 is kindly supported by:
ACM In-Cooperation
SIGPLAN (In-cooperation)
SIGSOFT (In-cooperation)
INRIA France
AOSA
********************************************************