Immediate download Programming with Miranda Chris Clack ebooks 2024
Immediate download Programming with Miranda Chris Clack ebooks 2024
com
https://ebookname.com/product/programming-with-miranda-
chris-clack/
OR CLICK BUTTON
DOWLOAD EBOOK
https://ebookname.com/product/composing-music-with-computers-1st-ed-
edition-eduardo-miranda/
ebookname.com
https://ebookname.com/product/professional-heroku-programming-1st-
edition-chris-kemp/
ebookname.com
https://ebookname.com/product/asp-net-3-5-website-programming-chris-
love/
ebookname.com
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
https://ebookname.com/product/current-treatments-of-obsessive-
compulsive-disorder-clinical-practice-2-sub-edition-michele-tortora-
pato/
ebookname.com
https://ebookname.com/product/architecture-and-its-ethical-dilemmas-
nicholas-ray/
ebookname.com
https://ebookname.com/product/basic-science-for-the-mrcs-a-revision-
guide-for-surgical-trainees-2nd-edition-andrew-t-raftery/
ebookname.com
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
Preface ix
Introduction 1
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
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.
1
2 Introduction
3. They have complex semantics, which makes it difficult to apply formal rea-
soning and hence more difficult to arrive at a correct solution.
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:
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.
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
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.
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
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.
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 3 > 4
False
Miranda 3 = 3
True
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.
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 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.
1.2 Identifiers
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:
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:
Miranda hours_in_leapyear
8784
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.
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:
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):
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:
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.
+ addition
- subtraction
* multiplication
/ real number division
div integer division
mod integer remainder
^ exponentiation
For example:
Miranda 365 / 7
52.142857142857
Miranda (1 / 3) * 3
1.0
16 Operators, Identifiers and Types
Miranda 3 ^ 3
27
Miranda 4.0 ^ -1
0.25
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:
Negative numbers
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 :
To avoid confusion, the Miranda Standard Environment also provides the function
neg:
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
Characters
A character is a single token, denoted by the type name char. For example:
Miranda ’a’
’a’
Miranda ’1’
’1’
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 decode 65
’A’
Strings
++ concatenation
-- subtraction
# length
! indexing
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.
Népdal.
Népdal.
Népdal.
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.
É
– É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.
ebookname.com