Stack Machines

The Beatnik programming language that we’ve worked with in the previous session makes use of the concept of a stack machine.

“…a stack machine is a mode of computation where executive control is maintained wholly through append (push), readoff and truncation (pop), of a first-in-last-out (FILO, also last-in-first-out or LIFO) memory buffer, known as a stack…” (Stack machine on Wikipedia)

Here are two other examples of stack machines that produce text.

Permutation poems

For the following see also: Algorithmische Einfühlung: Über Nick Montforts »Megawatt«

Samuel Beckett, “Watt”

“Now these voices, sometimes they sang only, and sometimes they cried only, and sometimes they stated only, and sometimes they murmured only, and sometimes they sang and cried, and sometimes they sang and stated, and sometimes they sang and murmured, and sometimes they cried and stated, and sometimes they cried and murmured, and sometimes they stated and murmured, and sometimes they sang and cried and stated, and sometimes they sang and cried and murmured, and sometimes they cried and stated and murmured, and sometimes they sang and cried and stated and murmured, all together, at the same time, as now, to mention only these four kinds of voices, for there were others. And sometimes Watt understood all, and sometimes he understood much, and sometimes he understood little, and sometimes he understood nothing, as now.”

There are four posible states, »sang«, »cried«, »stated«, »murmured«, and Watt understands »all«, »much«, »little« und »nothing«.

Nick Montfort in his poem Megawatt adds four more verbs: »babbled«, »chatted«, »ranted«, »whispered«. At the same time Watt can now also understand »most«, »half«, »less«, and »bits« This results in new combinations that can be algorithmically generated.

Nick Montfort, “Megawatt”

“Watt heard voices. Now these voices, sometimes they sang only, and sometimes they cried only, and sometimes they stated only, and sometimes they murmured only, and sometimes they babbled only, and sometimes they chattered only, and sometimes they ranted only, and sometimes they whispered only, and sometimes they sang and cried, and sometimes they sang and stated, and sometimes they sang and murmured, and sometimes they sang and babbled, and sometimes they sang and chattered, and sometimes they sang and ranted, and sometimes they sang and whispered, and sometimes they cried and stated, and sometimes they cried and murmured, and sometimes they cried and babbled, and sometimes they cried and chattered, and sometimes they cried and ranted, and sometimes they cried and whispered, and sometimes they stated and murmured, …”

The rule becomes the author!

Stack Machines

The following poem doesn’t use permutations but a different type of repetition, which can easily realized by stack machines which we encoutered last week.

This is an example to understand the concept of stack machines better. Although it is not a stack machine in the pure sense, since we only see push operations (stack.insert). The complete content of the stack is appended to the current poem with just one command (poem = poem + ' '.join()).

""" 
Autor: Georg Trogemann

»Der Bauer schickt den Jockel aus« is a traditional German ballad 
that belongs to the literary genre of »counting tales« and 
circulates in many variations. The original author is unknown. 
An early print proof of the poem appeared in Vienna as early as 1609.

The version below is from Theodor Fontane (1819-1898)
Titel: Jockel

You can change the poem by changing the "activities" or including further 
lines of "activities" and adapting the sucessor line.
Example: after   ['Der Ochse','das Wasser','Er','saufen','säuft'],
         include ['Die Feder','den Ochsen','Sie','kitzeln','kitzelt'],
                 ['Das Ferkel','die Feder','Es','fressen','frißt'],
         adapt   ['Der Schlächter','das Ferkel','Er','schlachten','schlacht'],
"""

activities = [['Der Jockel','den Hafer','Er','schneiden','schneidt'],
             ['Der Pudel','den Jockel','Er','beißen','beißt'],
             ['Der Pruegel','den Pudel','Er','schlagen','schlägt'],
             ['Das Feuer','den Prügel','Es','brennen','brennt'],
             ['Das Wasser','das Feuer','Es','löschen','löscht'],
             ['Der Ochse','das Wasser','Er','saufen','säuft'],
             ['Der Schlächter','den Ochsen','Er','schlachten','schlacht'],
             ['Der Henker','den Schlächter','Er','hängen','hängt'],
             ['Der Teufel','den Henker','Er','holen','holt'],
             ['Der Herr','den Teufel','Er',' ',' ']]

