HOME

TheInfoList



OR:

Refal ("Recursive functions algorithmic language"; russian: РЕФАЛ) "is a functional
programming language A programming language is a system of notation for writing computer programs. Most programming languages are text-based formal languages, but they may also be graphical. They are a kind of computer language. The description of a programming ...
oriented toward symbolic computations", including " string processing,
language translation Translation is the communication of the meaning of a source-language text by means of an equivalent target-language text. The English language draws a terminological distinction (which does not exist in every language) between ''transl ...
, nd
artificial intelligence Artificial intelligence (AI) is intelligence—perceiving, synthesizing, and inferring information—demonstrated by machines, as opposed to intelligence displayed by animals and humans. Example tasks in which this is done include speech r ...
". It is one of the oldest members of this family, first conceived of in 1966 as a theoretical tool, with the first implementation appearing in 1968. Refal was intended to combine mathematical simplicity with practicality for writing large and sophisticated programs. One of the first functional programming languages to do so, and unlike
Lisp A lisp is a speech impairment in which a person misarticulates sibilants (, , , , , , , ). These misarticulations often result in unclear speech. Types * A frontal lisp occurs when the tongue is placed anterior to the target. Interdental lispin ...
of its time, Refal is based on
pattern matching In computer science, pattern matching is the act of checking a given sequence of tokens for the presence of the constituents of some pattern. In contrast to pattern recognition, the match usually has to be exact: "either it will or will not be ...
. Its pattern matching works in conjunction with
term rewriting In mathematics, computer science, and logic, rewriting covers a wide range of methods of replacing subterms of a formula with other terms. Such methods may be achieved by rewriting systems (also known as rewrite systems, rewrite engines, or reduc ...
. The basic
data structure In computer science, a data structure is a data organization, management, and storage format that is usually chosen for efficient access to data. More precisely, a data structure is a collection of data values, the relationships among them, a ...
of Lisp and
Prolog Prolog is a logic programming language associated with artificial intelligence and computational linguistics. Prolog has its roots in first-order logic, a formal logic, and unlike many other programming languages, Prolog is intended primarily ...
is a linear list built by cons operation in a sequential manner, thus with ''O(n)'' access to list's ''n''th element. Refal's lists are built and scanned from both ends, with pattern matching working for nested lists as well as the top-level one. In effect, the basic data structure of Refal is a
tree In botany, a tree is a perennial plant with an elongated stem, or trunk, usually supporting branches and leaves. In some usages, the definition of a tree may be narrower, including only woody plants with secondary growth, plants that ar ...
rather than a
list A ''list'' is any set of items in a row. List or lists may also refer to: People * List (surname) Organizations * List College, an undergraduate division of the Jewish Theological Seminary of America * SC Germania List, German rugby union ...
. This gives freedom and convenience in creating data structures while using only mathematically simple control mechanisms of pattern matching and substitution. Refal also includes a feature called the ''freezer'' to support efficient partial evaluation. Refal can be applied to the processing and transformation of tree structures, similarly to
XSLT XSLT (Extensible Stylesheet Language Transformations) is a language originally designed for transforming XML documents into other XML documents, or other formats such as HTML for web pages, plain text or XSL Formatting Objects, which may subsequ ...
.


Basics

A Refal Hello World example is shown below. $ENTRY Go Hello The program above includes two functions named Go and Hello. A function is written as the name of the function followed by the function body in curly braces. The Go function is marked as the entry point of the program using the $ENTRY directive. One could think of expressions in the function bodies as function "calls" in
Lisp A lisp is a speech impairment in which a person misarticulates sibilants (, , , , , , , ). These misarticulations often result in unclear speech. Types * A frontal lisp occurs when the tongue is placed anterior to the target. Interdental lispin ...
-like syntax. For example, the Hello function appears to call the built-in Prout function with the string 'Hello world' as the argument. The meaning and the mechanism of the call, however, is quite different. To illustrate the difference, consider the following function that determines whether a string is a
palindrome A palindrome is a word, number, phrase, or other sequence of symbols that reads the same backwards as forwards, such as the words ''madam'' or ''racecar'', the date and time ''11/11/11 11:11,'' and the sentence: "A man, a plan, a canal – Panam ...
. Pal This example shows a function with a more complex body, consisting of four ''sentences'' (clauses). A sentence begins with a ''pattern'' followed by an equal sign followed by a general ''expression'' on the right hand side. A sentence is terminated with a semicolon. For example, the pattern of the second sentence of the function is "s.1" and the expression is "True". As the example shows, patterns include ''pattern variables'' that have the form of a character identifying the type of the variable (what the variable matches) followed by the variable identifier. The variables that begin with an "s" match a single symbol, those that begin with an "e" match an arbitrary expression. The variable identifier can be an arbitrary alphanumeric sequence optionally separated from the type identifier by a dot. A function executes by comparing its argument with the patterns of its sentences in the order they appear in the definition, until the first pattern that matches. The function then replaces the argument with the expression on the right hand side of the matched sentence. If the result of a function application includes a subexpression in angle brackets (as it will after the third sentence of our example is applied), the result is further processed by Refal by invoking the function identified by the first symbol in the brackets. Execution stops when the result has no more angle brackets to expand in this way. The function Pal can thus be read informally as: "If the expression is empty, replace it with True. Otherwise if the expression is a single symbol, replace it with True. Otherwise if the expression is a symbol followed by an arbitrary expression e.2 followed by the same symbol, replace it with the expression . (In other words, throw away the two identical symbols at the beginning and the end and recurse). Otherwise replace the expression with False. (The pattern e.1 always matches)." The following are three step-by-step execution traces annotated with the sentence numbers applied at each step to produce the next (#3) (#3) (#1) True (#3) (#2) True (#3) (#3) (#3) (#4) False We can now see that the Hello World example in fact executes as the sequence of the following expression transformations: Seed the machine with the initial expression marked by $ENTRY: (apply the sentence in Go) (apply the sentence in Hello) (Prout is a built-in that prints and expands to nothing) (nothing to apply; stop)


Other examples


Factorial

Fact Here 0 matches 0 the number and produces 1. On any other symbol which is a number, multiply it with the result of (Fact (- s.N 1)) Note the prefix style of operators.


Factorial with loops

Fact ; Loop As can be seen s.n acts as the loop counter.


Equality

Equal Here the function is defined as, if given two terms, and the terms are same then the first clause matches and produces True. else the second clause matches and produces False. An important property of Refal is that all functions in refal are single argument. (But may be decomposed into terms in an expression as above.)


If

Defining control structures is easy If Here the e1 is evaluated only when the expression entered matches 'True' Then e1 Else e2 the same for e2.


Squeeze blanks

Squeeze (Using '_' in place of space char so as to make the function call clear.) The first clause matches whenever the function Squeeze encounters double blanks in its input expression, and replaces it with a single blank. The second clause matches only when the first one did not, and returns the resultant value which is the current expression.


Squeeze using explicit looping

Squeeze ;


References

*


External links


Refal homepage
{{Authority control Programming languages Pattern matching programming languages Functional languages Term-rewriting programming languages Homoiconic programming languages