Open Data Types and Open Functions

Total Page:16

File Type:pdf, Size:1020Kb

Open Data Types and Open Functions Open Data Types and Open Functions Andres Loh¨ Ralf Hinze Institut fur¨ Informatik III, Universitat¨ Bonn Romerstraße¨ 164, 53117 Bonn, Germany {loeh,ralf}@informatik.uni-bonn.de Abstract Preferably, such extensions should be possible without modify- The problem of supporting the modular extensibility of both data ing the previously written code, because we want to organize differ- and functions in one programming language at the same time is ent aspects separately, and the existing code may have been written known as the expression problem. Functional languages tradi- by a different person and exist in a closed library. tionally make it easy to add new functions, but extending data Alas, Haskell natively supports only one of the two directions (adding new data constructors) requires modifying existing code. of extension. We can easily add a new function, such as We present a semantically and syntactically lightweight variant of toString :: Expr → String open data types and open functions as a solution to the expression toString (Num n) = show n problem in the Haskell language. Constructors of open data types and equations of open functions may appear scattered throughout but we cannot grow our language of expressions: in Haskell, all a program with several modules. The intended semantics is as fol- constructors of the Expr data type must be defined the very moment lows: the program should behave as if the data types and functions when Expr is introduced. We therefore cannot add new constructors were closed, defined in one place. The order of function equations to the Expr data type without touching the original definition. is determined by best-fit pattern matching, where a specific pattern The above problem of supporting the modular extensibility of takes precedence over an unspecific one. We show that our solution both data and functions in one programming language at the same is applicable to the expression problem, generic programming, and time has been formulated by Wadler [1] and is called the expression exceptions. We sketch two implementations: a direct implementa- problem. As we have just witnessed, functional languages make it tion of the semantics, and a scheme based on mutually recursive easy to add new functions, but extending data (adding new data modules that permits separate compilation. constructors) requires modifying existing code. In object-oriented languages, extension of data is directly supported by defining new Categories and Subject Descriptors Programming Lan- D.3.3 [ classes, but adding new functions to work on that data requires guages ]: Language Constructs and Features changing the class definitions. Using the Visitor design pattern, one General Terms Languages, Design can simulate the situation of functional programming in an object- oriented language: one gains extensibility for functions, but loses Keywords expression problem, extensible data types, extensible extensibility of data at the same time. functions, functional programming, Haskell, generic programming, Many partial and proper solutions to the expression problem extensible exceptions, mutually recursive modules have been proposed over the years. However, much of this work 1. Introduction suffers from one or more of the following disadvantages: • Suppose we have a very simple language of expressions, which It is focused on object-oriented programming, and cannot di- consists only of integer constants: rectly be translated to a functional language. • data Expr = Num Int It introduces rather complex extensions to the type system, such as multi-methods [2, 3] or mixins [4]. We intend to grow the language, and add new features as the need • Open entities have their own special syntax or severe limi- for them arises. Here is an interpreter for expressions: tations, thereby forcing a programmer to decide in advance eval :: Expr → Int whether an entity should be open or not, because there is no eval (Num n) = n easy way to switch later. There are two possible directions to extend the program: first, we Closest to our proposal is the work of Millstein et al. [3], who de- can add new functions, such as a conversion function from expres- scribe the addition of hierarchical classes and extensible functions sions to strings; second, we can add new forms of expressions by to ML. A discussion of this and other related work can be found in adding new constructors. Section 6. In this paper, we present a semantically and syntactically lightweight variant of open data types and open functions as a solution to the expression problem in the functional programming Permission to make digital or hard copies of all or part of this work for personal or language Haskell. By declaring Expr (from the example above) as classroom use is granted without fee provided that copies are not made or distributed an open data type, we can add new constructors at any time and at for profit or commercial advantage and that copies bear this notice and the full citation on the first page. To copy otherwise, to republish, to post on servers or to redistribute any point in the program. If we want to evaluate or print the newly to lists, requires prior specific permission and/or a fee. introduced expression forms, we have to adapt eval and toString. PPDP’06 July 10–12, 2006, Venice, Italy. If these functions are declared as open functions, we can add new Copyright c 2006 ACM 1-59593-388-3/06/0007. $5.00. defining equations for the functions at a later point in the program. open eval :: Expr → Int The intended semantics is as follows: the program should behave as if the data types and functions were closed, defined in one place. Note that only top-level functions can be marked as open. The The main design goal of our proposal is simplicity: open data defining equations for an open function can be provided at any types and open functions are easy to add to the language, and their point of the program where the name of the function is in scope, semantics is simple to explain as a source-to-source transformation. using the normal syntax for function definitions: In particular, the type system and the operational semantics of eval (Num n) = n the original language are unaffected by the addition. Interestingly, we can implement our proposal in such a way that it supports If we leave it at that, we have a program consisting of an Expr separate compilation: we employ Haskell’s support for mutually data type with only one constructor, and an eval function consisting recursive modules to tie the recursive knot of open functions (see of only one equation, just like in the introduction. Section 5.2). In addition to the expression problem, we present two other ap- 2.3 The expression problem plications of open data types and open functions: generic program- Open data types and open functions support both directions of ming and extensible exceptions. extension. A new function can be added as usual, except that we The rest of the paper is structured as follows: In Section 2, also mark it as open: we present the syntax and informal semantics of open data types and open functions. We use the expression problem as a running open toString :: Expr → String example and show how it is solved using the new features. We then toString (Num n) = show n look at other applications (Section 3). A formal semantics is given It is now easy to add a new constructor for Expr. All we have to do in Section 4. We investigate possible implementations in Section 5. is provide its type signature: We then discuss related work (Section 6), before we conclude in Section 7. Plus :: Expr → Expr → Expr Of course, if we do not adapt eval and toString and call it on 2. Open data types and open functions expressions constructed with Plus, we get a pattern match failure. In this section, we describe how to declare open data types and open However, since eval and toString are open functions, we can just functions, and how to add new constructors to open data types and provide the missing equations: new equations to open functions. We also explain the semantics of eval (Plus e e ) = eval e + eval e these constructs, and we discuss the problem of pattern matching 1 2 1 2 for open functions. toString (Plus e1 e2) = "(" ++ toString e1 ++ "+" We strive for a simple and pragmatic solution to the problem ++ toString e2 ++ ")" of open data types. Therefore, we draw inspiration from a well- Note that we have extended our program without modifying exist- known and widely used Haskell feature that is extensible: type ing code. classes. Instances for type classes can be defined at any point in the program, but type classes also have a number of restrictions 2.4 Semantics that make this possible: Type classes have a global, program-wide meaning. Type class and instance declarations may only appear at Let us now turn to the semantics of open data types and open the top level of a module. All instances are valid for the entire functions. The driving goal of our proposal is to be as simple program, and instance declarations cannot be hidden. as possible: a program should behave as if all open data types We use a similar approach for open data types and functions: and open functions were closed, defined in one place. Apart from they have a global, program-wide meaning. Open entities can only the syntactic peculiarity that they are defined in several places, be defined and extended at the top level of a module. All construc- open data types and open functions define ordinary data types and tors and function equations are valid for the entire program, and functions.
Recommended publications
  • Structuring Languages As Object-Oriented Libraries
    Structuring Languages as Object-Oriented Libraries Structuring Languages as Object-Oriented Libraries ACADEMISCH PROEFSCHRIFT ter verkrijging van de graad van doctor aan de Universiteit van Amsterdam op gezag van de Rector Magnificus prof. dr. ir. K. I. J. Maex ten overstaan van een door het College voor Promoties ingestelde commissie, in het openbaar te verdedigen in de Agnietenkapel op donderdag november , te . uur door Pablo Antonio Inostroza Valdera geboren te Concepción, Chili Promotiecommissie Promotores: Prof. Dr. P. Klint Universiteit van Amsterdam Prof. Dr. T. van der Storm Rijksuniversiteit Groningen Overige leden: Prof. Dr. J.A. Bergstra Universiteit van Amsterdam Prof. Dr. B. Combemale University of Toulouse Dr. C. Grelck Universiteit van Amsterdam Prof. Dr. P.D. Mosses Swansea University Dr. B.C.d.S. Oliveira The University of Hong Kong Prof. Dr. M. de Rijke Universiteit van Amsterdam Faculteit der Natuurwetenschappen, Wiskunde en Informatica The work in this thesis has been carried out at Centrum Wiskunde & Informatica (CWI) under the auspices of the research school IPA (Institute for Programming research and Algorith- mics) and has been supported by NWO, in the context of Jacquard Project .. “Next Generation Auditing: Data-Assurance as a Service”. Contents Introduction .Language Libraries . .Object Algebras . .Language Libraries with Object Algebras . .Origins of the Chapters . .Software Artifacts . .Dissertation Structure . Recaf: Java Dialects as Libraries .Introduction . .Overview.................................... .Statement Virtualization . .Full Virtualization . .Implementation of Recaf . .Case Studies . .Discussion . .Related Work . .Conclusion . Tracing Program Transformations with String Origins .Introduction . .String Origins . .Applications of String Origins . .Implementation . .Related Work . .Conclusion . Modular Interpreters with Implicit Context Propagation .Introduction . .Background . v Contents .Implicit Context Propagation .
    [Show full text]
  • Composable Compilers: Evolution Toward a Practical Reality
    COMPOSABLE COMPILERS: EVOLUTION TOWARD A PRACTICAL REALITY A Dissertation Presented to the Faculty of the Graduate School of Cornell University in Partial Fulfillment of the Requirements for the Degree of Doctor of Philosophy by Chinawat Isradisaikul August 2017 c 2017 Chinawat Isradisaikul COMPOSABLE COMPILERS: EVOLUTION TOWARD A PRACTICAL REALITY Chinawat Isradisaikul, Ph.D. Cornell University 2017 The ability to add new features to programming languages is essential for language design experimentation and domain-specific developments, but implementing and maintaining small language extensions in traditional compilers remain a challenge. General-purpose programming languages do not have desired mechanisms to integrate small, indepen- dently developed extensions into a working programming language. At the same time, domain-specific languages that support such integration struggle to gain popularity in the programming language community. More language mechanisms and tools are needed as a middle ground so that a broader range of programmers can implement, maintain, and combine compilers for individual language features more easily. At the heart of compiler construction, new design patterns are proposed to allow compilers to be extended in a modular way and to be merged with little effort. These design patterns, implementable in a mainstream programming language, encode dynamic relationships between node types in abstract syntax trees (ASTs) so that inheritance in object-oriented programming still works over the course of language evolution. A new AST representation lets a single AST be viewed as different programs for different languages. Compiler passes are language-neutral, making translations reusable and composable. At the front end, engineering language syntax can be a painstaking process, espe- cially when individual language syntaxes start to interact.
    [Show full text]
  • A History of Clojure
    A History of Clojure RICH HICKEY, Cognitect, Inc., USA Shepherd: Mira Mezini, Technische Universität Darmstadt, Germany Clojure was designed to be a general-purpose, practical functional language, suitable for use by professionals wherever its host language, e.g., Java, would be. Initially designed in 2005 and released in 2007, Clojure is a dialect of Lisp, but is not a direct descendant of any prior Lisp. It complements programming with pure functions of immutable data with concurrency-safe state management constructs that support writing correct multithreaded programs without the complexity of mutex locks. Clojure is intentionally hosted, in that it compiles to and runs on the runtime of another language, such as the JVM. This is more than an implementation strategy; numerous features ensure that programs written in Clojure can leverage and interoperate with the libraries of the host language directly and efficiently. In spite of combining two (at the time) rather unpopular ideas, functional programming and Lisp, Clojure has since seen adoption in industries as diverse as finance, climate science, retail, databases, analytics, publishing, healthcare, advertising and genomics, and by consultancies and startups worldwide, much to the career-altering surprise of its author. Most of the ideas in Clojure were not novel, but their combination puts Clojure in a unique spot in language design (functional, hosted, Lisp). This paper recounts the motivation behind the initial development of Clojure and the rationale for various design decisions and language constructs. It then covers its evolution subsequent to release and adoption. CCS Concepts: • Software and its engineering ! General programming languages; • Social and pro- fessional topics ! History of programming languages.
    [Show full text]
  • Good Advice for Type-Directed Programming
    Good Advice for Type-directed Programming Aspect-oriented Programming and Extensible Generic Functions Geoffrey Washburn Stephanie Weirich University of Pennsylvania {geoffw,sweirich}@cis.upenn.edu ABSTRACT of type-directed combinators to “scrap” this boilerplate. For Type-directed programming is an important idiom for soft- example, L¨ammeland Peyton Jones’s Haskell library pro- ware design. In type-directed programming the behavior of vides a combinator called gmapQ that maps a query over programs is guided by the type structure of data. It makes an arbitrary value’s children returning a list of the results. it possible to implement many sorts of operations, such as Using gmapQ it becomes trivial to implement a type-directed serialization, traversals, and queries, only once and without function, gsize, to compute the size of an arbitrary value. needing to continually revise their implementation as new gsize :: Data a => a -> Int data types are defined. gsize x = 1 + sum (gmapQ gsize x) Type-directed programming is the basis for recent research into “scrapping” tedious boilerplate code that arises in func- However, this line of research focused on closed type- tional programming with algebraic data types. This research directed functions. Closed type-directed functions require has primarily focused on writing type-directed functions that that all cases be defined in advance. Consequently, if the are closed to extension. However, L¨ammel and Peyton Jones programmer wanted gsize to behave in a specialized fashion recently developed a technique for writing openly extensible for one of their data types, they would need to edit the type-directed functions in Haskell by making clever use of definition of gmapQ.
    [Show full text]
  • Functional Programming Patterns in Scala and Clojure Write Lean Programs for the JVM
    Early Praise for Functional Programming Patterns This book is an absolute gem and should be required reading for anybody looking to transition from OO to FP. It is an extremely well-built safety rope for those crossing the bridge between two very different worlds. Consider this mandatory reading. ➤ Colin Yates, technical team leader at QFI Consulting, LLP This book sticks to the meat and potatoes of what functional programming can do for the object-oriented JVM programmer. The functional patterns are sectioned in the back of the book separate from the functional replacements of the object-oriented patterns, making the book handy reference material. As a Scala programmer, I even picked up some new tricks along the read. ➤ Justin James, developer with Full Stack Apps This book is good for those who have dabbled a bit in Clojure or Scala but are not really comfortable with it; the ideal audience is seasoned OO programmers looking to adopt a functional style, as it gives those programmers a guide for transitioning away from the patterns they are comfortable with. ➤ Rod Hilton, Java developer and PhD candidate at the University of Colorado Functional Programming Patterns in Scala and Clojure Write Lean Programs for the JVM Michael Bevilacqua-Linn The Pragmatic Bookshelf Dallas, Texas • Raleigh, North Carolina Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks. Where those designations appear in this book, and The Pragmatic Programmers, LLC was aware of a trademark claim, the designations have been printed in initial capital letters or in all capitals.
    [Show full text]
  • Extensibility for the Masses Practical Extensibility with Object Algebras
    Extensibility for the Masses Practical Extensibility with Object Algebras Bruno C. d. S. Oliveira1 and William R. Cook2 1 Seoul National University [email protected] 2 University of Texas, Austin [email protected] Abstract. This paper presents a new solution to the expression problem (EP) that works in OO languages with simple generics (including Java or C#). A key novelty of this solution is that advanced typing features, including F-bounded quantification, wildcards and variance annotations, are not needed. The solution is based on object algebras, which are an abstraction closely related to algebraic datatypes and Church encodings. Object algebras also have much in common with the traditional forms of the Visitor pattern, but without many of its drawbacks: they are extensible, remove the need for accept methods, and do not compromise encapsulation. We show applications of object algebras that go beyond toy examples usually presented in solutions for the expression problem. In the paper we develop an increasingly more complex set of features for a mini-imperative language, and we discuss a real-world application of object algebras in an implementation of remote batches. We believe that object algebras bring extensibility to the masses: object algebras work in mainstream OO languages, and they significantly reduce the conceptual overhead by using only features that are used by everyday programmers. 1 Introduction The “expression problem” (EP) [37,10,45] is now a classical problem in program- ming languages. It refers to the difficulty of writing data abstractions that can be easily extended with both new operations and new data variants.
    [Show full text]
  • The Joy of Clojure by Michael Fogus and Chris Houser
    Michael Fogus Chris Houser FOREWORD BY STEVE YEGGE MANNING The Joy of Clojure by Michael Fogus and Chris Houser Chapter 1 Copyright 2011 Manning Publications brief contents PART 1 FOUNDATIONS ......................................................................1 1 ■ Clojure philosophy 3 2 ■ Drinking from the Clojure firehose 20 3 ■ Dipping our toes in the pool 43 PART 2 DATA TYPES ........................................................................59 4 ■ On scalars 61 5 ■ Composite data types 76 PART 3 FUNCTIONAL PROGRAMMING............................................. 105 6 ■ Being lazy and set in your ways 107 7 ■ Functional programming 125 PART 4 LARGE-SCALE DESIGN ........................................................ 155 8 ■ Macros 157 9 ■ Combining data and code 177 10 ■ Java.next 207 11 ■ Mutation 234 PART 5 TANGENTIAL CONSIDERATIONS.......................................... 275 12 ■ Performance 277 13 ■ Clojure changes the way you think 292 vii Clojure philosophy This chapter covers The Clojure way Why a(nother) Lisp? Functional programming Why Clojure isn’t especially object-oriented Learning a new language generally requires significant investment of thought and effort, and it is only fair that programmers expect each language they consider learning to justify that investment. Clojure was born out of creator Rich Hickey’s desire to avoid many of the complications, both inherent and incidental, of manag- ing state using traditional object-oriented techniques. Thanks to a thoughtful design based in rigorous programming language research, coupled with a fervent look toward practicality, Clojure has blossomed into an important programming language playing an undeniably important role in the current state of the art in lan- guage design. On one side of the equation, Clojure utilizes Software Transactional Memory (STM), agents, a clear distinction between identity and value types, arbi- trary polymorphism, and functional programming to provide an environment con- ducive to making sense of state in general, and especially in the face of concurrency.
    [Show full text]
  • CS 251: Programming Languages Fall 2015 Ruby/OOP Summary, Part 2
    CS 251: Programming Languages Fall 2015 Ruby/OOP Summary, Part 2 These notes are adapted from CSE 341 at the University of Washington, by Dan Grossman. Contents OOP Versus Functional Decomposition ................................ 1 Extending the Code With New Operations or Variants ...................... 4 Binary Methods With Functional Decomposition .......................... 6 Binary Methods in OOP: Double Dispatch .............................. 7 Multimethods ................................................ 11 Multiple Inheritance ............................................ 11 Mixins ..................................................... 13 Java/C#-Style Interfaces ......................................... 16 Abstract Methods .............................................. 16 Introduction to Subtyping ........................................ 17 A Made-Up Language of Records .................................... 18 Wanting Subtyping ............................................. 19 The Subtyping Relation .......................................... 19 Depth Subtyping: A Bad Idea With Mutation ........................... 20 The Problem With Java/C# Array Subtyping ........................... 21 Function Subtyping ............................................. 22 Subtyping for OOP ............................................. 25 Covariant self/this ............................................. 26 Generics Versus Subtyping ........................................ 26 Bounded Polymorphism .......................................... 29 Optional:
    [Show full text]
  • Feature-Oriented Programming with Object Algebras
    View metadata, citation and similar papers at core.ac.uk brought to you by CORE provided by CWI's Institutional Repository Feature-Oriented Programming with Object Algebras Bruno C.d.S. Oliveira1, Tijs van der Storm2, Alex Loh3, William R. Cook3 1National University of Singapore ([email protected]) 2Centrum Wiskunde & Informatica (CWI) ([email protected]) 3 University of Texas, Austin ({wcook,alexloh}@cs.utexas.edu) Abstract. Object algebras are a new programming technique that en- ables a simple solution to basic extensibility and modularity issues in programming languages. While object algebras excel at defining modu- lar features, the composition mechanisms for object algebras (and fea- tures) are still cumbersome and limited in expressiveness. In this paper we leverage two well-studied type system features, intersection types and type-constructor polymorphism, to provide object algebras with expres- sive and practical composition mechanisms. Intersection types are used for defining expressive run-time composition operators (combinators) that produce objects with multiple (feature) interfaces. Type-constructor polymorphism enables generic interfaces for the various object algebra combinators. Such generic interfaces can be used as a type-safe front end for a generic implementation of the combinators based on reflection. Ad- ditionally, we also provide a modular mechanism to allow different forms of self -references in the presence of delegation-based combinators. The result is an expressive, type-safe, dynamic, delegation-based composition technique for object algebras, implemented in Scala, which effectively enables a form of Feature-Oriented Programming using object algebras. 1 Introduction Feature-oriented programming (FOP) is a vision of programming in which in- dividual features can be defined separately and then composed to build a wide variety of particular products [5,21,43].
    [Show full text]
  • Clojerl: the Expressive Power of Clojure on the BEAM
    Clojerl: The Expressive Power of Clojure on the BEAM Juan Facorro Natalia Chechina Stockholm, Sweden Bournemouth University [email protected] Bournemouth, United Kindgdom [email protected] Abstract 1 Introduction The development of new features and approaches in pro- In the past couple of decades platforms built around virtual gramming languages is a continuous and never-ending task, machines and language engines, such as the Java Virtual as languages are ultimately tools for expressing and solving Machine (JVM), the Erlang VM (BEAM), .NET’s Common problems. The past decade has seen a surge in languages Language Runtime (CLR), and Javascript’s V8 Engine, have implemented for the BEAM as part of a search to combine grown and matured into ecosystems of tools and libraries. the fault-tolerance and scalability of the BEAM with a set of These platforms have also enabled and encouraged the imple- desired language features. mentation of programming languages other than the official In this paper we present Clojerl, an implementation of the group supported by each platform. As a result, people look- Clojure language with a rich set of data processing capabil- ing to take the best from the two worlds, combining their ities and the expressive power of Lisp for the BEAM. The language of choice with the power of a specific platform, main design principles of Clojerl are to provide (1) seam- have created new language implementations. less interoperability with the BEAM to enable frictionless A programming language is ultimately just a tool for solv- interaction with other BEAM languages and (2) portability ing problems.
    [Show full text]
  • Reliably Composable Language Extensions
    View metadata, citation and similar papers at core.ac.uk brought to you by CORE provided by University of Minnesota Digital Conservancy Reliably composable language extensions A Dissertation SUBMITTED TO THE FACULTY OF THE UNIVERSITY OF MINNESOTA BY Ted Kaminski IN PARTIAL FULFILLMENT OF THE REQUIREMENTS FOR THE DEGREE OF DOCTOR OF PHILOSOPHY Eric Van Wyk May, 2017 Copyright © 2017 Ted Kaminski. Acknowledgments I am unlikely to do justice to everyone I should thank here. I should begin by thanking my advisor, Eric Van Wyk, who has been a been a better mentor than I had even expected going in, and I had pretty optimistic expectations. I would also like to thank my thesis committee members: Gopalan Nadathur, Mike Whalen, and Tim Hunter. All of them helped provide valuable feedback in polishing this thesis. I also want to thank my ex-committee member, Wayne Richter, who retired before I finished this thing off. I’d like to thank other students in this department, without whom grad school would hardly have been as excellent as it was: Nate Bird, Morten Warncke-Wang, Aaron Halfaker, Michael Ekstrand, Sarah McRoberts, Andy Exley, Hannah Miller, Sean Landman, Dane Coffey, Fedor Korsakov, and you know, tag yourselves. Sorry Reid. I’d also like to thank the colleagues I’ve had a chance to talk shop with, especially Tony Sloane and Jurgen Vinju. I’d like to thank math friends, Shelley Kandola and Maggie Ewing, who provided some welcome diversions into things that aren’t a part of this thesis, unfortunately. As for Minneapolis in general, best place on Earth, there are too many people to name, but Eli Cizewski-Robinson must appear here.
    [Show full text]
  • Typed First-Class Traits
    Typed First-Class Traits Xuan Bi The University of Hong Kong, Hong Kong, China [email protected] Bruno C. d. S. Oliveira The University of Hong Kong, Hong Kong, China [email protected] Abstract Many dynamically-typed languages (including JavaScript, Ruby, Python or Racket) support first-class classes, or related concepts such as first-class traits and/or mixins. In those languages classes are first-class values and, like any other values, they can be passed as an argument, or returned from a function. Furthermore first-class classes support dynamic inheritance: i.e. they can inherit from other classes at runtime, enabling programmers to abstract over the inheritance hierarchy. In contrast, type system limitations prevent most statically-typed languages from having first-class classes and dynamic inheritance. This paper shows the design of SEDEL: a polymorphic statically-typed language with first- class traits, supporting dynamic inheritance as well as conventional OO features such as dynamic dispatching and abstract methods. To address the challenges of type-checking first-class traits, SEDEL employs a type system based on the recent work on disjoint intersection types and dis- joint polymorphism. The novelty of SEDEL over core disjoint intersection calculi are source level features for practical OO programming, including first-class traits with dynamic inherit- ance, dynamic dispatching and abstract methods. Inspired by Cook and Palsberg’s work on the denotational semantics for inheritance, we show how to design a source language that can be elaborated into Alpuim et al.’s Fi (a core polymorphic calculus with records supporting disjoint polymorphism). We illustrate the applicability of SEDEL with several example uses for first- class traits, and a case study that modularizes programming language interpreters using a highly modular form of visitors.
    [Show full text]