stack1 = []
stack2 = []
poem = 'Jockel\n\nDer Herr, der schickt den Jockel aus: \n'
stack1.insert(0,'Und kommt auch nicht nach Haus.\n\n')
stack2.insert(0,'Und kommt auch gleich nach Haus.\n')
    
index = 0
while index < len(activities)-1:
    poem = poem + activities[index][2] +' soll ' + activities[index][1] + ' ' + activities[index][3] + '.\n'
    stack1.insert(0, activities[index][0]+' '+activities[index][4]+' '+ activities[index][1]+' nicht,\n')
    stack2.insert(0, activities[index][0]+' '+activities[index][4]+' '+ activities[index][1]+' nun,\n')
    index = index + 1
    poem = poem + ''.join([str(elem) for elem in stack1])
    if index+1 < len(activities):
        poem = poem + 'Da schickt der Herr '+ activities[index+1][1] + ' aus,\n'
    
stack2.insert(0,'Da geht der Herr nun selbst hinaus \nUnd macht gar bald ein End daraus.\n')
poem = poem + ''.join([str(elem) for elem in stack2])
print(poem)
Jockel

Der Herr, der schickt den Jockel aus: 
Er soll den Hafer schneiden.
Der Jockel schneidt den Hafer nicht,
Und kommt auch nicht nach Haus.

Da schickt der Herr den Pudel aus,
Er soll den Jockel beißen.
Der Pudel beißt den Jockel nicht,
Der Jockel schneidt den Hafer nicht,
Und kommt auch nicht nach Haus.

Da schickt der Herr den Prügel aus,
Er soll den Pudel schlagen.
Der Pruegel schlägt den Pudel nicht,
Der Pudel beißt den Jockel nicht,
Der Jockel schneidt den Hafer nicht,
Und kommt auch nicht nach Haus.

Da schickt der Herr das Feuer aus,
Es soll den Prügel brennen.
Das Feuer brennt den Prügel nicht,
Der Pruegel schlägt den Pudel nicht,
Der Pudel beißt den Jockel nicht,
Der Jockel schneidt den Hafer nicht,
Und kommt auch nicht nach Haus.

Da schickt der Herr das Wasser aus,
Es soll das Feuer löschen.
Das Wasser löscht das Feuer nicht,
Das Feuer brennt den Prügel nicht,
Der Pruegel schlägt den Pudel nicht,
Der Pudel beißt den Jockel nicht,
Der Jockel schneidt den Hafer nicht,
Und kommt auch nicht nach Haus.

Da schickt der Herr den Ochsen aus,
Er soll das Wasser saufen.
Der Ochse säuft das Wasser nicht,
Das Wasser löscht das Feuer nicht,
Das Feuer brennt den Prügel nicht,
Der Pruegel schlägt den Pudel nicht,
Der Pudel beißt den Jockel nicht,
Der Jockel schneidt den Hafer nicht,
Und kommt auch nicht nach Haus.

Da schickt der Herr den Schlächter aus,
Er soll den Ochsen schlachten.
Der Schlächter schlacht den Ochsen nicht,
Der Ochse säuft das Wasser nicht,
Das Wasser löscht das Feuer nicht,
Das Feuer brennt den Prügel nicht,
Der Pruegel schlägt den Pudel nicht,
Der Pudel beißt den Jockel nicht,
Der Jockel schneidt den Hafer nicht,
Und kommt auch nicht nach Haus.

Da schickt der Herr den Henker aus,
Er soll den Schlächter hängen.
Der Henker hängt den Schlächter nicht,
Der Schlächter schlacht den Ochsen nicht,
Der Ochse säuft das Wasser nicht,
Das Wasser löscht das Feuer nicht,
Das Feuer brennt den Prügel nicht,
Der Pruegel schlägt den Pudel nicht,
Der Pudel beißt den Jockel nicht,
Der Jockel schneidt den Hafer nicht,
Und kommt auch nicht nach Haus.

