The Euphoria language is a general purpose procedural language that focuses on simplicity, legibility, rapid development and performance via several means.
Developed as a personal project to invent a programming languagefrom scratch, Euphoria was created by Robert Craig on an Atari Mega-ST. Many design ideas for the language came from Craig's Master'sthesis in computer science at the University of Toronto. Craig's thesis was heavily influenced by the work of John Backus on functional programming languages. Craig ported his original Atari implementation to the 16-bit DOS platform and Euphoria was first released, version 1.0, in July 1993 under a proprietary licence. The original Atari implementation is described by Craig as "primitive" and has not been publicly released. Euphoria continued to be developed and released by Craig via his company Rapid Deployment Software and website rapideuphoria.com. In October 2006 RDS released version 3 of Euphoria and announced that henceforth Euphoria would be freely distributed under an open-source software licence. RDS continued to develop Euphoria, culminating with the release of version 3.1.1 in August, 2007. Subsequently, RDS ceased unilateral development of Euphoria and the openEuphoria Group took over ongoing development. The openEuphoria Group released version 4 in December, 2010 along with a new logo and mascot for the openEuphoria project. Version 3.1.1 remains an important milestone release, being the last version of Euphoria which supports the DOS platform. Euphoria is an acronym for End-User Programming with Hierarchical Objects for Robust Interpreted Applications although there is some suspicion that this is a backronym. The Euphoria interpreter was originally written in C. With the release of version 2.5 in November 2004 the Euphoria interpreter was split into two parts: a front-end parser, and a back-end interpreter. The front-end is now written in Euphoria. The main back-end and run time library are written in C.
Features
Euphoria was conceived and developed with the following design goals and features:
Ease of learning and with consistent high-level constructs
Implementation of flat-form 32-bit memory to avoid complex memory management and size-addressing limits
Euphoria is designed to readily facilitate handling of dynamic sets of data of varying types and is particularly useful for string and image processing. Euphoria has been used in artificial intelligence experiments, the study of mathematics, for teaching programming, and to implement fonts involving thousands of characters. A large part of the Euphoria interpreter is written in Euphoria.
Data types
Euphoria has two basic data types: Euphoria has two additional data types predefined: There is no character string data type. Strings are represented by a sequence of integer values. However, because literal strings are so commonly used in programming, Euphoria interprets double-quote enclosed characters as a sequence of integers. Thus "ABC" is seen as if the coder had written: which is the same as:
Hello, World!
puts
Examples
Program comments start with a double hyphen-- and go through the end of line. The following code looks for an old item in a group of items. If found, it removes it by concatenating all the elements before it with all the elements after it. Note that the first element in a sequence has the index one and that $ refers to the length of the sequence. global function delete_item integer pos -- Code begins -- pos = find if pos > 0 then group = group & group end if return group end function The following modification to the above example replaces an old item with a new item. As the variables old and new have been defined as objects, they could be atoms or sequences. Type checking is not needed as the function will work with any sequence of data of any type and needs no external libraries. global function replace_item integer pos -- Code begins -- pos = find if pos > 0 then group = new end if return group end function Furthermore, no pointers are involved and subscripts are automatically checked. Thus the function cannot access memory out-of-bounds. There is no need to allocate or deallocate memory explicitly and no chance of a memory leak. The line group = group & group shows some of the sequence handling facilities. A sequence may contain a set of any types, and this can be sliced and concatenated in expressions with no need for special functions.
Parameter passing
Arguments to routines are always passed by value; there is no pass-by-reference facility. However, parameters are allowed to be modified locally which is implemented very efficiently as sequences have automatic copy-on-write semantics. In other words, when you pass a sequence to a routine, initially only a reference to it is passed, but at the point the routine modifies this sequence parameter the sequence is copied and the routine updates only a copy of the original.