Escher is a declarative, general-purpose programming language which integrates the best features of both functional and logic programming languages. It has types and modules, higher-order and meta-programming facilities, and declarative input/output. Escher also has a collection of system modules, providing numerous operations on standard data types such as integers, lists, characters, strings, sets, and programs. The main design aim is to combine in a practical and comprehensive way the best ideas of existing functional and logic languages, such as Godel, Haskell, and $\lambda$Prolog. Indeed, Escher goes well beyond Godel in its ability to allow function definitions, its higher-order facilities, its improved handling of sets, and its declarative input/output. Escher also goes well beyond Haskell in its ability to run partly-instantiated predicate calls, a familiar feature of logic programming languages which provides a form of non-determinism, and its more flexible handling of equality. The language also has a clean semantics, its underlying logic being (an extension of) Church's simple theory of types. This report is divided into two parts. The first part provides a tutorial introduction to Escher. In this part there are many example programs to illustrate the various language features. In particular, these example programs are meant to emphasize the significant practical advantages that come from integrating the best features of existing functional and logic languages. The second part contains a formal definition of the Escher language, including its syntax, semantics, and a description of its system modules. To make the report self-contained, an appendix summarizes the key aspects of the simple theory of types.