Da schickt der Herr den Teufel aus,
Er soll den Henker holen.
Der Teufel holt den Henker nicht,
Der Henker hängt den Schlächter nicht,
Der Schlächter schlacht den Ochsen nicht,
Der Ochse säuft das Wasser nicht,
Das Wasser löscht das Feuer nicht,
Das Feuer brennt den Prügel nicht,
Der Pruegel schlägt den Pudel nicht,
Der Pudel beißt den Jockel nicht,
Der Jockel schneidt den Hafer nicht,
Und kommt auch nicht nach Haus.

Da geht der Herr nun selbst hinaus 
Und macht gar bald ein End daraus.
Der Teufel holt den Henker nun,
Der Henker hängt den Schlächter nun,
Der Schlächter schlacht den Ochsen nun,
Der Ochse säuft das Wasser nun,
Das Wasser löscht das Feuer nun,
Das Feuer brennt den Prügel nun,
Der Pruegel schlägt den Pudel nun,
Der Pudel beißt den Jockel nun,
Der Jockel schneidt den Hafer nun,
Und kommt auch gleich nach Haus.

Embedding poems - A five-fold plagiarism

Oulipo (L‘Ouvroir de Littérature Potentielle):

Language expansion through formal constraints - new freedoms and possibilities through self-imposed new writing rules. (1960)

Based on the idea of Oulipo we can invent our own writing rules. Here an example:

Read the following 5 poems by Klaus Merz.
Merz, Klaus. Unerwarteter Verlauf: Gedichte (German Edition). Haymon Verlag.

Im rückwärtigen Raum
Was alles so wächst
in uns und um uns:
Einsicht und Ekel
mit Glück auch die Liebe
noch vor den Tumoren.

Die Enkel wachsen, die
Lichtung im Haar und
hinter den Fußballtoren
der unendliche Raum.

Regelwerk
Wir haben die Forschung
auf die Nacht verlegt.
Zwischen zwei und vier
in der Frühe passiert’s.
Tagsüber ruht der Betrieb.

Pilotprojekt
Hatte im Lauf
der vergangenen Schicht
ein Buch zuzunähen
auf der Leseseite.
Es gelang.

Aus der Forschung
Der Meister kriegt Schläge
sein Herz ist wund.
Er fletscht die Zähne
und beißt den Hund.

Beglaubigung
Gegen Abend
die Singvögel schweigen
bitt’ ich noch einmal
die Wörter zu mir.
Um geschehen oder un-
geschehen zu machen
was war.

Now read the following text. What a shit you will say, and you are right. But …

Aus der Forschung
Sie produziert nur noch Regelwerke, nichts Lebendiges mehr. Wir haben die Forschung, unser Ideal der Vernunft, zu Tode akademisiert. Deshalb braucht das einstige Pilotprojekt der Aufklärung dringend eine neue Beglaubigung. Es hatte sich, im Laufe der Zeit, im rückwärtigen Raum der Wissenschaft die Bürokratie breit gemacht. Was eben alles so wächst, wenn keiner hinschaut. Was am Morgen noch leicht hätte ausgemerzt werden können, ist gegen Abend schon mächtig. Die Entscheidung über die Erneuerung der Forschung wurde nun auf die Nacht verlegt. Dann, wenn die Singvögel schweigen und in uns und um uns Stille herrscht. Also bitt‘ ich noch einmal zum Widerstand, auch wenn eure Einsicht und Ekel möglicherweise zu spät kommen. Schickt also, für unseren Kampf für eine erneuerte Forschung, die Wörter der Meister zu mir, zwischen zwei und vier in der Nacht. Um, mit Glück, in der Frühe einen Neuanfang zu ermöglichen. Vorher aber kriegt auch die erneuerte Liebe zur Wissenschaft noch einmal schwere Schläge, doch – ich versprech’s – noch vor den ersten Schleiern des Morgens passiert’s dann, den Tumoren der vergangenen Schicht wird der Garaus gemacht. Die Enkel schreiben dann eine neue Seite im Buch der Forschung, neue Dinge werden geschehen, neue Ideen wachsen, die Lichtung wird größer, die dunkle Zeit vergessen. Wie aber wird er wohl sein, der neue Forschertypus? Sein Herz ist wund. Doch er fletscht die Zähne und beißt den Hund. Im Haar trägt er Strähnen und schämt sich nicht, begeistert hinter den Fußballtoren zu stehen. Damit der unendliche Raum der Forschung sich wieder öffnet. Und um zuzunähen oder un- geschehen zu machen was war. Der Gewinn wird auf der Leseseite genauso liegen, wie auf der Seite der Schreiber. Das alles geschieht noch in dieser Nacht, Tagsüber ruht dann der Betrieb. Und man wird erleichtert sagen: Es gelang.

