100% found this document useful (5 votes)
22 views

Immediate download Programming with Miranda Chris Clack ebooks 2024

Programming

Uploaded by

zeollavassos
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (5 votes)
22 views

Immediate download Programming with Miranda Chris Clack ebooks 2024

Programming

Uploaded by

zeollavassos
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 61

Download Full ebookname - Read Now at ebookname.

com

Programming with Miranda Chris Clack

https://ebookname.com/product/programming-with-miranda-
chris-clack/

OR CLICK BUTTON

DOWLOAD EBOOK

Discover More Ebook - Explore Now at ebookname.com


Instant digital products (PDF, ePub, MOBI) available
Download now and explore formats that suit you...

Composing music with computers 1st ed Edition Eduardo


Miranda

https://ebookname.com/product/composing-music-with-computers-1st-ed-
edition-eduardo-miranda/

ebookname.com

Professional Heroku Programming 1st Edition Chris Kemp

https://ebookname.com/product/professional-heroku-programming-1st-
edition-chris-kemp/

ebookname.com

ASP NET 3 5 Website Programming Chris Love

https://ebookname.com/product/asp-net-3-5-website-programming-chris-
love/

ebookname.com

Orogenic Processes in the Alpine Collision Zone 1st


Edition Nikolaus Froitzheim

https://ebookname.com/product/orogenic-processes-in-the-alpine-
collision-zone-1st-edition-nikolaus-froitzheim/

ebookname.com
Companion guide to the ASME boiler pressure vessel code
Volume 3 criteria and commentary on select aspects of the
Boiler pressure vessel and piping codes 3rd Edition K. R.
Rao
https://ebookname.com/product/companion-guide-to-the-asme-boiler-
pressure-vessel-code-volume-3-criteria-and-commentary-on-select-
aspects-of-the-boiler-pressure-vessel-and-piping-codes-3rd-edition-k-
r-rao/
ebookname.com

Current Treatments of Obsessive Compulsive Disorder


Clinical Practice 2 Sub Edition Michele Tortora Pato

https://ebookname.com/product/current-treatments-of-obsessive-
compulsive-disorder-clinical-practice-2-sub-edition-michele-tortora-
pato/
ebookname.com

Architecture and its Ethical Dilemmas Nicholas Ray

https://ebookname.com/product/architecture-and-its-ethical-dilemmas-
nicholas-ray/

ebookname.com

Basic science for the MRCS a revision guide for surgical


trainees 2nd Edition Andrew T Raftery

https://ebookname.com/product/basic-science-for-the-mrcs-a-revision-
guide-for-surgical-trainees-2nd-edition-andrew-t-raftery/

ebookname.com

Ocular Anatomy and Physiology Second Edition Al Lens

https://ebookname.com/product/ocular-anatomy-and-physiology-second-
edition-al-lens/

ebookname.com
Applied cloud deep semantic recognition advanced anomaly
detection 1st Edition Rad

https://ebookname.com/product/applied-cloud-deep-semantic-recognition-
advanced-anomaly-detection-1st-edition-rad/

ebookname.com
Programming with Miranda

Chris Clack, Colin Myers and Ellen Poon

August 29, 2011


Contents

Preface ix

Introduction 1

1 Operators, Identifiers and Types 7


1.1 A Miranda session 7
1.2 Identifiers 11
1.3 Types 13
1.4 Tuples 25
1.5 Properties of operators 27
1.6 Programs, layout and comments 30
1.7 Summary 32

2 Functions 34
2.1 Simple functions 35
2.2 Functions as values 40
2.3 Function parameters and results 41
2.4 Polymorphic functions 43
2.5 Pattern matching 45
2.6 Type information 51
2.7 Simple recursive functions 54
2.8 Who needs assignment? 57
2.9 Error messages 59
2.10 Programming with functions 61
2.11 Summary 63

v
vi Contents

3 Lists 65
3.1 The list aggregate type 65
3.2 Built-in operations on lists 69
3.3 Lists and other aggregate types 76
3.4 Simple functions using lists 77
3.5 Recursive functions using lists 78
3.6 Polymorphic recursive functions on lists 81
3.7 Thinking about lists 83
3.8 Modes of recursion 93
3.9 Extended example—grep 97
3.10 Summary 108

4 Curried and Higher Order Functions 109


4.1 Currying 109
4.2 Simple higher order functions 113
4.3 Higher order functions on lists 119
4.4 Program design with higher order functions 131
4.5 Summary 135

5 Environments and Evaluation 137


5.1 Environments 138
5.2 Block structure: where expressions 142
5.3 List comprehensions 149
5.4 Lazy evaluation 153
5.5 Summary 163

6 User-defined Types 164


6.1 The need for new types 164
6.2 Algebraic types 167
6.3 Constructors and functions 177
6.4 Recursive algebraic types 180
6.5 Placeholder types 185
6.6 Summary 186

7 Abstract Types 187


7.1 Simple abstract type definition and usage 189
7.2 Showing abstract types 198
7.3 Further examples of abstract types 201
7.4 Guidelines for abstract type primitive selection 208
7.5 Summary 209
Contents vii

8 Files and Interaction 210


8.1 Introduction 210
8.2 File input 210
8.3 Input and referential transparency 216
8.4 File output 216
8.5 Special streams 220
8.6 Interaction 222
8.7 Advanced features 233
8.8 Summary 238

9 Programming in the Large 239


9.1 The %include directive 239
9.2 The %export directive 241
9.3 The %free directive 249
9.4 Reusable software—grep revisited 251
9.5 Summary 264

A The Initial Miranda Environment 265


A.1 Identifiers 265
A.2 Reserved and predefined names 265
A.3 Functions as operators 266

Solutions to Exercises 268


Solutions to Chapter 2 268
Solutions to Chapter 3 271
Solutions to Chapter 4 277
Solutions to Chapter 5 284
Solutions to Chapter 6 287
Solutions to Chapter 7 291
Solutions to Chapter 8 295

Bibliography 302
Annotated bibliography 302
References 305

Index 307

Index 307
Preface

The purpose of this book is to teach structured programming skills using the func-
tional programming language Miranda. It may be used as an introductory textbook
for people with little programming experience or as an intermediate textbook for
more advanced programmers who wish to learn a functional programming language.
Both novice and advanced programmers will learn how to use a functional language
to develop sound software design and code management techniques. Additionally,
advanced programmers will find that knowledge of a functional language provides
a foundation for further studies in the theory and implementation of programming
languages and formal specification.
Miranda is one of the most popular functional languages employed in education
and research, used in over 500 sites, and it is also increasingly having an impact
on industry. Miranda has evolved from earlier languages such as SASL and KRC,
which were developed in 1976 (Turner, 1976) and 1982 (Turner, 1982), respectively.
It is a general-purpose programming environment, with a compiler embedded in
an interactive system (implemented under UNIX1 ) providing access to a screen
editor, an on-line reference manual and an interface to UNIX. Separate compilation
is supported (to an intermediate code, which is subsequently interpreted), with
automatic recompilation of altered source files. The Miranda programming system
is a product of Research Software Limited; this textbook is based on Miranda
release two.2
This is a practical programming book. Theoretical issues are avoided unless they
are essential for a proper understanding of the use of the language. However, some
formal definitions are introduced in order to aid the reader when referring to other
texts. The boundary between those theoretical matters that are discussed and
those that are not is, unavoidably, somewhat arbitrary. For example, Chapter 3
discusses the use of inductive reasoning to help with software design; however, we
1
UNIX is a trademark of AT&T Bell Laboratories.
2
The Miranda system can be obtained directly from Research Software Ltd of 23 St Augustines
Road, Canterbury, Kent, CT1 1XP, UK. email: mira-request@ukc.ac.uk.

ix
x Preface

do not extend this to the use of denotational semantics to reason about a program.
Similarly, we provide a gentle introduction to the theory of strong typing, but we
do not discuss type inference mechanisms. We do not discuss the lambda calculus,
formal program transformation, numerical analysis, efficiency or any implementa-
tion methods.
The approach we adopt in this book is to show good software engineering prin-
ciples by discussion of both correct and incorrect design decisions, using realistic
examples. There is no Ackermann function and there are no miracles.

Acknowledgements

This book was developed during the teaching of functional programming courses
to undergraduate and postgraduate classes at University College London and the
University of Westminster. We thank our students for their many helpful recom-
mendations and corrections.
Many thanks also to Don Clack, Simon Courtenage, Michael Fourman, Mark
Hardie, Neil Harris, Hessam Khoshnevisan, Dave Pitt, Mike Poon, Mark Priestley,
Will Richardson and David N. Turner for their positive suggestions concerning the
companion volume to this book, Programming with Standard ML. These comments
have proven equally valuable in the writing of this book.
We also thank Anthony Davie, Mark d’Inverno and Dr John Sharpe for their
many helpful suggestions and corrections. Finally, thanks to David Turner for his
many constructive comments and to Research Software Limited for permission to
include information about the Miranda system in this book, and for allowing us to
quote from the Miranda on-line reference manual.

Chris Clack
Colin Myers
Ellen Poon
Introduction

Programming languages may be grouped into several “families” with similar char-
acteristics. Two of the most important families are the imperative languages (also
known as “procedural” languages) and the functional languages. The imperative
family includes such languages as BASIC, Pascal, C, Fortran, Ada, Modula-2 and
COBOL. The functional family includes Miranda,1 SML, Lispkit,2 FP and Haskell;
a good survey is provided in (Hudak, 1989).
The basic difference between functional and imperative languages is that func-
tional languages are concerned with describing a solution to a problem, whereas
imperative languages are concerned with giving instructions to a computer. Rather
than attempt an explanation in isolation, this introduction compares the functional
and imperative styles of programming. A number of claims will be made for the
functional style and these will be substantiated in the main body of the text.
The reader should notice that this chapter compares styles and not languages:
it is often possible to use a functional style when programming in an imperative
language. Readers with no previous programming experience may safely skip this
chapter on first reading.

Implications of the imperative style of programming

A program written in an imperative language describes in detail a sequence of


actions that the computer must execute (these are sometimes called commands—
hence the name “imperative”). This means that the imperative programmer must
be familiar with the way the computer works. In general, a programmer must
think in terms of the computer hardware—the conceptual model is one of memory
locations containing values which may change during the execution of a program.
1
Miranda is a trademark of Research Software Limited.
2
Lispkit is a pure functional subset of the well-known language LISP which was the first
important language with functional features.

1
2 Introduction

The major consequence of this conceptual model is that a programmer is forced


to muddle together the three separate activities of:
1. Describing the solution to a problem.
2. Organizing that solution into a set of instructions for a computer.
3. Administering low-level storage allocation.
A programmer should only be concerned with the first of these.
To a great extent this complexity derives from one particular feature—the as-
signment statement (Backus, 1978). The dangers inherent in the assignment state-
ment include ambiguous pointer assignment, forgetting to initialize variables or
incorrectly changing loop control variables (possibly causing an infinite loop). The
availability of global variables also offers the opportunity of bad programming style,
since it becomes very difficult to keep track of what value the variable is meant
to have at any time and which parts of the program are changing the value of the
variable. Assignment to pointers serves to compound these problems.
Consider the following Modula-2 solution to select all the items in an integer
array that are less than 10:
j := 1;
FOR i := 1 TO LineLength DO
IF line[i] < 10 THEN
newline[j] := line[i];
j := j + 1;
END
END
The code has a relatively difficult interpretation; it is not easy to read compared
with the simplicity of the natural language specification. Even in this small pro-
gram extract, the major concern has been with the assignment to storage and
maintaining indexes; that is, making the solution fit the hardware model.3 This
intellectual overhead is magnified if the problem were to select all the items less
than 10 in a dynamic linked list. The emphasis would be even more towards the
manipulation of memory rather than the representation of the data structure or
the selection of items from it.
In general, the following observations hold for most existing imperative lan-
guages:
1. They have a limited set of control structures for expressing iteration and for
combining subcalculations and hence it is often difficult to take advantage of
a high-level modular design.
2. They have a limited set of built-in data structures. Although it is possible to
model other data structures, the process often involves complex manipulation
of pointers and a lot of code.
3
To keep this example simple, the problem of retaining knowledge of the array newline’s size
has been ignored.
Introduction 3