… embedded in this text you can find the 5 poems by Klaus Merz. Just read the five different colors. The writing rule in this case is: use all words of the 5 poems in unchanged order. Although all 5 poems are completely included, the text is obviously not plagiarism.

Embedded Poem

In the next step we will filter out the five poems with the simplest stack machine you can think of. It just counts the number of opening and closing brackets. Words of poem number one are embraced by one bracket, of number two by two, and so on …

((((Aus der Forschung))))
Sie produziert nur noch ((Regelwerk))e, nichts Lebendiges mehr. ((Wir haben die Forschung)), unser Ideal der Vernunft, zu Tode akademisiert. Deshalb braucht das einstige (((Pilotprojekt))) der Aufklärung dringend eine neue (((((Beglaubigung))))). Es (((hatte))) sich, (((im Lauf)))e der Zeit, (im rückwärtigen Raum) der Wissenschaft die Bürokratie breit gemacht. (Was) eben (alles so wächst), wenn keiner hinschaut. Was am Morgen noch leicht hätte ausgemerzt werden können, ist (((((gegen Abend))))) schon mächtig. Die Entscheidung über die Erneuerung der Forschung wurde nun ((auf die Nacht verlegt)). Dann, wenn (((((die Singvögel schweigen))))) und (in uns und um uns) Stille herrscht. Also (((((bitt‘ ich noch einmal))))) zum Widerstand, auch wenn eure (Einsicht und Ekel) möglicherweise zu spät kommen. Schickt also, für unseren Kampf für eine erneuerte Forschung, (((((die Wörter))))) ((((der Meister)))) (((((zu mir))))), ((zwischen zwei und vier)) in der Nacht. (((((Um))))), (mit Glück), ((in der Frühe)) einen Neuanfang zu ermöglichen. Vorher aber ((((kriegt)))) (auch die) erneuerte (Liebe) zur Wissenschaft noch einmal schwere ((((Schläge)))), doch – ich versprech’s – (noch vor den) ersten Schleiern des Morgens ((passiert’s)) dann, den (Tumoren) (((der vergangenen Schicht))) wird der Garaus gemacht. (Die Enkel) schreiben dann (((ein)))e neue Seite im (((Buch))) der Forschung, neue Dinge werden (((((geschehen))))), neue Ideen (wachsen, die Lichtung) wird größer, die dunkle Zeit vergessen. Wie aber wird er wohl sein, der neue Forschertypus? ((((Sein Herz ist wund.)))) Doch ((((er fletscht die Zähne und beißt den Hund.)))) (Im Haar) trägt er Strähnen (und) schämt sich nicht, begeistert (hinter den Fußballtoren) zu stehen. Damit (der unendliche Raum) der Forschung sich wieder öffnet. Und um (((zuzunähen))) (((((oder un- geschehen zu machen was war.))))) Der Gewinn wird (((auf der Leseseite))) genauso liegen, wie auf der Seite der Schreiber. Das alles geschieht noch in dieser Nacht, ((Tagsüber ruht)) dann ((der Betrieb.)) Und man wird erleichtert sagen: (((Es gelang.)))

"""
Author: Georg Trogemann
"""