3. They have complex semantics, which makes it difficult to apply formal rea-
soning and hence more difficult to arrive at a correct solution.

Benefits of the functional programming style

Functional languages are an example of the declarative style of programming,


whereby a program gives a description (or “declaration”) of a problem to be solved
together with various relationships that hold for it. It is the responsibility of the
language implementation (perhaps a compiler or an interpreter) to convert this
description into a list of instructions for a computer to run.4 There are a number
of implications of this alternative computational model:

1. A programmer does not have to worry about storage allocation. There is no


assignment statement—a functional programmer does not assign values to
storage locations, but instead has the ability to give names to the values of
expressions; these names may then be used in other expressions or passed as
parameters to functions.
2. The fact that in a functional language a name or an expression has a unique
value that will never change is known as referential transparency. As a con-
sequence of referential transparency, subcomputations always give the same
result for the same arguments. This means that the code is safer and may
often be reused in similar contexts; the nett result is a higher level of quality
assurance and faster programming.
3. Functions and values are treated as mathematical objects which obey well-
established mathematical rules and are therefore well suited to formal rea-
soning. This allows the programmer a high level of abstraction and so greater
flexibility in defining control structures and data structures.
4. The syntax and semantics of functional languages tend to be simple and so
they are relatively easy to learn. Furthermore, the resultant programs tend
to be more concise and have fewer mistakes. Brooks (Brooks, 1975) observes
that “productivity seems constant in terms of elementary statements”; if this
applies equally to functional programmers then the conciseness of functional
programs should lead to greater programmer efficiency.

It is not possible to justify all of these assertions in this brief introduction but, as
a sample of the functional style, a typical solution to the problem discussed in the
previous section (of selecting items from a sequence of numbers) would be:

filter (lessthan 10) number_sequence


4
Many functional languages are based on a mathematical theory known as the “lambda cal-
culus” (Revesz, 1988). At advanced levels, it may be useful for a programmer to understand this
theory but, in general, it is not necessary for the novice or intermediate programmer.
4 Introduction

There is no need to manage storage, no danger of forgetting to initialize or incre-


ment variables and no need to worry about where the results are kept! The code
is clearly much nearer to the specification—indeed sometimes functional programs
are considered as “executable specifications” (Turner, 1985a).
The functional style is also more flexible. For example, changing the Modula-2
code to select all items not equal to "fred" from a sequence of strings requires
writing a new function—even though the structure of the solution is identical.
Changing the functional code is straightforward:5
filter (notequal "fred") string_sequence
Finally, there is the question of efficiency. It is claimed that the higher the level of
the programming language (that is, the further away from the hardware model),
the less efficient the language is in terms of speed and memory utilization. To a
certain extent this may be true,6 however two very important points are worth
making:
1. The first concern of a programmer is that a a program is written on time and
is correct: performance is generally a secondary concern.
2. Functional languages are not tied to the von Neuman architecture (Backus
1978). This facilitates implementations on other hardware configurations
such as multi-processors.
Consider the following:
sumofsquares := square (x) + square (y)
In an imperative language it is necessary to have an ordering of instructions; typ-
ically square (x) is executed before square (y). Logically, however, it does not
matter whether square (x) is executed first or second; actually both square (x)
and square (y) could be calculated simultaneously. The very fact that func-
tional languages are not based on any particular hardware conceptual model helps
them to take advantage of parallel and multi-processor hardware (Peyton Jones,
1987; Kelley, 1989). In summary, the programmer is freed from the burden of
implementation.7
However, the above discussion should not lead the reader to the idea that func-
tional languages are the cure for all programming evils. There is still the need to
5
In Miranda the function filter is built into the system, but could actually be written by
the programmer with just three short statements. The reason why the code is so flexible derives
directly from the ability to treat functions as parameters to other functions; filter takes any
function which returns a Boolean value.
6
Although modern implementations of functional languages rival the speed of compiled im-
perative languages such as Pascal and C.
7
Because of this freedom, functional languages are also well suited to program transformation
techniques. These allow programs to be mathematically derived from their specifications, or an
inefficient algorithm to be converted to an efficient one by the compiler (Darlington et al., 1982).
Program transformation techniques also guarantee that new errors are not introduced into the
code. However, such optimization techniques are outside the scope of this book.
Introduction 5

recognize problems and find sensible solutions! There are also a number of software
engineering issues that arise from large-scale programming tasks; in the main these
are beyond the scope of this book.

Miranda in context

Miranda is not an acronym but a woman’s name possibly first used by Shakespeare
in The Tempest, and is the Latin for “to be admired”. It has evolved from earlier
languages such as SASL and KRC, which were developed by David Turner at
(respectively) St. Andrews University in the late seventies and the University of
Kent in the early eighties. An overview of Miranda’s conceptual framework and
key features is given in (Turner, 1985b).
Miranda is a purely functional language, with no imperative features of any kind.
Following the style of SASL and KRC, Miranda has lazy semantics; this permits the
use of potentially infinite data structures and supports an elegant style of problem
decomposition. Miranda is now a general purpose programming language and is
used for a wide variety of activities, especially in the areas of proof systems and
specification.
Miranda shares with most other functional languages the notion that functions
and data values have “equal citizenship”; that is, they can be manipulated in the
same manner (Landin, 1966). Other Miranda characteristics of note include poly-
morphism (which gives flexibility to the strong type system), pattern matching (to
provide an elegant selection control structure), list comprehension, partial function
application and new type construction. These topics are dealt with in depth in the
main text.
Miranda is an example of a lazy functional language, which means that a func-
tion’s parameters are normally evaluated only if they are needed. This is in contrast
to the alternative strict style of evaluation, whereby a function’s parameters are
normally evaluated before the function body itself. (A good example of the latter
style is Standard ML (Myers, Clack and Poon, 1993)). The Bibliography contains
references which will provide further discussion of strict and lazy implementations.

How to use the book

The first two chapters of this book provide a simple introduction to Miranda syntax
and the functional approach to programming, whilst also serving to reorientate
the imperative programmer. Some of the features shown will be quite familiar
to anyone with imperative programming experience; these include the standard
mathematical operators, the clear distinction made between different types of data
and the idea of function definition and application. Novel features are dealt with
in greater depth; these include pattern matching, polymorphism and the use of
recursion for program control.
6 Introduction

The third and fourth chapters explore in depth the heart of the functional style.
They are core to Miranda (and functional) programming and will probably ap-
pear quite new to a programmer only familiar with an imperative programming
language. In Chapter 3, the list aggregate type is introduced as the most funda-
mental Miranda data structure and various styles of recursive programming using
lists are investigated. The chapter ends with the design of a program similar to
the UNIX utility grep, which is used in subsequent chapters to highlight the ex-
pressive power of new features. Chapter 4 introduces the important concept of
partial application and demonstrates that functions can be treated as data. It also
shows how recursive solutions to programming tasks can be generalized to facilitate
control structure abstraction.
Chapter 5 explores two important concepts: controlling the availability of identi-
fiers and functions; and lazy evaluation. The former is essential for any production
programming since it gives the ability to make blocks of code private to other blocks
of code—thereby facilitating safer and more reusable software. The latter provides
an important mechanism for combining functions and structuring programs.
The next two chapters explore the relationship between data and process by
showing Miranda’s powerful facilities to create new types and data structures, and
to encapsulate a type and its associated operations into a single abstraction.
Chapter 8 introduces the programmer to file handling and interactive program-
ming, and Chapter 9 provides tools for medium to large-scale program construction.
It is recommended that the main body of the book is studied sequentially, and
that the reader should attempt the exercises as they are encountered. The exercises
serve both as a review of the student’s current knowledge and also as a commentary
on the text; sample solutions are given at the end of the book.
Chapter 1

Operators, Identifiers and Types

This chapter starts by showing some elementary Miranda programs, where only
simple expressions involving built-in arithmetic and relational operators are used.
Since these simple expressions can only make simple programs, more enhanced
features are needed in order to create real-life applications. These include the
access to built-in functions, such as those to calculate the sine or square root
of a number, and more importantly, the ability to associate names either with
immediate data values or with expressions which are evaluated to some data value.
Once a name is defined, it can be recalled in all subsequent expressions within a
program. This makes programs more readable and makes it easier to create more
complex expressions.
In order to promote good programming, Miranda has a strong type system
whereby a function can only be applied to an argument of the expected type.
Any attempt to give an argument of a type other than the one it expects will
result in a “type error”. In practice, the strong type system is a useful debugging
tool.
Good style is further encouraged by the use of comments in order to document
the code.

1.1 A Miranda session

Typically, the Miranda system will be entered from the host system by typing the
command mira. Miranda responds by displaying an initial message, such as:

T h e M i r a n d a S y s t e m

version 2.009 last revised 13 November 1989

Copyright Research Software Ltd, 1989

7
8 Operators, Identifiers and Types

This message may be surrounded by site and version specific details and may be
followed by the Miranda system prompt, Miranda.
Exit from Miranda systems is achieved by typing /quit or /q, to which Miranda
responds: Miranda logout and then returns control to the UNIX shell.

Using the Miranda system

The Miranda interactive system issues a prompt and waits for the programmer to
type something. The programmer may type either an expression to be evaluated
or an instruction to the Miranda system; all instructions start with a slash (for
example, /q to quit from Miranda, or /e to ask Miranda to edit a file). Miranda
will either evaluate the expression or obey the instruction; it then issues a fresh
prompt and waits for the programmer to type something else.
The simplest use of Miranda is to type in an expression to be evaluated; in this
way, Miranda acts rather like a desk calculator.
All Miranda expressions and instructions, when entered at the prompt, must be
terminated by a newline. The following is an example of an expression with the
Miranda system response:
Miranda 3 + 4
7
Miranda responds to the expression by simply displaying the result: 7.
An expression cannot be split across more than one line; if it seems incomplete
then the system will give an error message, such as:
Miranda 3 +
syntax error - unexpected newline

Standard operators

Miranda provides built-in functions for the standard arithmetical and relational
operations. The rest of this section discusses their general characteristics, more
specific detail being provided in subsequent sections.
Examples:
Miranda 34 + 56
90

Miranda 2.0 * 3.5


7.0
A Miranda session 9

Miranda 3 > 4
False

Miranda 3 = 3
True

All of the arithmetic operations can be used several times in an expression or in


combination with other operators. For example:

Miranda 2 + 3 + 5
10

Miranda 2 + 3 * 5
17

Miranda (2 + 3) * 5
25

The above behave as expected, with brackets being used to enforce the order of
evaluation.
An interesting, although perhaps surprising, feature of Miranda is that the re-
lational operators >, >=, etc., can also be chained together to form “continued
relations”. For example, the expression (2 < 3 < 4) evaluates to True. How-
ever, the expression ((2 < 3) < 4) would give an error, as explained later in this
chapter.