input_text = """((((Aus der Forschung ))))
Sie produziert nur noch ((Regelwerk ))e, nichts Lebendiges mehr. 
((Wir haben die Forschung )), unser Ideal der Vernunft, zu Tode akademisiert. 
Deshalb braucht das einstige (((Pilotprojekt ))) der Aufklärung dringend eine 
neue (((((Beglaubigung ))))). Es (((hatte ))) sich, (((im Lauf )))e der Zeit, 
(im rückwärtigen Raum ) der Wissenschaft die Bürokratie breit gemacht. 
(Was ) eben (so alles wächst ), wenn keiner hinschaut. Was am Morgen noch 
leicht hätte ausgemerzt werden können, ist (((((gegen Abend ))))) schon mächtig. 
Die Entscheidung über die Erneuerung der Forschung wurde nun ((auf die Nacht verlegt )). 
Dann, wenn (((((die Singvögel schweigen ))))) und (in uns und um uns ) Stille herrscht. 
Also (((((bitt‘ ich noch einmal ))))) zum Widerstand, auch wenn eure (Einsicht und Ekel ) 
möglicherweise zu spät kommen. Schickt also, für unseren Kampf für eine erneuerte 
Forschung, (((((die Wörter ))))) ((((der Meister )))) (((((zu mir ))))), ((zwischen 
zwei und vier )) in der Nacht. (((((Um ))))), (mit Glück ), ((in der Frühe )) einen 
Neuanfang zu ermöglichen. Vorher aber ((((kriegt )))) (auch die ) erneuerte (Liebe ) 
zur Wissenschaft noch einmal schwere ((((Schläge )))), doch – ich versprech’s – 
(noch vor den ) ersten Schleiern des Morgens ((passiert’s )) dann, den (Tumoren ) (((der 
vergangenen Schicht ))) wird der Garaus gemacht. (Die Enkel ) schreiben dann (((ein )))e 
neue Seite im (((Buch ))) der Forschung, neue Dinge werden (((((geschehen ))))), neue 
Ideen (wachsen, die Lichtung ) wird größer, die dunkle Zeit vergessen. Wie aber wird 
er wohl sein, der neue Forschertypus?  ((((Sein Herz ist wund. )))) Doch ((((er fletscht 
die Zähne und beißt den Hund. )))) (Im Haar ) trägt er Strähnen (und ) schämt sich nicht, 
begeistert (hinter den Fußballtoren ) zu stehen. Damit (der unendliche Raum ) der Forschung 
sich wieder öffnet. Und um (((zuzunähen ))) (((((oder un- geschehen zu machen was war. ))))) 
Der Gewinn wird (((auf der Leseseite ))) genauso liegen, wie auf der Seite der Schreiber. 
Das alles geschieht noch in dieser Nacht, ((Tagsüber ruht )) dann ((der Betrieb.)) 
Und man wird erleichtert sagen: (((Es gelang. )))"""

print (input_text)
# If you put in the number 0 you will get the text without the poems
poemNumber = int(input ('\nInput the number of the poem you would like to extract (number between 0 and 5): '))
print('\nPoem number ', poemNumber)
actual_level = 0

stack = []
stack.append('empty')
stack_error = False

output_text = ''

index = 0
while index < len(input_text):
    letter = input_text[index]
    if letter == '(':
        stack.append('(')
    elif letter == ')':
        if stack.pop() == 'empty':
            print ('STACK_ERROR: number of opening and closing brackets not equal')
            stack_error = True
            break
    elif (poemNumber +1) == len(stack):
            output_text = output_text + letter
    index = index + 1
if not(stack_error) and (stack.pop() != 'empty'):
    print ('STACK_ERROR')