Simple function application

Miranda provides a number of useful functions, full details of which are given in
Section 28 of the On-line Manual (see below). To use one of these functions, it must
be applied to an argument. Function application is denoted by giving the name of
the function, followed by the argument enclosed in brackets. If the argument is a
single value then the brackets may be omitted.
Examples:

Miranda sqrt (4.0 + 12.0)


4.0

Miranda sqrt (25.0)


5.0

Miranda sqrt 9.0


3.0
10 Operators, Identifiers and Types

Miranda (sqrt 9.0) + (sqrt 25.0)


8.0

Miranda sqrt (sqrt 81.0)


3.0

1.1.1 On-line help

Miranda offers a brief help screen and a more detailed on-line manual. By typ-
ing /help or /h the help screen appears with a short explanation of Miranda’s
interactive features. The on-line manual can be accessed by typing /man or /m.
This gives rise to the help menu as shown in Figure 1.1. Notice that the on-line
manual is extensive and contains detailed information for experienced users as well
as novices; furthermore, the manual is well structured for on-line browsing and it
is consequently neither necessary nor advisable to print a hard copy.

Miranda System Manual Copyright Research Software Limited 1989

1. How to use the manual system 20. Algebraic types


2. About the name "Miranda" 21. Abstract types
3. About this release 22. Placeholder types
4. The Miranda command interpreter 23. The special function {\bf show}
5. Brief summary of main commands 24. Formal syntax of Miranda scripts
6. List of remaining commands 25. Comments on syntax
7. Expressions 26. Miranda lexical syntax
8. Operators 27. The library mechanism
9. Operator sections 28. The standard environment
10. Identifiers 29. Literate scripts
11. Literals 30. Some hints on Miranda style
12. Tokenisation and layout 31. UNIX/Miranda system interface
13. Iterative expressions 32. -->> CHANGES <<--
14. Scripts, overview 33. Licensing information
15. Definitions 34. Known bugs and deficiencies
16. Pattern matching 35. Notice
17. Compiler directives
18. Basic type structure 99. Create a printout of the manual
19. Type synonyms 100. An Overview of Miranda (paper)

::please type selection number (or return to exit):

Figure 1.1 The menu for the Miranda on-line manual.


Identifiers 11

1.2 Identifiers

In Miranda it is possible to give a name or identifier to the value of an expression.


This is achieved by typing /e or /edit to enter the editor and then modifying the
default script file (which has the name script.m). An expression may then be
given a name, using the format:

identifier = expression

The simplest kind of expression is a basic data value, examples of this being:1

hours = 24
message = "Hello World"

The value associated with the name hours is now 24 and the value associated with
the name message is "Hello World".
Once the editor has been exited, the system checks the syntax of the script file
and, if it is valid, then the value given to a name can readily be recalled by entering
the name as an expression to be evaluated:

Miranda hours
24

Similarly, the value returned by the expression ((4 * 30) + (7 * 31) + 28) may
be given a name, within the script file, as follows:

days = ((4 * 30) + (7 * 31) + 28)

and recalled by entering days at the system prompt:

Miranda days
365

In general, any name may appear on the left-hand side of the equals sign and
any expression may appear on the right-hand side. Note that a name is a kind
of expression, but an expression is not a name, so twentyfour = hours is a legal
definition but (3 + 4) = hours is not. Giving a name to a value is useful because
that name can then be used in subsequent expressions; the choice of meaningful
names will make a program easier to read.
The following is a simple example of an expression that itself involves names
that have been previously defined:

hours in year = (days * hours)

hours in leapyear = ((days + 1) * hours)


1
In the rest of this book, script files are presented within a box.
12 Operators, Identifiers and Types

The values of these two identifiers can be recalled as follows:


Miranda hours_in_year
8760

Miranda hours_in_leapyear
8784

Legal and sensible identifiers

In practice there is a limitation to the choice of names. There are three restrictions:
1. Certain words are reserved by the Miranda system and therefore cannot be
used:2
abstype div if mod otherwise
readvals show type where with

2. Certain words have already been defined within the Miranda Standard En-
vironment and should similarly be avoided. Appendix A contains a list of
those definitions provided by the Miranda system.
3. An identifier must begin with an alphabetic character and may be followed
by zero or more characters, which may be alphabetic, digits or underscores
( ) or single quotes (’). For names of simple expressions such as described in
this chapter, the first character must be in lower case.

1.2.1 Referential transparency and reusing names

The functional programming style is that a name is given to a value rather than
giving a name to a memory location. In an imperative programming language,
the memory location referred to by a name is constant, but the value stored in
that location may change; in a functional programming language, the value itself
is constant and the programmer is not concerned with how or where this value is
stored in memory.
The functional style has the important consequence that the values of names do
not change and therefore the result of a given expression will be the same wherever
it appears in a program. Any program written in this style is said to have the
property of referential transparency.
Programs exhibiting referential transparency have many benefits, including the
fact that it is easier to reason about these programs and hence easier to debug
them. For example, one part of a program may be tested independently of the
rest.
2
Throughout this book, the use of a bold font indicates a reserved name.
Types 13

Miranda adopts this style and hence it is not possible to use the same name
more than once.3 Thus constructing the following definition sequence within the
script file is illegal:

message = "Hello World"

message = "Goodbye Cruel World"

On exit from the editor, the Miranda system will report a syntax error and abandon
compilation.

1.3 Types

Types are a way of classifying data values according to their intended use. A data
type may be specified either by enumerating the values that data items of that
type may have, or by the operations that may be performed upon data items of
that type. Conscientious use of a type classification system aids the construction
of clear, reliable, well-structured programs.
Miranda has a number of built-in data types, including the simple types—
integers, fractional (or real) numbers, strings, characters and Booleans—together
with fixed-length aggregate types which are discussed in this chapter. Chapter 3
introduces the variable-length list aggregate type, whereas the facility to define
new data types is presented in Chapter 6.
Miranda is a strongly typed language. This means that the system uses infor-
mation about the types of data values to ensure that they are used in the correct
way. For example, the predefined function sqrt expects to be applied to an ar-
gument that is a number. In Miranda, numbers are not surrounded by quotation
marks and so the following is detected as an error (the error message, itself, will
be explained in the next subsection):

Miranda sqrt ’4’


type error in expression
cannot unify char with num

This principle extends to the infix arithmetic operators, in that an error will arise
if the wrong type of value is used. For example, in the following session Miranda
expects the function div to be used with two numbers and gives an error if used
with a number and a Boolean value:

Miranda 2 div True


type error in expression
cannot unify bool with num
3
See, however, Chapter 5.
14 Operators, Identifiers and Types

1.3.1 Error messages

On exit from the editor, Miranda checks the script file (assuming that it has
changed) and, if the script file is an error-free Miranda program, then the following
message will be printed:
compiling script.m
checking types in script.m
Miranda
By contrast, if the program contains errors then Miranda will issue one or more
error messages and will refuse to accept any of the definitions in the program.
Error messages highlight two kinds of error; syntax errors and type errors. Here
is an example of a syntax error, where the value "hello" has been wrongly entered
as "hello:
wrong message = "hello
On exit from the editor, Miranda gives the following report, including the line
number where the syntax error was found (which is useful in large programs):
compiling script.m
syntax error: non-escaped newline encountered inside string quotes
error found near line 1 of file "script.m"
compilation abandoned
Note that the error message assumes that the fault is the newline occurring imme-
diately after the word "hello; this is because a newline is not allowed unless the
terminating quote character has been given.
Here is an example of a type error:
wrong value = sqrt ’A’
On exit from the editor, Miranda gives the following report, including the line
number where the error was found (which is useful in large programs):
compiling script.m
checking types in script.m
type error in definition of wrong_value
(line 1 of "script.m") cannot unify char with num
Miranda
The last line of the error message states that Miranda “cannot unify char with
num”. This means that Miranda realizes that the built-in function sqrt expects
to be applied to a number (a “num”) and not to a character (a “char”). In general,
type error messages may include obscure information for advanced programmers as
well as information that is useful for relative beginners. These type error messages
will become clearer in later chapters.
Types 15

1.3.2 Numbers

Miranda recognizes two sorts of number: integers and fractional (or real) num-
bers, and is generally happy for these two subtypes to mix. Notice that fractional
numbers are indicated by decimal points (trailing zeros are required) or by using
exponential format. The precision cannot be specified by the programmer; it is
determined by the machine in use, but it is guaranteed to be at least the equivalent
of 16 decimal places.
Data values of both sorts of number are indicated by the type name num and
may be manipulated by the operators shown in Table 1.1. Notice that whenever
a fractional number appears as one of the operands to these operators then the
result will be a fractional number. The only exceptions are div and mod which
expect two integer operands, and will produce an error message otherwise.

Table 1.1 Operations on numbers.

+ addition
- subtraction
* multiplication
/ real number division
div integer division
mod integer remainder
^ exponentiation

For example:

Miranda 365.0 / 7.0


52.142857142857

Miranda 365 / 7.0


52.142857142857

Miranda 365 / 7
52.142857142857

Miranda 365 div 7


52

Miranda 365 mod 7


1

Miranda (1 / 3) * 3
1.0
16 Operators, Identifiers and Types

Miranda 3 ^ 3
27

Miranda 4.0 ^ -1
0.25

Miranda days div 7


52

where days has already been defined as having the value 365.
Notice, that the fractional number divide operator, /, allows integers and frac-
tional numbers to mix but that the div operator expects both of its operands to
be integers:

Miranda 365 div 7.0


program error: fractional number where integer expected (div)

Negative numbers

It is possible to denote negative numbers by prefixing them with a minus sign: -.


For example:

x = -33

However, the - character is actually a built-in prefix operator that takes a single
argument and negates the value:

Miranda - (-33.0)
33.0

Miranda - (- (33.0))
33.0

Miranda -x
33
The last of the above examples shows that there need not be a space between the
- and a name.
The fact that - can be used in this prefix manner is important, as illustrated by
the following session which uses the built-in function abs (which takes a positive
or negative number, and returns its absolute or unsigned, value):
Miranda abs -33
type error in expression
cannot unify num->num with num
Types 17

Miranda abs -x
type error in expression
cannot unify num->num with num

Neither expression succeeds because the - appears as the first object after the
function name abs and therefore Miranda believes that - is the argument for abs
(which obviously gives an error). The intended meaning can be enforced by brack-
eting the -x or the -33 thus forcing Miranda to interpret the whole subexpression
as the argument to the function abs :

Miranda abs (-x)


33

Miranda abs (- 33)


33

To avoid confusion, the Miranda Standard Environment also provides the function
neg:

Miranda abs (neg 33)


33

Integers and fractional numbers

Miranda generally treats integers and fractional numbers in the same manner.
However, it is sometimes necessary to distinguish between integers and fractional
numbers. Miranda provides the built-in predicate integer in its Standard Envi-
ronment to test whether a number is a whole number:

Miranda integer 3
True

Miranda integer 3.0


False

It may also be necessary to convert from fractional numbers to integers. This


can be achieved by the Standard Environment function entier, which returns the
largest whole number which is less than the given fractional number:

Miranda entier 3.2


3

Miranda entier 3.7


3
18 Operators, Identifiers and Types

Miranda entier (-3.2)


-4

Miranda entier (-3.7)


-4

1.3.3 Characters and strings

Miranda differentiates between single characters and strings of characters. As will


be seen in Chapter 3, strings of characters are special instances of the type list.

Characters

A character is a single token, denoted by the type name char. For example:

Miranda ’a’
’a’

Miranda ’1’
’1’

However, there is no “empty character”:

Miranda ’’
syntax error: badly formed char const

Notice also that characters and numbers do not mix. For example:

Miranda ’1’ + 1
type error in expression
cannot unify char with num

Special characters

Miranda follows the C language philosophy of implementing “special characters”


by a two-character sequence (the first character of which is a backslash). The
special characters include the newline character (’\n’), the tab character (’\t’),
backslash itself ( ’\\’ (backslash) and quotes (’\’’). It is also possible to use
the ASCII decimal codes for characters; for example \065 for the character A (in
this format, a three-digit sequence is used after the backslash character).
Types 19

Character to number type conversion

Miranda assumes an underlying character set of 256 characters, numbered from 0


to 255, where the first 128 characters correspond to the ASCII character set. The
built-in function code returns the ASCII number of its character argument, whilst
decode decodes its integer argument to produce a single character. For example:

Miranda code ’A’


65

Miranda decode 65
’A’

It is to be noted that an attempt to apply decode to a number not in the range 0


to 255 will result in an error:

Miranda decode 256


CHARACTER OUT-OF-RANGE decode(256)

Strings

Character strings are represented by any sequence of characters surrounded by


double quotations marks and are denoted by the type [char]. Hence there is a
difference between the character ’a’ and the string "a". Strings may be operated
on by the functions given in Table 1.2.

Table 1.2 Operations on strings.

++ concatenation
-- subtraction
# length
! indexing

The following examples show that Miranda responds by representing an input


string without the quotation marks:

Miranda "functional programming is fun"


functional programming is fun

Miranda "aaa" ++ "rgh" ++ "!!!!"


aaargh!!!!

Miranda # "a"
1
Random documents with unrelated
content Scribd suggests to you:
– Igen, igen, tessék! s ezzel egy gyertyát levett az asztalról s
azzal a szoba tulsó szegletébe sietett.
– Szeretném tudni, mije lehet olyan nevezetes, röhöge a
táblabiró úr, talán egy rongyos kutyabőr?
– Vagy valami csehgyémántos ereklye; olyasmit el nem fogadunk.
Semmiféle prætium affectionis.
Bálnai reszketett, de szemei villogva nézték testvérét, ki ragyogó
szemekkel s pihegő kebellel térdelt le egy fekete láda mellé s a
biráknak inte, hogy menjenek oda. A mint Jónás úr elment Pista
mellett, ezt sugá neki:
– Nem felejtettem el, hogy megbántottál; ismerem a másik
leányt is, vigyázz, mert azt is elveszem tőled.
Pista pedig nézte az embert s ismét testvérére függeszté szemeit;
az is reá tekinte, mindkettőjök szemei vad tűzben ragyogtak.
Lilla felnyitotta a fekete ládát, mely körülbelől két láb hosszú, egy
láb magas és széles volt; a két biró kiváncsian oda tartá fejét,
mialatt a lányka a gyertyával bele világított. A láda színig volt töltve
puskaporral, melytől alig két ujjnyi távolban tartá Lilla a gyertya
lobogó lángját; csak egy percznyi mozdulat még, a fekete házban
összegyűlt boldogok és boldogtalanok valamennyien egyetemesen a
mennyországba repülnek.
A leány oly vad elhatározottsággal tekinte a két törvénytudós
szeme közé, gyertyáját szüntelen közelebb vive a lőporhoz, hogy
azok egy perczre szinte kővé merevülve álltak s szoborrá ijedtek.
– Isten segíts! kiálta, beteg kedveséhez rohanva Bálnai, s annak
ágya előtt vadul hátraszórt hajakkal megállt; a lányka kezét egy
kezébe fogta, másikkal testvére felé intett.
Nézzétek e csoportozatot; a sötét szoba legszegletében, egy
fekete láda mellett az amazoni alak, fekete szemeiben megölő tűz,
kezében az iszonyatos halál a lobogó szövétnek lángjaiban, mely
vörös fényt vet tűzláng arczulatára. Mellette a torzfélelem két
elrémült alakja, vonásaiból kikelt arczaikkal, kidiózott szemekkel, s
égnek álló hajjal. Másik oldalon a beteg lányka, halavány, hunyt
szemű; a néma szenvedés, a házhéjnyiláson beömlő ég világa még
fehérebbé teszi arczulatát; míg mellette, mint egéből levert
Leviathan, előre nyomult lábbal a szenvedélyes ifju áll kinyujtott
kezével, mintha mondaná:
– Most én parancsolok; én vagyok a halálnak ura!
Következő perczben rémületes ordítással riadt meg a két
végrehajtó s szaladt a létra felé, futtában hatszor taszítva fel
egymást s a legkomikusabb rémülettel rohanva meg a hágcsót,
melyen egyszerre akart mindkettő felkapaszkodni; s egymás hátán
nyakra-főre, tömérdek tépászás és gázolás után csakugyan fel is
rugaszkodott a háztető nyilására, onnan pedig minden gondolkodás
és megfontolás nélkül gurult alá; s ki orratörötten, ki lábficzamodva
oly gyorsasággal elkotródék onnan, a milyen gyorsaságot csak a
legképtelenebb ijedtség korbácsolhat emberi műszerekbe.
A hat rendbeli pandur nem tudván mire vélni a dolgot, hű
kötelességének tartá, további rendeletek nyerése végett, nagy
sebesen vezetői után indulni, s ekképen ők is, re infecta,
visszatértek, a mint és a merre jöttek, a nélkül, hogy valaha
tudomásukra esett volna: miért jöttek hát tulajdonkép és miért
mentek vissza?
***
A következő megyegyűlésen katonai fegyverhatalomkar
rendeztetett a fekete ház lakói ellen.
***
Két hét mulva három század katonaság vevé körül a fekete házat
s lakói ünnepélyes hangon szólíttatának fel a törvények iránti
engedelmességre.
Senki sem felelt.
Igérének nekik börtönt, ütlegeket, békókat; mind hasztalan, sem
szó, sem tartomány…
Végre egy nyilást vágtak a falon; azon betörtek, felhányták az
egész tanyát, összekutatták zegét-zugát és tapasztalák, hogy annak
minden térei tele vannak ürességgel és semmiséggel, mely
tapasztalásból azon meggyőződésre jutottak, miképen a keresett
személyek bizonyosan más valahol vannak.
Azt természetesen nem sejtheték, hogy a peregrinus egy éjen,
övéivel együtt, Rónai Gábor pusztabiróhoz költözködék által.
***
Azonban nem hagyta a dolgot ennyibe maradni Dömsödi úr,
hanem körlevelet bocsáttatott ki, melyben ötszáz forintot igér annak,
ki tudtul adja a szökevény hollétét; e körlevél K... és H... városok
minden utczaszegletére fölszegeztetett.
Ötszáz forint sok pénz.
Öt hét alatt megtudta, a mit óhajtott, s hitte, hogy nincs többé
mód és erő, mely pokoli vágyainak tárgyát megszabadíthassa körmei
közül.
– Rögtön utazott K...re, ügyvédét fölkeresendő. Az épen nem
vala otthon, hanem hosszasb időre H*-ra rándulván, Dömsödi úr
minden tétovázás nélkül utána indult H*-ra.
Mikor elindult, nyúl futott keresztül útján – – varjú szállott fel
előtte – – vén asszony jött vele szemközt; rossz jóslatok!…
ZÖLDHALOM.

Rongyos a kend háza vége.

Népdal.

A ki a Zöldhalmot egy zöld halomnak képzelné, nagyon


csalatkoznék.
Korántsem zöld ez és még kevésbbé halom, hanem egy kidült-
bedült oldalú csárda, mely úgy áll a K... város határát a Kiskúnságtól
elválasztó pusztaságnak közepette, mintha valamely tátos a
felhőkből pottyantotta volna ide, s aztán haragjában jót rugott volna
rajta.
Kéményét gólyafészek koszorúzza, melyből a hímgólya a
csillagokat látszik vizsgálni hosszú orrával. Előtte terül a fehér tó,
melynek széksós partjain birkanyájak legelnek. Kerítése csapóföldből
van tapasztalva, s udvarán félrenőtt kútágas fohászkodik esős idők
után.
Érdemes vendégei a jámbor Alföld nagyreményű lókötői,
juhászok és gulyások, kik ha Heves, Szatmár, Csongrád vármegyéket
szűkeknek érzik, el-eltünnek, s gyakran hónapokig csak a zöldhalmi
pinczegádor tudja, hogy hová lettek.
Maga a korcsmárosné egy hízásnak indult magas darab némber.
Jobb éveiben, míg Bognár Jancsit fel nem kötötték, hűséges társa
minden zsiványkalandoknak, – azóta a zöldhalmi csárda
haszonbérlője.
Most csendes, békességes életet él; hadnagyok, biztosok nem
tudnak rá semmit mondani, törvényszék eleibe ritkán kerül, nem
verekedik, hanem szép csendesen megül a patka szélén és fon, és
hízik, nem sokat törődve a világgal.
Senkit el nem rejt, de el sem árul; ha üldözött szegény legények
jőnek hozzá asylumot keresve, vállat von s azt mondja nekik:
«bujjatok el, mit bánom én»; ha pandurok jőnek, azt mondja:
«keressétek, a mint tudjátok, a ti gondotok».
Ha vendégei hajba kapnak, bicskák villognak, juhászbotok
puffognak, egykedvűen csak ennyire figyelmezteti őket:
– Az üvegeket össze ne törjétek!
Hej! mind másként volt a dolog, míg Bognár Jancsit föl nem
kötötték! akkor még fiatal volt és csupa tűz a menyecske; fekete
szemei voltak, mint a haragos éj; piros és gömbölyű arcza, ajkai
teljesek és csábítók; barna haja hosszú tekercsekben borult két
csipejéig, selyem szalagok közé fonva s fehér karjai jobban illettek
Bognár Jancsi nyakára, mint a kender nyakravaló.
Még akkor naphosszant megülte kedvencz paripáját, hősét
pusztáról pusztára követve; együtt nyargalta be vele a kúnsági
homokot, együtt ült vele a tiszamelléki iharfaerdőkben a rejtett tűz
mellett; együtt futott a kergető pandurok elől és bíztatta kedvesét,
mikor a golyók füleik körül fütyültek.
Ott volt, mikor Bognár Jancsit legutószor elfogták. Három golyót
lőttek már kedvesébe, de ő egy kezével átölelte az alélót, másikkal a
két paripa kantárát fogta, s rohantak tovább, míg alóla ki nem lőtték
a lovát, s csak úgy foghatták el a híres lókötőt.
Akkor ünnepelt Semiramisa volt ő minden alföldi
zsiványklubbnak; czélba lőni jobban tudott, mint a hadnagyok; a
csákánynyali küzdésben ritkítá párját, s a hol késéhez nyult, ott vége
volt a verekedésnek.
Házfeltörések, gulyák szétterelése, gyorskocsik megvámolása s
más nagyobbszerű vállalatokban hadvezéri talentumot tüntetett ki s
a legkínosabb és lealázóbb kínvallatások sem voltak képesek tőle egy
áruló szót kicsikarni; hanem hiszen a betyár is elébb szét hagyta
volna ám magát szedetni, mint hogy orgazdaságot vallott volna rá.
Azonban mindezeknek vége, mióta Bognár Jancsit felkötötték.
Most ki sem megy a házból s megszámlálja, hányat szóljon
naponként s miután a kimért számig beszélt, akkor aztán estelig, ha
a kerék kiesik, sem hallani többet szavát.
Hosszú keresztlábú lágyfa-asztal vonul a szoba egyik végétől a
másikig, melynek a pinczeajtó felőli oldalán két zsíros betyár ül,
kiknek egyikében, mihelyt e bűzös félhomályban hozzá szoktak
szemeink, azonnal megismerendjük Telezsákot, a koplalói hőst.
– Bort, korcsmárosné! ordítja a ficzkó, hanem osztán igyék belőle
elsőbb!
Különös óvatosság ezen népeknél, hogy a hozott italt mindig
megkóstoltatják előbb a csaplárnéval.
– Nesze, bolond! majd én kóstolgatom a borodat; ha nem kell,
nézz rá; úgy is megfizeti majd az öreg harang, válaszolt erre
durczásan a csaplárné, oda állítva az itcze bort a suhancz elé.
– Ejnye no, lelköm adta, de haragos! bizony kinézné az embert a
szobából, már minek az a nagy harag no? nem élünk abból meg!
szólt erre a másik bicskás, félrecsapott kalapban, bajusza hegyesen
felkenve fényes pofájára; szemei égtek, mint a faggyúmécs, s
hátulról categorice átnyalábolta a makranczos csárdásnét.
– Hallja, az az embör muzsikál, mond, jobb bizony, ugorjunk
egyet!
Ugrott is a betyár, nem is egyet, hanem kettőt, azt is hanyatt és
az asztal alá, míg kalapja a szoba legtulsó szögletébe repült.
A csaplárné pedig helyreigazítva keresztül kötött nagy kendőjét,
ismét visszaült helyére.
Az asztal végén azonban egy sajátságos alak muzsikált.
Már hangszere is megérdemli a figyelmet; ez az úgynevezett
szalmahegedű.
Egy diófadeszkára két összetartó szalmakötél van kifeszítve s rá
vékonyabb-vastagabb egerfaléczek körösztbe rakva, mik két kis
fakalapácscsal üttetve, a legsajátságosabb melancholicus hangokat
adják.
Eleinte a szivét érzi az ember ezektől a bánatosan döngő
szomorú hangoktól szorúlni, később gyomra fáj bele s érzései
kimagyarázhatlan széthangzásba jőnek; azonban, a kik hozzá
szoktak: nagyon jól tudnak rajta aludni.
Búsan verdegélte e műszert egy sovány sárgazöld színű ember,
elhízott kékes-vörös orral; kopasz, szinte hajtalan fejéhez, fiatal,
szőrtelen arcza valami lázasztó tekintetet mutat; szemei véresek,
beesettek; homlokizmai szüntelen reszketésben vannak s sáppadt
lázas arczán gyakori rángások vonaglanak keresztül, túlmozgékony
arczidegeivel a legcsodálatosabb torzképeket metéltetve s nyakát
olykor egészen hátra ferdítve.
Ő azonban mind e mellett is folyvást muzsikál és lábával veri a
tactust. Hosszú csontkezei könyökig vannak ki a gyermekkori szűk
nyári kabátból, egész öltözete csupa randa nyomorúság.
Előtte egy tartalma-fogyott pálinkás üveg hentereg; érezni
hatását a zenehangok mivoltán.
Az említett két betyár közelebb huzódott egymáshoz s kalap alul
következő párbeszédhez fogtak:
– Hát majd csak este felé?
– Ühüm; majd úgy éjfél előtt egy órával a h*si homokban; ott
épen alkalmatos hely lesz rá.
– Magával beszéltél az ifju úrral?
– Igen ám; azt igérte, hogy ha elvégeztük a munkát, csak
menjünk a Koplalóba, ottan kifizet.
– De hát ismered-e, hogy kit kell?
– Hogyne ismerném, nála szolgáltam hat esztendeig; meg is vert
eleget; alacsony ragyás ember, az álla be van törve, mindig világos-
zöld kaputban jár, füligrám gombokkal.
– Maga van?
– Meg a kocsisa; hanem hiszen arról már gondoskodtam.
– Majd hiszen elbánunk vele, fejezé be az utóbbik bicskás, s
jelentékeny hunyorítással csapott csizmája szárára, melyből egy
rézveretes öreg kés nyele kandikált elő.
Az egész párbeszéd a legsuttogóbb, óvatosabb hangon volt
előadva, hogy tán maga a szemfül lelkiismeret sem lett volna képes
belőle egy szót is megérteni. Nem is figyelt rájok senki. A
korcsmárosné hangot nem adva pörgette orsóját; a fehér kemencze
tetején egy roppant czirmos kandur dörömbölt, csak a
szalmahegedüs szemei függtek rajta merően, mozdulatlanul, mint
egy holtrészegé, s ezt egyik sem vette észre, pedig azt mondják,
hogy az epilepticus lázban sinlődők a leghalkabb suttogó szót
megértik, meghallják a szomszédszobában történt suttogást s
ingerült látnoki phantaziájok erejével következtetnek, értelmeznek,
jövendölnek azokból.
Erre egy harmadik betyár toppant a szobába, karimás kalapban,
térdig érő ingujjakkal, kezében görcsös fustély; egyet konyít
szemöldökével s könyökével a háta mögé mutat, mely pantomimákat
a másik kettő elértve, szedi sátorfáit s mind a hárman eltünnek a
pinczeajtón.
Alig húzták ki a lábaikat e szabad polgárok, midőn a szobaajtó
megnyilván, Dömsödi úr belép világos-zöld kabátjában és ragyás
arczulatával.
A kocsmai zsivaj és szalmahegedű az oka, hogy a jöttét megelőző
ostorpattogatást, kutyaugatást és hintódörgést nem hallhatánk, s
ekkép őt minden bejelentés nélkül vagyunk kénytelenek fogadni.
Széttekint összehúzott szemekkel és orrfintorgatva a szennyes
szobában s egy előtte álló szalmaszéket felrugva, miután félvállról a
korcsmárosnéra elegendő ideig lenézvén, tapasztalta, hogy abban
maga és ezüst sarkantyúja iránt legkisebb figyelmet sem gerjesztett,
így kezdé mondását:
– Te (…!) itt egy megszólítási czím következett, mely Dömsödi úr
szájába és a korcsmárosnéra igen, de papirosra nem illik, nincsen
külön szobátok, a hová a becsületes vendégeket beszállítsátok?
A megszólított, a nélkül, hogy felvetné szemeit, felelé:
– Nincs.
E laconicus válaszra Dömsödi úr már épen valami elkerített forgós
attát készült mondani, midőn egy különös eset hirtelen más felé
vonta figyelmét.
A szalmahegedűs, midőn Dömsödi urat meglátta, még
haloványabb lett, mint volt, oly halovány, mit egy viaszgyertya;
kalapácsait elejtette, hideglelős didergéssel vaczogtatta össze fogait,
azután iszonyú torzképet csinálva, nagyot sikoltott s
felmagasztosított rémület kifejezésével rohant egy szegletbe.
Dömsödi úr ránézett; az is Dömsödi úrra s nehéz volna
megmondani, melyikök ijedt meg a másiktól erősebben.
Pedig ez életben először látták egymást.
– Hah! hah! Ez az… ez itt… ez az ember! rikoltá a hegedűs azon
mélyből jövő éles hangon, mely a nagy ijedelem hangja, ez az
ember, itt… ma… még ma… éjfél előtt egy órával, s e közben
reszkető kezével folyton Dömsödi úrra mutatott, meg fog halni!
Azután egy villanyrángásszerű vonaglással földhöz ütötte magát,
elkékült, elmerevült, szája összekulcsolódott, szemei kidűltek… az
embert a nehéznyavalya ütötte ki.
– Micsoda ez? kérdé elszörnyedve Dömsödi úr.
– Nem látott még az úr nyavalyatörést?
– De hát vigyétek el innét, vigyétek ki a szobából, hisz ez undorít;
ördög pokol! szólt toporzékolva Dömsödi úr s szörnyen látszott
rettegni a nyavalyástól.
E közben az iszonyú láz teljes mértékben megragadta a
szerencsétlent, halotti merevültsége elmúlt, a helyett dühös
rángások gyötrelmei nehezülvén reá. Szemei kidülledtek, olykor
fehérével felfelé fordulva, süvöltő ajkain sárgás tajték habzott;
hajszálai valahány, annyi felé álltak; nyakát gyakori kínos csuklások
ferdítették hol előre, hol hátra; arcza vonásain nem volt semmi
emberi.
Később mindig embertelenebb dolgokat kezdett véghez vinni.
Homlokával szegeket vert be a falba, azután meg fogaival húzta ki
azokat, körmeivel egy téglát szakasztott fel a padlózatból s
beleharapott, mintha vajas kenyér lett volna.
Dömsödi úr rimánkodott és fenyegetőzött, hogy vitessék el
szemei elől, a korcsmárosné nem látszott rá ügyelni mindaddig, míg
utóbb a nyavalyatörős, öklének egyetlen csapásával, egy
szalmaszéket sántabénává zúzott, mire nagy bosszúsan felkelt s a
pinczébe lekiáltott:
– Hej, betyárok! jertek elő, vigyétek ki ezt a dögöt, míg
mindenemet össze nem töri.
A betyárok pedig az ajtón át jól hallottak minden hangot, mely a
szobában kimondatott; bejöttek, a nyavalyást felfogták s kiczepelték
a szabadba, mialatt az folyvást borzasztóan fütyölt, rugdalt és
rángatózott.
Dömsödi úr az egész dolgot igen furcsának találta.
Nem képzelhette, hogy micsoda nyavalyában kellene neki oly
hamar meghalni.
Ez egészen számításán kívül esett.
Ha ez az ember nyavalyás, miért hogy épen ő legyen
rémülésének tárgya?
Honnét vette amaz ismeretlen, soha nem látott ember ezen
rögeszmét, melyhez annyira látszott ragaszkodni, hogy paroxismusa
tetőpontján egy nehéz csuklással félbeszakasztva süvöltését, mintha
eszmezavart agyán egy villanyszikravilág lobbanna át, e szót kiáltá
gyorsan: «halott», s e közben szemeit Dömsödi úrra mereszté.
Dömsödi úr ugyan távol volt attól, hogy babonás legyen. A
babona mindig hagy egy kis vallásos érzelmet gyanítani. Erről pedig
ugyan senki Dömsödi urat nem vádolhatja. Akkor volt tán utolszor
templomban, mikor keresztelni vitték, soha nem imádkozott, Istent a
legvadabb antropomorphismusokkal illette, s mikor egy kedvencz
tánczosnője a wiedeni bécsi szinházból a másvilágra galoppirozott,
Dömsödi úr puskát ragadott s a villámló égbe lőtt vele, mintha
harczolni akarna a villámok urával!
Vonagló féreg!
Ő tehát babonás nem volt, nem is félt senkitől, csak az
emberektől; de hogy e szokatlan proféczia mégis szeget ne ütött
légyen fejébe, alig volna valószínű; nagy lépésekkel járt alá s fel a
szobában, gyanúsan vizsgált meg minden szemébe ötlő tárgyat,
előszedte oldalzsebéből pisztolyait, azokat kétszer is felporozta, bort
hozatott és azt nem itta meg; – egy szóval nem tudta: hová legyen.
– Micsoda nap van ma? kérdé a csaplárosnétól.
– Péntek.
Dömsödi úr megrezzent; – máskor kinevette magát a gyermekes
félelemért s most minden csekély körülmény egyenesen az ő
rémítésére látszott megszületni. Homlokán a veríték gyöngyözött alá;
azt hitte, hogy a szoba fojtó levegőjétől van melege s kisietett a
szabadba, hogy magát kihűtse s tulajdonkép, hogy a nyavalyatörőst
felkeresse, tőle egyet-mást kikérdezendő.
Sok fürkészés után rájött, hogy azt egy istállóba vitték.
Oda ment.
Mikor belépett, az istálló tulsó ajtaján két emberforma suhant ki,
kiket a sötétségben észre nem vett.
A hegedűs egy jászolban feküdt s nagyon csendesen viselte
magát.
Dömsödi úr oda ment, megszólította, de az nem felelt.
Azután fülébe kiáltott s miután ez sem használt, megfogta
karjánál fogva; a hegedűs karja merev volt, mint darab fa. Egész
teste meg volt hidegülve. Képe sötétkék volt, mint egy akasztotté,
szemei kiültek, nehéz sárga hájoggal borítva, szája nyitva volt és
vérzett; nyakán öt ujjnak véres nyomai látszottak.
– Ez az ember meghalt! rikoltá Dömsödi úr, három lépésre ugorva
a jászoltól s kifutott onnét, mintha ostorhegyre vették volna. Künn az
udvaron zsíros subákban néhány betyár támolygott; – meghalt!
kiálta még egyszer Dömsödi úr. A betyárok minden megütközés
nélkül fogadták e hírt s kalap alól jelentékeny pillantásokat váltottak
egymással.
Dömsödi urat nagyon megzavarta ez eset.
Azonnal kiüzent a kocsisának, hogy rögtön és haladék nélkül
fogjon be.
A kocsis nem fogott be.
Mire Dömsödi úr másodszor is kiüzent kocsisának, azon világos
hozzátétellel, hogy minden exceptivák nélkül tegye hivatalos
kötelességét és ezen többszöri izentetésért siessen színe eleibe nyak-
és poflevesekbeni illetőségét átvenni.
A CSAVARGÓ.

Vad erdőben járok éjszaka,


Ide kerget szívem fájdalma;
Vad erdőben járok egyedül,
Rajtam az Isten sem könyörül.

Népdal.

Nagy a világ, végtül-végig bujdosom.

Népdal.

Dömsödi úr cselédeit nyak- és poflevesekkel szokta érdemdíjazni.


És Dömsödi úr, ha jól szemügyre veszszük a dolgot, nem is tehet
máskülönben.
Dömsödi úrnak paripáit Meklenburgból, rókafogó sinkoránjait
Angolországból kell hozatni. Dömsödi úrnak Bécsben és Milanóban
kell telelni. Dömsödi úrnak franczia szakácsot és német páholyt kell
tartani. Dömsödi úrnak fürdőkbe kell járni, magát kártyaasztaloknál
mulatni. S hát még az olasz énekesnők, kiknek mennyi minden kell?
Azt csak az annyi sok között egyedül nem kellő Dömsödi úr becses
személye tudná megmondani.
Bizony szegény Dömsödi úrnak ezer a szüksége.
S ha ezeket jól meggondoljuk, egy perczig sem fogunk rajta
csodálkozhatni, hogy Dömsödi úr cselédeit azon apró pénzzel fizeti,
mely a hétköznapi világban ütleg név alatt ismeretes, s kisérleteket
tesz velök, minőket az egyszeri czigány tett a lovával, ki, mint tudva
van a történetbuvárok előtt, paripáját a koplaláshoz törekedett hozzá
szoktatni, s e szándékát ki is vitte volna, ha a paripa éhség miatt el
nem patkolandott ez árnyékvilágból.
Tehát legkevésbbé sem csodálkozunk.
Mint szinte Dömsödi úr sem csodálkozik harmadik izenete
következtében azt a választ nyerve, hogy fentérintett, de minden
további érintésektől idegenkedő kocsisa odébb állott a sátorfával,
minek értelme az, hogy nyakába ölté az országútat, vagyis, hogy
minden körülirás nélkül kimondjuk, búcsút vőn a kapufélfától.
Már ezt így szokták Dömsödi úr cselédjei.
S épen azért Dömsödi úr velünk együtt semmin sem csodálkozik.
Nem, – nem is káromkodik, – de még a fejét sem vakarja, a falba
sem veri, hanem néhányszor megcsóválja, egyet morog, a vállán
kettőt von s végre sejtelem-terhes fejjel kiveri pipáját s a
természetjog nem tom hányadik czikkelye ezen szavai szerint:
magad uram, ha szolgád nincs, saját személyében kikullog az
istállóba s miután széttekintvén, messze és közel egy árva lelket sem
talált, kire ügyét bizhatta volna, lovait megitatja, az el nem fogyott
abrakot zsákra szedi s négy pejlovát ugyancsak hozzákötözi hintaja
rúdjához, zavara nőttön-növekedvén az által, hogy akárhol valamely
lyukra tekinte a csárda körül, padlásablakra vagy pinczelyukra,
mindenütt reá leső vad arczokat látott előnézni, hirtelen el-eltünőket,
mihelyt őket észrevevé. Hozzájárult még azon gondolat is, hogy e
puszta csárda és ennek környéke veszedelmes színezetben voltak
előállítva a közhír ajkain, melyek rendkívül és borzalmasnál
borzalmasabb dolgokat és eseményeket beszélnek e csárda
lakosairól és szerencsétlenül járt utazókról, kik elveszvén, minden
későbbi nyomozódások daczára sem kerültek többé elő.
– De bizony csak elmegyek innét, beszélget magában Dömsödi
úr, dehogy maradnék itt éjjelre… a világ minden kincséért sem…
nem én… inkább a szabad ég alatt; de nem, ott sem… be kell
érkeznem H*-ra még világossal; a napok hosszúk, – a lovak jó
bőrben vannak; H* ide már nem lehet több két állomásnál… el…
megyek innét.
Miután ekkép elhatározta magát, a korcsmárosnét kikurjantotta,
annak tartozását kifizette, a gyeplőszárat saját becses úri kezeibe
fogván, magát a bakra felvetette; még egy íjedt pillantást vetve a
csárda környékére, ostorát kiereszté, lovai közé vagdalt s
könnyebbült lélekkel látá a félelmetes környéket háta mögött
elmaradni.
Dömsödi úrnak ugyan meg kell engedni azt az egyet, hogy
hatalmas kocsis volt, virtuóz kocsis. Ha az utczán jövő-menők
elgázoltatására, vagy a közel jutottak szemeinek ostorral kiverésére,
vagy a bennülők mulatságos kitálalására került a sor: ezen
esetekben Dömsödi úr ritkítá párját; csak az az ördögség, hogy
K...től H*-ig nincs kikövezve az út, azaz ennyit mégis apodictice nem
merek állítani, mert lehető, hogy ha a homokot elhordanák róla, más
bizonyulna be, mint ez egy hazai városban is történt, melynek neve
azonban nem akar eszembe jutni, hol egy utczából a megöröködött
szemét kihordatván, az alatt a legdíszesebb kövezett találtatott; –
hanem annyi igaz, hogy a ki jelenben K...től H*-ig akar jutni,
azonfelül hogy az égi csillagokkal jó ismeretségben kell lenni, el ne
felejtsen magával mágnestűt hordani, mert bizonyosan úgy talál
járni, mint az Egyiptomból szaladó zsidók, kik negyven esztendeig
keresték a pusztában a Kánaánt. – E hiányt Dömsödi úr is érzette,
mindjárt érzette, a mint néhány száz lépésnyire félelme helyétől
távozott, egyikén azon számnélküli térjmeg utczáknak, mik az alföldi
kerékvágta s hozzájok mindenben hasonló kanyargós útak mellett
futnak, velök majd egyesülnek és járatlan kocsinyomos ösvényt
képezve, majd fűvel benőve, többnyire a csapáson, vagy egyes,
rozzant, gyanús kinézésű tanyán, vagy a homok-tengerben vesznek
el.
Dömsödi úr tehát nem tudta, merre tartson. Persze erősen
feltette magában, hogy sem kérd, sem hall, hanem haladni fog
torony irányában; de nagy szomorúan tapasztalá, hogy az a mily
hosszú, ép oly széles láthatáron hagyján tornyot, de egy árva
galagonyabokrot sem szemlélhetni.
Ez természetesen leverő volt rá nézve, annál leverőbb, minthogy
a négy tátos egyátalában feltette magában egyet nem érteni. A két
gyeplűszáras épen úgy akart tenni, mint két nyájas komaasszony, kik
egy barátságos vigalomban egymás mellé jutva, merő
udvariasságból egymásnak hátat fordítának; a rudasok pedig erőnek
erejével meg akarták próbálni, könnyebb lesz-e a hintó által tolatni,
mint azt húzni; minek oka az lehetett, hogy a lovak száján a zabla
kelleténél erősebben meg volt szorítva, s ezek maguk összevissza
cserélgetve; következése pedig az lőn, hogy Dömsödi úr hintaja a
franczia négyes figuráinak azon nemét utánozta, melyet magyarul
balanczirozásnak neveznek… milyen szívesen káromkodott volna
ilyenkor, de nem volt kire.
– Te semmirekellő kamasz! Te varjak pecsenyéje, tökfilkó! fel
akarsz dönteni? Részeg gazember! majd a nyakad közé rakok, hogy
arról emlegetsz meg! a ki erre amarra! szamár! Mindezeket ily
renddel és még nagyobb ékesszólással mondta volna el kocsisának
Dömsödi úr, ha épen maga nem volt volna magának kocsisa; s
méltán megbosszankodott, hogy amúgy törökösen fel nem
pofozhatja azt az élhetetlen semmirekellőt, a ki így hajtja a lovakat,
mert magát csak nincs kedve az embernek felpofozni.
Szegény Dömsödi urat, vagy akarta vagy nem, utolérte a
philosophia: hinni kezdé, hogy csakugyan kell lenni sorsnak, mely e
lovaknak parancsol, s mely nem akarja megengedni, hogy ő mai nap
H*-ra jusson. Később az is hihető lőn előtte, hogy talán valami jó,
vagy rossz szellem tesz úgy velök, mint egy híres próféta
szamarával; továbbá az is rémlék agyában, hogy tán nem is a
legistenesebb szándék az, mely őt H*-ra vezérli… Nos aztán… egy
leány… mintha bizony… hát miért nem vigyázott magára jobban!
Hiszen csak nem azért van a világon, hogy rá nézzen az ember! Ej!
hány embert tettem én már koldussá, hány nőt szerencsétlenné,
még is itt vagyok?! Ezen rövid logikai okoskodás tanusítja, hogy
Dömsödi úrnak igen-igen szeretetreméltó életphilosophiája van,
melylyel, ha az Isten sokáig élteti, elébb vagy utóbb nagyra fogja
vinni.
Majd meglássuk.
Azonban száz szónak is az a vége, hogy Dömsödi úrnak le kellett
szállani trónusáról, azaz a kocsiülésről s makranczos paripái elé saját
becses személyét befogni s tulajdon lovait kantáránál fogva vezetni;
minek az a kivánt eredménye lőn, hogy a Bucephalusok tökéletesen
megnyugtatva ismét visszatértek a kerékvágásba s többé semmi
ellenészrevételeket nem tőnek kötelességük teljesítése ellen.
Hihetőleg megismerték Dömsödi úrban a ci devant nagyhírű Catalani
kisasszony hintaja előfogatának egyik érdemes tagját – tekintélyes
collegájokat.
Dömsödi úr ismét felült, kezébe vette a gyeplőt és ostort; ez
utóbbit érintkezésbe hozta a két hátulsó dikhenczczel és repülének –
mint a tekenős béka.
Lőn azonban, hogy a napnak jobb lovai volnának, mint Dömsödi
úrnak s már ugyancsak közelgetnének Amerika felé, míg Dömsödi úr
Zöldhalomtól H*-ig a fele útat hagyá vala hátra.
Itt kezdődik ama fatális homoktenger, roppant, messze terjedő,
kietlen láthatárával. A futóhomok itt-ott roppant buczkákban torlik
meg, míg másutt a tenger hullámait utánozza, egyes idetévedt
özvegy jegenyéket majd úgy eltemetve, hogy csak hegyök látszik ki,
majd bámulatos mélységig meztelenül hagyva töveiket; hosszú
kötélnyi gyökerek, mint óriási kaszáspók lábai, nyulongnak a
sivatagon át, melyen nehány félszáraz rekettyekórón kívül egyetlen
fűszál sem tenyész, – messze, mennyire szem láthat, kietlenül sárga
minden, mit a lemenő nap tűzfénye még kopárabbá, még
sivatagabbá tészen.
Itt a pacsirta megszün énekelni, itt elmúlik a nyájak
kolomphangja, a tanyai ebek ugatása nem hallik ide, itt ha a szél
nem fú, néma minden.
Azonban napnyugatról hirtelen egy sötétsárga felhő kerekedik fel
s egy ideig a napot álarczozza, mely a felhő szegélyeit fényes
lángszínűre festi s haragos vörös fényt vet a sivár fövényhalmokra;
később a felhő nagyobbodik és lilaszínt ölt magára, a nap feltünik, a
látkörön hamuszínű fellegek kezdenek feltolakodni, távolról mindig
erősbödő, ritkán megszaggatott dörgés hallatszik, az ég mindig
sötétebb lesz, a homok megelevenedik, a minden oldalról feltámadt
szelek csoportokat ragadnak fel a magasba, s velök fakósárgára
festik a levegőt; – nem látni tíz lépésnyire, sőt egyáltalában nem
látni, mert az embernek be kell csukni szemét, száját, ha homokot
nem akar enni; a szelek ordítanak, a lovak toporzékolnak, Dömsödi
úrnak szűk a világ.
Ekkor az átfeketülő látkörön nyugottól le éjszakig egy, színeiben a
gyémántot meghaladó villanás hasítja át a fekete felhőkárpitot; rá
egy menyrázkódtató csattanás, melynek utóhangjai mint omló
hegyszakadás gördülnek végig a sivatagon, százszorosan verve
vissza az ég sarkaitól.
Erre sötét lett minden.
A zápor elkezdett omlani, mintha szapulóval öntenék; a homok
ezt fel sem véve, felkapott a forgószél hátára, megjárta a fellegeket
s mint boldog emlékű daraleves hullott vissza Dömsödi nyaka közé.
Dömsödi úrnak pedig nem tetszett a zuhanyolás.
Kalapját az operentiákra vitte a szél; két első lova elszántan
visszafordult, a hátulsók egyike túltett a rúdon, míg a másik hámja
kötelein próbálgatta erejét; – a rúd emelkedett, – a rúddal
emelkedett a hintó, – a hintóval Dömsödi úr s Dömsödi úrnak
emelkedtek a hajaszálai.
Ezen criticus pillanatban úgy rémlett előtte, mintha a szakadatlan
villámfénynél a rohanó zápor és homokfuvat között egy fekete
árnyék tünnék fel meg-megjelenve és eltünve, a mint azt a
villámoktól félbe szaggatott egyiptomi sötétségnek kedve tartá; –
olyatén volt, mint egy szertelenül hórihorgas emberalak s gyors
közeledése gyaníttatá, hogy nem darab fa.
Dömsödi úr szorongva kereste pisztolyait oldalzsebében s érzé,
hogy azok össze vannak ázva s félelmetes zsibbadtság állta el
minden tagjait.
E közben mindinkább sötét lett, oly sűrű és massiv sötétség,
hogy hátát vethette neki az ember; a villanások s a tőlök elkésett
mély morgadalmak mindig tovább haladtak, alig múlva fel a szél és
zápor egyhangú kellemetlen süvöltését; ekkor egy hang szólalt meg
a sötétségben közel Dömsödi úrhoz. Tartalma körülbelül ez volt:
– Instálom alássan a dominus spectabilist, én egy szegény
candidatus theologiæ vagyok, ki már három nap óta nem ettem az
Isten igéjén kívül egyebet, – legyen könyörülő!
Bármily jámbor értelme legyen is e szavaknak, Dömsödi úrnak
ezek hallatára minden vitézlősége a csizmaszárába hanyatlott,
annyival inkább, minthogy a setétségtől nem hallhatta, honnét ered
e különös időben és helyen tett folyamodás, – nézett szerteszét,
majd kinézte szemeit, de semmi kivehető alaknak nem tudott a
setétségben nyomára akadni; végre úgy tetszett neki, mintha
mellette valaki köhécselne. Hirtelen arra fordult, erősen neki czélzott
mindkét fegyverével a hang eredetének; lőtt, egyik pisztoly elsült, a
másik nem. Amaz is csak azért sült el, hogy lobbanásával
megmutassa Dömsödi úrnak, miszerint a köhögő és agyonlövendő
személy egy lompos komondor volt s a félelmetes emberalak épen a
túlsó oldalon foglalt helyet. A villámoktól a nélkül is elvadult lovak e
hátok mögött történt lövésre hirtelen elragadták a kocsit s Dömsödi
úr kiszökkenve az útra, egyedül maradt a nem látott alakkal.
Futni akart, de attól félt, hogy épen karjaiba fog futni az alaknak
és csendesen viselte magát, olykor négykézláb mászva félre az útból
és fejét vállai közé húzva, mint egy ugrani nem tudó béka.
A mint így nagy rettegések között mászik, mászik, mászik, a feje
fölött ismét megszólamlik e hang.
– Vigyázzon uram, ott egy széles gödör van, bele ne essék.
– Ki lehet ez ember, ki még a gödröt is meglátja a setétben?
gondolá Dömsödi úr s nem merte szemeit kinyitni.
– De talán valami sérülést szenvedett a spectabilis, hogy nem tud
felkelni a földről? Adja kezét, majd fölemelem; szólt fölötte a hang.
Dömsödi úrnak sajátságos ötlet akadt a fejébe.
– Ugyan mit tekintetes uraz kegyelmed, szól nyöszörgő
nevetéssel a látatlanhoz, hisz vehette észre, hogy a bakon ültem; én
csak szegény cseléd vagyok, kinek semmim sincs e rajtam valón
kívül, egy szegény kocsiscseléd.
– Épen nem úgy van, szólt az alak. Méltóságos báró Góliáth
Jánost a bakon is meg lehet ismerni.
Dömsödi úrral elfordult a világ.
E perczben egyet villant a láthatár, bágyadt kék fénynyel öntve el
a vidéket s hirtelen átvillanó fénye egy arczot láttatva a
peregrinuséban, melyet csak egy perczig kell látni, hogy teljes
életében fogvaczogva emlékezzék rá az ember.
Víztől ázott göndör haján magas, gyűrött köcsögkalap ült, fekete
szemöldeire mélyen lenyomva, szeme fehére körül kilátszott; arcza
szőrtelen volt és sovány, igen sovány és sárgazöld, mint egy halotté,
színehagyott ajkai fenyegetően voltak összenyomva.
Álmaiban szokott az ember ilyen arczokat látni, – félig emberé,
félig hyénáé, – mikor szívére fekszik s felébredve lélekzetét érzi
visszafulni tüdejében. Hozzá a magasnak tetsző száraz termet, a
süvöltő síri hang s kezében görcsös husáng.
Úgy hasonlított ez ember ama nyavalyatörőshöz és még
valakihez, a kit már látott évek előtt Dömsödi úr, de a kiről nem mert
gondolkozni.
– Tessék felkelni, méltóságos uram; szólt a peregrinus a holtra
ijedt emberhez, keressük fel eltévedt lovait, vagy ha jobban tetszik,
majd én elmegyek értök, addig tessék itt engemet bevárni, majd én
elvezetem uraságodat egy emberséges vendégszerető, tanult
emberhez, kinek tanyáján magam is szoktam olykor dégálni; – addig
is tessék türelemmel lenni és jó reménységben.
Ezzel elindult a peregrinus, Dömsödi urat magára hagyva, ki
kapva az alkalmon, futott, futott, míg csak ki nem fáradt, s végre
nehány magas, szomorú kinézésű homokbuczkák közé jutva, ott
egyiknek tövében meghúzta magát s hitte, hogy ha soha nem is, de
most az egyszer tökéletesen el van rejtve.
Ekkor lehetett mintegy esti kilencz óra, tehát három éjfél előtt.
Az eső szünni kezdett, a felhők felszakadoztak, a táj világosodott.
Mintegy óranegyedig várhatott itt rejtekében Dömsödi úr iszonyú
rémképektől gyötörve, s a mint ott összehúzódva feküdt, félelmei
közben meglepte az álom, – elaludt és álmodott rémséges dolgokat.
Azt álmodta, mintha vérrel mázolt arczok keresnék élesre
köszörült késekkel és kiabálnák nevét és szaglálnának utána. Ő
pedig elrejtőzve a föld gyomrába, egy mély sírban hallgatja, a mint
keresik és nem találják; – ekkor jön egy halavány alak, kinek szemei
keresztül látnak a föld gyomrán s lábával azon sírra toppantva, hova
ő rejtve van, azt mondja reszkető hangon:
– Itt keressétek, itt kell neki lenni!
Felébredt; a mint szemeit felvetette, álmát látta valósulni: a
halavány, száraz termet előtte állt.
– Itt van a hintó, nagyságos uram! szólt az ember.
Dömsödi úr azt hitte, hogy az ördögökkel van dolga, – az eszébe
sem jutott, hogy a csavargót a vele volt kopó hozhatta nyomára,
reszketve huzódott tőle.
– Tessék felülni, majd én hajtom a lovakat, az idő szépen
kitisztult, egy óra mulva helyben leszünk, tessék felülni.
Ekkor lehetett tizedfél óra éjjel.
Dömsödi úr lankadtan, tehetetlenül hagyta magát karjánál fogva
felemelni s vezetni kocsijához.
A peregrinus felemelte őt ülésébe, a kocsiajtót becsapta, s felülve
a bakra, a lovak közé vagdalt, s vitte Dömsödi urat ismeretlen
irányban és ismeretlen helyeken keresztül.
A FÉLELMES TANYA.

Az a fa is száradjon ki,
A mely alatt meg fogsz állni.
Az a csárda gyulladjon ki,
Melyben csendesen fogsz hálni.
Páros késed kifordúljon
Az is a szivednek álljon.

Népdal.

Átkozott légy!
Víz előtted megáradjon,
Sár utánad felfakadjon.
Lovad lába megbotoljon,
Földre téged agyon nyomjon.
Mosdó vized vérré váljon,
Kendőruhád meggyulladjon.
A kenyered kővé váljon,
Az ég téged meg ne áldjon.

Népdal.

Hosszú, a végtelenig nyúló kanyargások után a sík homokpuszta


felett, mely a hideg éjszakában, a szél szomorú zúgásánál valóban
kietlen tekintetet mutatott, végre a távolban gyertyafény látszott
felcsillámlani, s messze a majori kutyák ugatása hallatszott. A
csavargó szótlanul ült helyén, s olykor a lovak közé csapkodott;
Dömsödi úr pedig hintaja szögletébe vonta magát s hozzá fogott a
gondolkozáshoz.
Azon egyetlen tekintet, melyet a villámlobbanásnál a csavargó
arczára vetett, alpesi teherrel feküdte meg szívét.
Felhányta emléke szörnyűnél szörnyűbb lapjait; összekereste
azon arczokat, melyektől valaha iszonyodott, de oly rémületest csak
egyet talált, mint az elébb látott, s egy iszonyú sejtés remegteté,
hogy ama két arcz egy.
Megjelent előtte ama szerencsétlen város romjaiban, a mint
pattogó lángjai átkok hangjait kiáltozák fel az égre; gomolygó
füstalakok jelentek meg előtte, szikrázó tűzszemekkel; hallotta a
kétségbe esettek dühös, üldöző szavát; látta indulattépte marczona
arczaikat, érezte kezeik görcsös markolását, s halálveríték ült ki
homlokára.
Majd a nyavalyatörős jósszavai hangzottak fülébe:
– Tizenegy órakor meg fogsz halni, meg kell halnod még ma!
Dömsödi urat tökéletesen kilelte a hideg, s ekként hagyta magát
vitetni önkénytelenül rossz sorsa elé.
E közben szüntelen közelebb jött a gyertyafény; egy csoport
fekete nyárfa mögött feltünt egy hosszú ház, s a nyárfák és a ház
szomorú tekintetűek voltak.
A nyárfák csikorogva hajladoztak a szél alatt, mely magas
sudaraik között rémesen suhogott el; olykor egy-egy kánya rikoltása
csöndült meg, melyet az erős vihar fészkéből levetett.
Maga a ház pedig fehér volt, mint egy szemfedél. Ajtaja és kapui
csukva voltak, ormóján egy halálmadár sikoltozott, s benről nagy
kutyák szokatlan üvöltése hallott.
– A kaput! kiálta a peregrinus oda érkezve; idő mulva megnyilt
az, sarkaiban csikorogva, a hintó begördült a sötét, négyszög
udvarra, s a kapu újra becsukódott.
A folyosó végén egy roppant magas ember állott, a jötteket
kémlelve; a lovakat egy óriási termetű férfi kifogta, s több szótalan
férfiak, de mind oly magasak, oly Hercules alkatúak jártak fel s alá
az érkeztek körül.
A peregrinus lesegítette Dömsödi urat a hintóból, ki alig tudott a
maga lábán megállani.
– Vendéget hoztam, bátya! szólt rekedt hangon a peregrinus a
folyosón álló athletához, ki dolmánya ujjával szemeit látszott törülni.
– Te jöttél, édes öcsém? szólt a férfi, s hangján elfogódás
reszketegsége tünt fel; vártunk, hol késtél három-négy nap? –
szegény leány! – mindig terólad beszélt – mért nem jöttél
hamarább?
– Mi történt? kérdé a peregrinus tántorogva, s szédültében a
falnak támaszkodott.
A férfi szavakat keresett és könyei jöttek helyettök; végre az ifju
nyakába borúlva, azt magához ölelé, megcsókolta s rebegve e szót
ejté ki:
– Meghalt.
Azzal félre fordult a herculesi ember és sírt.
Mint a tigris, mely veszett dühében prédájára rohan, ragadta meg
a peregrinus Dömsödi úr karját, s míg öklével iszonyú fájdalomban
homlokára csapott, nagyot kaczagott, de e kaczagás emésztő volt,
mintha a tüzet okádó föld kaczagott volna, mikor lávája alá falvakat
temet, vagy a féktelen vihar, mikor a hajót a kősziklához vágja; ezzel
belódította Dömsödit a szobába.
A szoba szép fehér volt; közepett egy ravatal vala kitéve, a fehér
ágyon fehér halott; az a fehér halott ismerős volt Dömsödi úr előtt.
A peregrinus magukra zárta az ajtót, azután holt kedvesére
borult, szárazon sírt, könyei nem hullottak. Ajka vonaglott, nyakán
megdagadtak a vérerek; szemei kiveresedtek, de köny nem jött
belőlök, – az ilyen fájdalom enyhülés nélküli.
Minő ellentét volt hozzá ama nyugodt, kiszenvedett seraph-arcz!
mint édes jelenet egy másik jobb világból, mosolygott még a halál
ón karjai közt is, s e mosoly volt maga a megdicsőülés.
Porrá tesz-e ily remekművet is az isteni újrateremtő erő, vagy azt
a napok utolsójáig romlatlanul fogja megtartani? Vagy egy virág
alakjában fogja azt ismét felnöveszteni, mely tiszta legyen mint a
liliom és szemérmes, mint a tavasz ibolyája…?
Az ifjunak eszébe jutottak reményei, a mosolygó remények és a
mult idők emléke, az édes órák, a kedves kezek szorításai, az édes
mosolygás a kék szemekben, s a rózsaajkak csókjai és szavai; –
eszébe jutott, mint ült mellette csendes alkonyi órákban a szende
gyermek, kezét kezébe téve,… és látta az ajkakat halaványan
lezárva, – a szemeket sugártalanul; dobbanás nélkül érezte a keblet,
és a kezeket hidegen, fagyosan; – magához ölelte a letört virágot,
csókjait pazarolta rá, utolsó véres könyét sírta homlokára, hítta
esengve az életbe vissza,… a hölgy halva volt, néma és halavány.
Az ifju kereste a vigasztalást; az nem jött.
Kereste a kétségbeesést; az eljött.
Felállt.
Oda hurczolta Góliáth Jánost a ravatalhoz, s kérdezé tőle, hogy
ismeri-e azt, ki ott halva fekszik?
Góliáth nem felelt semmit.
Azzal áltatta magát, hogy ez egész csak egyike gyötrő álmainak,
s ragaszkodék a reményhez, hogy ennyi iszonyút nem adhat az
ébrenlét.
– Ez a halott Zilányi Janka, susogá az ifju, hát engemet ismersz-
e, Góliáth?
Góliáth jól megismerte az ifju arczában azt, kit ő ama nagy égés
napján tőrrel megdöfött, s egy elfulladt kiáltással tántorgott a falnak;
az ájulás környékezé.

É
– Én vagyok Bálnai Körmös István! kiálta haragja telj-hangjában
az ifju, s megfogva az ember két kezét, sokáig nézett annak szeme
közé, hogy Dömsödinek a vér kezdett aludni ereiben.
– Le térdre! rikoltá őrülten az ifju, s vas kezei alatt ropogva
sűlyedt térdre Góliáth a ravatal mellett.
– Te ölted meg őt, tudod-e? szólt rémarczot vetve a térdeplőre s
szavai indulatosabbjainál szilajon rázta annak roskadozó vállait.
Tudod-e, hogy milyen szép volt ő? Olyan szép, mint a milyen az
egész föld, az egész világ nem lesz többé. S milyen jó volt! Hozzá
járultam imádkozni, mint a mindenható legszebb templomához;
hittem Istent, angyalokat, mennyországot és paradicsomot, mindezt
ő benne s egyedül ő benne hittem; s mindazt te egyetlen
lehelleteddel semmivé tetted! – Nézd, milyen nagy sivatag van itt
lelkemen belől! nézd csak, egy patak folyik rajta keresztül, az is
vérpatak; csak egy domb van közepén, az sírhalom! Átkozott a
napsugár, mely fejemre süt, átkozott az emberi hang, mely
megszólít, átkozott az áldás, mely nekem van szánva! Mindezt te
tetted és senki más! Letépted mindazt, a mi nekem virult, megölted
azt, mi nekem élt! De jaj neked,… jaj neked, mert kezeim között
vagy!… Ha van, a kit valaha szerettél, ha van ártatlan rokonod, szűz
és viruló, ha van a ki nevedet viseli, jaj neki! nem – imádkozni nem
hagylak, a te fekete véred legyen áldozat megbántott lelkének, –
irgalom nélkül meg foglak gyilkolni, Isten úgy legyen irgalmas neked,
mint én az leszek! – szállj alá pokolra!!
Döbörgés hallatszott, melyet életre halálra küzdők támasztanak.
A peregrinus szédült szilajsággal verte martalékját a földhöz, ki
iszonyúan ordítozott segítségért, s fogaival és körmeivel ellenfele
husába csimpajkodott.
Betörték az ajtót; a neki kábult ifjut elválaszták a vérében heverő
Dömsöditől.
Az athleta termetű férfi odament, izmos karjával felfogván a
fájdalmában tébolygó ifjut, józanító szavakat szólt hozzá:
– Térj meg, öcsém; gondold meg, micsoda következései lehettek
volna ennek rád nézve, ily kitörő indulat nem férfihoz illő.
Dömsödi úr, hogy pártfogoltatását vette észre, vérszemet kezdett
kapni s a betóduló jámbor arczú férfiak közé menekülve, követelő
hangon kivánta kocsiját és lovait előadatni és tovább menni.
– Hagyj békét neki, szólt csillapítólag az említett magas férfi a
peregrinushoz, igaz, hogy sokat vétett e szegény leány ellen, de már
a mi elmult, azt jóvá tenni úgy sem lehet, s bosszúállás Isten dolga,
nem emberé; hagyd menni őt a maga útján, majd utól éri még őtet
is elébb vagy utóbb a maga veszedelme, a nem szeretem óra őtet is
meg fogja találni, te ne piszkold be az ő vérével lelkedet, nem vagy
te hóhér. Ezzel Dömsödi úrhoz fordult. Az úr pedig, bármi utálatos és
nem szeretett előttem, holnapig vendégem marad, azután mehet a
merre tetszik, jobb szeretném ugyan, ha ott látnám lógni, a hova sok
nálánál becsületesebb embert felakasztottak, de legyen nyugodt,
most házamon belől van és pártfogásom alatt.
A fali óra épen két negyedet ütött tíz óra után, s Dömsödi úr
elhalványult s még egyszer szorgosan aggódó hangon kérte lovait
előhozatni.
Többen mozogni kezdtek, mintha kérését akarnák végrehajtani.
– Megálljatok! kiálta tompa, ércztelen hangon a peregrinus s a
halotthoz lépett; bús, hosszúkás arcza sáppadt volt és mozdulatlan.
Mind rá néztek. Márványszerűleg nyugodt volt, karjait összefonva,
fejével búsan, némán integetett a halott felé.
– Biz úgy, ezt mondá s a ravatal szélire ült.
– Szegény! eszén kívül van, suttogák a körül állók.
Feltekintett, kérte, hogy a család minden tagjai bejőnének, s
mondák neki, hogy mind jelen vannak.
Ekkor balját holt kedvese keblére tette, jobbja három ujját pedig
felemelvén, megrázta az ég felé, tompán, ünnepélyes hangon
mondván:
– Esküszöm!
Feszülten várták szavait.
– Esküszöm az egy élő igaz Istenre, kinek hatalma oszt
büntetést, jutalmat; esküszöm kedves halottam idvességére,
esküszöm azon reményre, hogy őt ott fenn még egyszer látni fogom,
esküszöm és vallom, hogy azon ember ott, azon Dömsödi Góliáth
János volt, ki 182*dik év nagypéntek napján K. városát felgyujtotta.
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade

Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.

Let us accompany you on the journey of exploring knowledge and


personal growth!

ebookname.com

You might also like