print(output_text)
((((Aus der Forschung ))))
Sie produziert nur noch ((Regelwerk ))e, nichts Lebendiges mehr. 
((Wir haben die Forschung )), unser Ideal der Vernunft, zu Tode akademisiert. 
Deshalb braucht das einstige (((Pilotprojekt ))) der Aufklärung dringend eine 
neue (((((Beglaubigung ))))). Es (((hatte ))) sich, (((im Lauf )))e der Zeit, 
(im rückwärtigen Raum ) der Wissenschaft die Bürokratie breit gemacht. 
(Was ) eben (so alles wächst ), wenn keiner hinschaut. Was am Morgen noch 
leicht hätte ausgemerzt werden können, ist (((((gegen Abend ))))) schon mächtig. 
Die Entscheidung über die Erneuerung der Forschung wurde nun ((auf die Nacht verlegt )). 
Dann, wenn (((((die Singvögel schweigen ))))) und (in uns und um uns ) Stille herrscht. 
Also (((((bitt‘ ich noch einmal ))))) zum Widerstand, auch wenn eure (Einsicht und Ekel ) 
möglicherweise zu spät kommen. Schickt also, für unseren Kampf für eine erneuerte 
Forschung, (((((die Wörter ))))) ((((der Meister )))) (((((zu mir ))))), ((zwischen 
zwei und vier )) in der Nacht. (((((Um ))))), (mit Glück ), ((in der Frühe )) einen 
Neuanfang zu ermöglichen. Vorher aber ((((kriegt )))) (auch die ) erneuerte (Liebe ) 
zur Wissenschaft noch einmal schwere ((((Schläge )))), doch – ich versprech’s – 
(noch vor den ) ersten Schleiern des Morgens ((passiert’s )) dann, den (Tumoren ) (((der 
vergangenen Schicht ))) wird der Garaus gemacht. (Die Enkel ) schreiben dann (((ein )))e 
neue Seite im (((Buch ))) der Forschung, neue Dinge werden (((((geschehen ))))), neue 
Ideen (wachsen, die Lichtung ) wird größer, die dunkle Zeit vergessen. Wie aber wird 
er wohl sein, der neue Forschertypus?  ((((Sein Herz ist wund. )))) Doch ((((er fletscht 
die Zähne und beißt den Hund. )))) (Im Haar ) trägt er Strähnen (und ) schämt sich nicht, 
begeistert (hinter den Fußballtoren ) zu stehen. Damit (der unendliche Raum ) der Forschung 
sich wieder öffnet. Und um (((zuzunähen ))) (((((oder un- geschehen zu machen was war. ))))) 
Der Gewinn wird (((auf der Leseseite ))) genauso liegen, wie auf der Seite der Schreiber. 
Das alles geschieht noch in dieser Nacht, ((Tagsüber ruht )) dann ((der Betrieb.)) 
Und man wird erleichtert sagen: (((Es gelang. )))
Input the number of the poem you would like to extract (number between 0 and 5):  0
Poem number  0

Sie produziert nur noch e, nichts Lebendiges mehr. 
, unser Ideal der Vernunft, zu Tode akademisiert. 
Deshalb braucht das einstige  der Aufklärung dringend eine 
neue . Es  sich, e der Zeit, 
 der Wissenschaft die Bürokratie breit gemacht. 
 eben , wenn keiner hinschaut. Was am Morgen noch 
leicht hätte ausgemerzt werden können, ist  schon mächtig. 
Die Entscheidung über die Erneuerung der Forschung wurde nun . 
Dann, wenn  und  Stille herrscht. 
Also  zum Widerstand, auch wenn eure  
möglicherweise zu spät kommen. Schickt also, für unseren Kampf für eine erneuerte 
Forschung,   ,  in der Nacht. , ,  einen 
Neuanfang zu ermöglichen. Vorher aber   erneuerte  
zur Wissenschaft noch einmal schwere , doch – ich versprech’s – 
 ersten Schleiern des Morgens  dann, den   wird der Garaus gemacht.  schreiben dann e 
neue Seite im  der Forschung, neue Dinge werden , neue 
Ideen  wird größer, die dunkle Zeit vergessen. Wie aber wird 
er wohl sein, der neue Forschertypus?   Doch   trägt er Strähnen  schämt sich nicht, 
begeistert  zu stehen. Damit  der Forschung 
sich wieder öffnet. Und um   
Der Gewinn wird  genauso liegen, wie auf der Seite der Schreiber. 
Das alles geschieht noch in dieser Nacht,  dann  
Und man wird erleichtert sagen: