Old lady swallowed a fly: Difference between revisions

m
imported>Arakov
 
(195 intermediate revisions by 80 users not shown)
Line 1:
{{task}}
Present a program which emits the lyrics to the song ''I Knew an Old Lady Who Swallowed a Fly'', taking advantage of the repetitive structure of the song's lyrics.{{draft task}}
 
;Task:
=={{header|C}}==
Present a program which emits the lyrics to the song   ''[[wp:There Was an Old Lady Who Swallowed a Fly|I Knew an Old Lady Who Swallowed a Fly]]'',   taking advantage of the repetitive structure of the song's lyrics.
Boring, ad hoc dictionary based decompression. The encoder was arguably more interesting, though.
<lang c>#include <stdio.h>
 
This song has multiple versions with slightly different lyrics, so all these programs might not emit identical output.
char *dict[] = {
 
"_ha _c _e _p,/Quite absurd_f_p;_`cat,/Fancy that_fcat;_j`dog,/What a hog"
 
"_fdog;_l`pig,/Her mouth_qso big_fpig;_d_r,/She just opened her throat_f_"
{{Template:Strings}}
"r;_icow,/_mhow she_ga cow;_k_o,/It_qrather wonky_f_o;_a_o_bcow,_khorse.."
<br><br>
"./She's dead, of course!/","_a_p_b_e ","/S_t "," to catch the ","fly,/Bu"
 
"t _mwhy s_t fly,/Perhaps she'll die!//_ha","_apig_bdog,_l`","spider,/Tha"
=={{header|11l}}==
"t wr_nj_ntickled inside her;_aspider_b_c",", to_s a ","_sed ","There_qan"
{{trans|Python}}
" old lady who_g","_a_r_bpig,_d","_acat_b_p,_","_acow_b_r,_i","_adog_bcat"
 
",_j","I don't know ","iggled and ","donkey","bird"," was ","goat"," swal"
<syntaxhighlight lang="11l">V animals = [
"low","he_gthe"
(‘fly’, ‘I don't know why she swallowed a fly, perhaps she'll die.’),
(‘spider’, ‘It wiggled and jiggled and tickled inside her.’),
(‘bird’, ‘How absurd, to swallow a bird.’),
(‘cat’, ‘Imagine that, she swallowed a cat.’),
(‘dog’, ‘What a hog, to swallow a dog.’),
(‘goat’, ‘She just opened her throat and swallowed a goat.’),
(‘cow’, ‘I don't know how she swallowed a cow.’),
(‘horse’, ‘She's dead, of course.’)]
 
L(animal_lyric) animals
V i = L.index
V (animal, lyric) = animal_lyric
print("There was an old lady who swallowed a #..\n#.".format(animal, lyric))
 
I animal == ‘horse’
L.break
 
L(predator, prey) zip(animals[(i .< 0).step(-1)], animals[(i - 1 ..).step(-1)])
print("\tShe swallowed the #. to catch the #.".format(predator[0], prey[0]))
 
I animal != ‘fly’
print(animals[0][1])
print()</syntaxhighlight>
 
=={{header|8080 Assembly}}==
<syntaxhighlight lang="8080asm"> org 100h
mvi c,-1 ; C = verse counter
verse: inr c
lxi d,lady ; There was an old lady who swallowed a ...
call prstr
mov e,c ; <animal>
call pbeast
lxi d,comma
call prstr
mov e,c ; verse
call pverse
mov a,c ; is this the first verse?
ana a
jz verse ; then we're not swallowing animals yet
cpi 7 ; otherwise, is the lady dead yet?
rz ; if so, stop.
mov b,c ; otherwise, start swallowing
swallo: lxi d,swlw1 ; She swallowed the
call prstr
mov e,b ; <current animal>
call pbeast
lxi d,swlw2 ; to catch the
call prstr
dcr b
push psw ; store state (is B zero now)
mov e,b ; <previous animal>
call pbeast
lxi d,comma
call prstr
mov a,b
cpi 2
mov e,b ; print associated verse if < 2
cc pverse
pop psw ; was B zero?
jnz swallo ; if not, swallow more
jmp verse ; if so, next verse
prstr: push b ; print string in DE
mvi c,9
call 5
pop b
ret
pverse: lxi h,verses
jmp pstrn
pbeast: lxi h,beasts
;;; Print the E'th string from the list at HL
pstrn: push b ; keep counters in B and C
mvi a,'$' ; end-of-string marker
inr e
pscan: cmp m ; keep going until we find one
inx h
jnz pscan
dcr e ; is this the one we wanted?
jnz pscan ; if not, keep going
xchg ; otherwise, put in DE
mvi c,9 ; print string using CP/M
call 5
pop b ; restore counters
ret
lady: db 'There was an old lady who swallowed a '
beasts: db '$fly$spider$bird$cat$dog$goat$cow$horse'
verses: db '$I don',39,'t know why she swallowed that fly -'
db ' Perhaps she',39,'ll die.',13,10,13,10
db '$That wiggled and jiggled and tickled inside her!',13,10
db '$How absurd to swallow a bird',13,10
db '$Imagine that! She swallowed a cat!',13,10
db '$What a hog to swallow a dog',13,10
db '$She just opened her throat and swallowed that goat',13,10
db '$I don',39,'t know how she swallowed that cow',13,10
db '$She',39,'s dead, of course.',13,10,'$'
swlw1: db 'She swallowed the $'
swlw2: db ' to catch the $'
comma: db ',',13,10,'$'</syntaxhighlight>
 
=={{header|8086 Assembly}}==
<syntaxhighlight lang="asm"> cpu 8086
org 100h
section .text
mov bl,-1 ; BL = verse counter
verse: inc bl
mov dx,lady ; There was an old lady who swallowed
call prstr
mov dl,bl ; <animal>
call pbeast
mov dx,comma
call prstr
mov dl,bl ; verse
call pverse
test bl,bl ; is this the first verse?
jz verse ; then we're not swallowing anything yet
cmp bl,7 ; otherwise, is the lady dead yet?
je stop ; if so, stop.
mov bh,bl ; otherwise, start swallowing
swallo: mov dx,swlw1 ; She swallowed the
call prstr
mov dl,bh ; <current animal>
call pbeast
mov dx,swlw2 ; to catch the
call prstr
dec bh ; <previous animal>
mov dl,bh
call pbeast
mov dx,comma
call prstr
cmp bh,2 ; print associated verse if BH<2
jae .next
mov dl,bh
call pverse
.next: test bh,bh ; is BH zero yet?
jnz swallo ; if not, swallow next animal
jmp verse ; otherwise, print next verse
pverse: mov di,verses ; Print verse DL
jmp pstrn
pbeast: mov di,beasts ; Print animal DL
;;; Print DL'th string from [DI]
pstrn: inc dl
mov al,'$' ; end-of-string marker
.scan: mov cx,-1
repne scasb
dec dl
jnz .scan
mov dx,di
prstr: mov ah,9 ; MS-DOS syscall to print a string
int 21h
stop: ret
section .data
lady: db 'There was an old lady who swallowed a '
beasts: db '$fly$spider$bird$cat$dog$goat$cow$horse'
verses: db '$I don',39,'t know why she swallowed that fly -'
db ' Perhaps she',39,'ll die.',13,10,13,10
db '$That wiggled and jiggled and tickled inside her!',13,10
db '$How absurd to swallow a bird',13,10
db '$Imagine that! She swallowed a cat!',13,10
db '$What a hog to swallow a dog',13,10
db '$She just opened her throat and swallowed that goat',13,10
db '$I don',39,'t know how she swallowed that cow',13,10
db '$She',39,'s dead, of course.',13,10,'$'
swlw1: db 'She swallowed the $'
swlw2: db ' to catch the $'
comma: db ',',13,10,'$'</syntaxhighlight>
 
=={{header|Ada}}==
<syntaxhighlight lang="ada">with Ada.Text_IO, Ada.Containers.Indefinite_Doubly_Linked_Lists; use Ada.Text_IO;
 
procedure Swallow_Fly is
 
package Strings is new Ada.Containers.Indefinite_Doubly_Linked_Lists(String);
 
Lines, Animals: Strings.List;
 
procedure Swallow(Animal: String;
Second_Line: String;
Permanent_Second_Line: Boolean := True) is
 
procedure Print(C: Strings.Cursor) is
begin
Put_Line(Strings.Element(C));
end Print;
 
begin
Put_Line("There was an old lady who swallowed a " & Animal & ",");
Put_Line(Second_Line);
if not Animals.Is_Empty then
Lines.Prepend("She swallowed the " & Animal & " to catch the " &
Animals.Last_Element & ",");
end if;
Lines.Iterate(Print'Access);
New_Line;
if Permanent_Second_Line then
Lines.Prepend(Second_Line);
end if;
Animals.Append(Animal); -- you need "to catch the " most recent animal
end Swallow;
 
procedure Swallow_TSA(Animal: String; Part_Of_Line_2: String) is
begin
Swallow(Animal, Part_Of_Line_2 &", to swallow a " & Animal & ";", False);
end Swallow_TSA;
 
procedure Swallow_SSA(Animal: String; Part_Of_Line_2: String) is
begin
Swallow(Animal, Part_Of_Line_2 &" she swallowed a " & Animal & ";", False);
end Swallow_SSA;
 
begin
Lines.Append("Perhaps she'll die!");
 
Swallow("fly", "But I don't know why she swallowed the fly,");
Swallow("spider", "That wriggled and jiggled and tickled inside her;");
Swallow_TSA("bird", "Quite absurd");
Swallow_TSA("cat", "Fancy that");
Swallow_TSA("dog", "What a hog");
Swallow_TSA("pig", "Her mouth was so big");
Swallow_TSA("goat","She just opened her throat");
Swallow_SSA("cow", "I don't know how");
Swallow_TSA("donkey", "It was rather wonky");
 
Put_Line("There was an old lady who swallowed a horse ...");
Put_Line("She's dead, of course!");
end Swallow_Fly;</syntaxhighlight>
 
=={{header|ALGOL 68}}==
===Using Logic===
{{works with|ALGOL 68|Revision 1 - no extensions to language used.}}
{{works with|ALGOL 68G|Any - tested with release [http://sourceforge.net/projects/algol68/files/algol68g/algol68g-1.18.0/algol68g-1.18.0-9h.tiny.el5.centos.fc11.i386.rpm/download 1.18.0-9h.tiny].}}
{{wont work with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d] - due to extensive use of '''format'''[ted] ''transput''.}}
<syntaxhighlight lang="algol68">#!/usr/local/bin/a68g --script #
 
STRING sw=" swallow ",swd=sw[:UPB sw-1]+"ed ", tsa=". To"+sw+"a";
 
INT count prev := 0; [9]STRING prev;
 
PROC vs = (STRING in wot,[]STRING co)VOID: (
STRING wot = " "+in wot;
printf(($g$,"I know an old lady who",swd,"a",wot,".",$l$));
IF UPB co = 1 THEN
printf(($gl$,co))
ELIF UPB co > 1 THEN
printf(($g$,co,wot+".",$l$))
FI;
IF count prev NE UPB prev THEN
prev[count prev+:=1]:=wot;
FOR i FROM count prev BY -1 TO 2 DO
printf(($gl$,"She"+swd+"the"+prev[i]+" to catch the"+prev[i-1]+"."))
OD;
printf(($gl$,"I don't know why she"+swd+"the fly.",
"Perhaps she'll die.", $l$))
FI
);
 
vs("fly",());
vs("spider","That wriggled and jiggled and tickled inside her.");
vs("Bird",("Quite absurd",tsa));
vs("Cat",("Fancy that",tsa));
vs("Dog",("What a hog",tsa));
vs("Pig",("Her mouth was so big",tsa));
vs("Goat",("She just opened her throat",tsa));
vs("Cow",("I don't know how",tsa));
vs("Donkey",("It was rather wonky",tsa));
vs("Horse","She's dead, of course!")</syntaxhighlight>
 
===Using a dictionary===
{{works with|ALGOL 68|Revision 1 - no extensions to language used.}}
{{works with|ALGOL 68G|Any - tested with release [http://sourceforge.net/projects/algol68/files/algol68g/algol68g-1.18.0/algol68g-1.18.0-9h.tiny.el5.centos.fc11.i386.rpm/download 1.18.0-9h.tiny].}}
{{wont work with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d] - due to extensive use of '''format'''[ted] ''transput''.}}
<syntaxhighlight lang="algol68">#!/usr/local/bin/a68g --script #
 
STRING a="WBXAY",b="WCXBY",c="WDXCY",d="WEXDY",
e="WFXEY",f="WGXFY",g="WHXGY",h="WIXHY",
k="K",z="Z",l="";
 
[]STRING
w=( # Assuming ASCII ordering #
"fly","spider","Bird","Cat","Dog","Pig","Goat","Cow","Donkey","Horse",
 
"I don't know why she swallowed the fly.",
"That wriggled and jiggled and tickled inside her.",
"Quite absurd","Fancy that","What a hog",
"Her mouth was so big","She just opened her throat",
"I don't know how","It was rather wonky",
"She's dead, of course!",
 
"I know an old lady who swallowed a ",
". To swallow a ",
"She swallowed the "," to catch the ",".",
"Perhaps she'll die."),
v=(
"UAY",k,z,l,
"UBY","L",a,k,z,l,
"UCY","MVCY",b,a,k,z,l,
"UDY","NVDY",c,b,a,k,z,l,
"UEY","OVEY",d,c,b,a,k,z,l,
"UFY","PVFY",e,d,c,b,a,k,z,l,
"UGY","QVGY",f,e,d,c,b,a,k,z,l,
"UHY","RVHY",g,f,e,d,c,b,a,k,z,l,
"UIY","SVIY",h,g,f,e,d,c,b,a,k,z,l,
"UJY","T");
 
FOR i TO UPB v DO
FOR j TO UPB v[i] DO
print(w[ABS v[i][j] - ABS "A" + 1])
OD;
print(new line)
OD</syntaxhighlight>
 
=={{header|APL}}==
{{works with|Dyalog APL}}
<syntaxhighlight lang="apl">oldLady←{
N←⎕TC[3]
a←'fly' 'spider' 'bird' 'cat' 'dog' 'goat' 'cow' 'horse'
v←⊂'I don''t know why she swallowed that fly - Perhaps she''ll die',N
v←v,⊂'That wiggled and jiggled and tickled inside her!'
v←v,⊂'How absurd to swallow a bird'
v←v,⊂'Imagine that! She swallowed a cat!'
v←v,⊂'What a hog to swallow a dog'
v←v,⊂'She just opened her throat and swallowed that goat'
v←v,⊂'I don''t know how she swallowed that cow'
v←v,⊂'She''s dead, of course.'
l←'There was an old lady who swallowed a '
∊{
∊l,a[⍵],N,v[⍵],N,(⍵<8)/{
⍵=0:''
r←'She swallowed the ',a[⍵],' to catch the ',a[⍵-1],N
r,(⍵≤3)/v[⍵-1],N
}¨⌽1↓⍳⍵
}¨⍳8
}</syntaxhighlight>
 
=={{header|Applesoft BASIC}}==
<syntaxhighlight lang="gwbasic"> 100 FOR N = 0 TO 7: READ A$(N),E$(N): NEXT N:N = N - 1
110 FOR C = 1 TO N
120 PRINT M$M$"THERE WAS AN OLD LADY WHO SWALLOWED A "A$(C);
130 LET M$ = CHR$ (13)
140 IF C > 1 THEN PRINT M$E$(C);: IF C < N THEN FOR B = C TO 2 STEP - 1: PRINT M$A$(0)A$(B)" TO CATCH THE "A$(B - 1) MID$ (",;",1 + (B = 2),1);: NEXT B
150 IF C < N THEN PRINT M$E$(1)E$(0);
160 NEXT C
170 END
200 DATA" SHE SWALLOWED A "," - PERHAPS SHE'LL DIE!"
210 DATA"FLY","I DON'T KNOW WHY SHE SWALLOWED A FLY"
220 DATA"SPIDER","THAT WRIGGLED AND JIGGLED AND TICKLED INSIDE HER;"
230 DATA"BIRD","HOW ABSURD TO SWALLOW A BIRD."
240 DATA"CAT","FANCY THAT TO SWALLOW A CAT!"
250 DATA"DOG","WHAT A HOG, TO SWALLOW A DOG;"
260 DATA"COW","I DON'T KNOW HOW SHE SWALLOWED A COW,"
270 DATA"HORSE","SHE'S DEAD, OF COURSE!"</syntaxhighlight>
=={{header|ARM Assembly}}==
<syntaxhighlight lang="text">.global _start
_start: eor r8,r8,r8 @ Verse counter
verse: add r8,r8,#1 @ Next verse
ldr r1,=lady @ There was an old lady who swallowed...
bl pstr
mov r2,r8
bl pbeast @ <an animal>
ldr r1,=comma
bl pstr
mov r2,r8
bl pverse @ Print the corresponding verse
cmp r8,#1 @ First verse?
beq verse @ Then we're not swallowing anything yet
cmp r8,#8 @ Otherwise, is the lady dead yet?
moveq r7,#1 @ If so, stop.
swieq #0
mov r9,r8 @ Otherwise, start swallowing
swallo: ldr r1,=swa1 @ She swallowed the ...
bl pstr
mov r2,r9 @ <current animal>
bl pbeast
ldr r1,=swa2 @ ...to catch the...
bl pstr
sub r9,r9,#1
mov r2,r9 @ <previous animal>
bl pbeast
ldr r1,=comma
bl pstr
cmp r9,#2 @ Print the associated verse for 2 and 1
movle r2,r9
blle pverse
cmp r9,#1 @ Last animal?
bgt swallo @ If not, keep swallowing
b verse @ But if so, next verse
pverse: ldr r1,=verses @ Print verse R2
b pstrn
pbeast: ldr r1,=beasts @ Print animal R2
pstrn: ldrb r0,[r1],#1 @ R2'th string from R1 - get byte
tst r0,r0 @ Zero yet?
bne pstrn @ If not keep going
subs r2,r2,#1 @ Is this the right string?
bne pstrn @ If not keep going
@ Print 0-terminated string starting at R1 using Linux.
pstr: mov r2,r1 @ Find end
1: ldrb r0,[r2],#1 @ Get current byte
tst r0,r0 @ Zero yet?
bne 1b @ If not keep scanning
sub r2,r2,r1 @ Calculate string length
mov r0,#1 @ 1 = Linux stdout
mov r7,#4 @ 4 = Linux write syscall
push {lr} @ Keep link register
swi #0 @ Do syscall
pop {lr} @ Restore link register
bx lr
lady: .ascii "There was an old lady who swallowed a "
beasts: .ascii "\0fly\0spider\0bird\0cat\0dog\0goat\0cow\0horse"
verses: .ascii "\0I don't know why she swallowed that fly - "
.ascii "Perhaps she'll die.\n\n"
.ascii "\0That wiggled and jiggled and tickled inside her!\n"
.ascii "\0How absurd to swallow a bird\n"
.ascii "\0Imagine that! She swallowed a cat!\n"
.ascii "\0What a hog to swallow a dog\n"
.ascii "\0She just opened her throat and swallowed that goat\n"
.ascii "\0I don't know how she swallowed that cow\n"
.asciz "\0She's dead, of course.\n"
swa1: .asciz "She swallowed the "
swa2: .asciz " to catch the "
comma: .asciz ",\n" </syntaxhighlight>
 
=={{header|AutoHotkey}}==
{{works with|AutoHotkey 1.1}}
<syntaxhighlight lang="autohotkey">Animals := [["fly", "I don't know why she swallowed the "]
, ["spider", "That wriggled and jiggled and tickled inside her"]
, ["bird", "Quite absurd"]
, ["cat", "Fancy that"]
, ["dog", "What a hog"]
, ["pig", "Her mouth was so big"]
, ["goat", "She just opened her throat"]
, ["cow", "I don't know how"]
, ["donkey", "It was rather wonky"]
, ["horse", "She's dead, of course!"]]
 
for i, V in Animals {
Output .= "I know an old lady who swallowed a " V.1 ".`n"
. (i = 1 ? Saved := V.2 V.1 ".`nPerhaps she'll die.`n`n"
: V.2 (i = Animals.MaxIndex() ? "" : (i = 2 ? "" : ". To swallow a " V.1) ".`n"
. (Saved := "She swallowed the " V.1 " to catch the " Animals[i - 1].1 ".`n" Saved)))
}
 
MsgBox, % Output</syntaxhighlight>
 
=={{header|AWK}}==
<syntaxhighlight lang="awk">
# syntax: GAWK -f OLD_LADY_SWALLOWED_A_FLY.AWK
BEGIN {
arr[++i] = "fly/"
arr[++i] = "spider/That wriggled and jiggled and tickled inside her"
arr[++i] = "bird/Quite absurd@"
arr[++i] = "cat/Fancy that@"
arr[++i] = "dog/What a hog@"
arr[++i] = "pig/Her mouth was so big@"
arr[++i] = "goat/Opened her throat and down went the goat"
arr[++i] = "cow/I don't know how@"
arr[++i] = "donkey/It was rather wonkey@"
arr[++i] = "horse/She's dead of course"
leng = i # array length
for (i=1; i<=leng; i++) {
s = arr[i]
A[i] = substr(s,1,index(s,"/")-1) # critter name
text = substr(s,index(s,"/")+1)
sub(/@/," to swallow a "A[i],text)
printf("I know an old lady who swallowed a %s.\n",A[i])
if (text != "") {
printf("%s.\n",text)
}
if (i == leng) {
break
}
for (j=i; j>1; j--) {
printf("She swallowed the %s to catch the %s.\n",A[j],A[j-1])
}
printf("I don't know why she swallowed the fly.\n")
printf("Perhaps she'll die.\n\n")
}
exit(0)
}
</syntaxhighlight>
 
=={{header|Babel}}==
<syntaxhighlight lang="babel">((main {fly !})
 
(fly
{{"There was an old lady who swallowed a " <<
iter 1 - dup
<- 0 animal ! nl << ->
1 animal ! <<
{iter 10 ~=}{
" " <<
{iter 1 =}{last}{fnord} ifte
iter 1 - 0 animal ! nl <<
{"She swallowed the " <<
this_iter ! 0 animal ! <<
" to catch the " <<
next_iter ! 0 animal ! nl <<
{iter 2 =}
{8 1 animal ! nl <<}
{fnord}
ifte}
11 iter - 1 -
times}
{fnord}
ifte
"But I don't know why she swallowed the fly\nPerhaps she'll die\n\n" <<}
animals len
times})
 
(next_iter {10 iter - })
(this_iter {next_iter ! 1 -})
 
(animal { <- <- animals -> ith -> ith})
 
-- There are 10 animals
(animals
(("horse" "She's dead of course...\n")
("donkey" "It was rather wonkey! To swallow a")
("cow" "I don't know how she swallowed a")
("goat" "She just opened her throat! And swallowed the")
("pig" "Her mouth was so big, to swallow a")
("dog" "What a hog! To swallow a")
("cat" "Fancy that! She swallowed a")
("bird" "Quite absurd to swallow a")
("spider" "That wriggled and jiggled and tickled inside her")
("fly" " "))))
</syntaxhighlight>
 
=={{header|Batch File}}==
<syntaxhighlight lang="dos">@echo off
setlocal enabledelayedexpansion
 
%== An "ugly" pseudo-array ===%
set pseudo=^
fly/@^
spider/That_wiggled_and_jiggled_and_tickled_inside_her,@^
bird/How_absurd,_to_swallow_a_bird,@^
cat/Imagine_that._She_swallowed_a_cat,@^
dog/What_a_hog_to_swallow_a_dog,@^
goat/She_just_opened_her_throat_and_swallowed_that_goat,@^
cow/I_don't_know_how_she_swallowed_that_cow,@^
horse/She's_dead_of_course...
 
%== Counting and seperating... ===%
set str=!pseudo!
:count
if "!str!"=="" goto print_song
for /f "tokens=1,* delims=@" %%A in ("!str!") do (
set /a cnt+=1
for /f "tokens=1,2 delims=/" %%C in ("%%A") do (
set animal!cnt!=%%C
set comment!cnt!=%%D
)
set str=%%B
)
goto count
 
%== Print the song ===%
:print_song
for /l %%i in (1,1,!cnt!) do (
echo There was an old lady who swallowed a !animal%%i!.
if not "!comment%%i!"=="" echo !comment%%i:_= !
if %%i equ !cnt! goto done
 
for /l %%j in (%%i,-1,2) do (
set/a prev=%%j-1
call set prev_animal=%%animal!prev!%%
echo She swallowed the !animal%%j! to catch the !prev_animal!.
)
echo I don't know why she swallowed the fly.
echo Perhaps she'll die.
echo.
)
:done
pause>nul&exit/b 0</syntaxhighlight>
 
=={{header|BBC BASIC}}==
This prints the lyrics from the Wikipedia page, more or less. I don't know anything about goats and donkeys and the like.
<syntaxhighlight lang="bbcbasic">REM >oldlady
DIM swallowings$(6, 1)
swallowings$() = "fly", "+why", "spider", "That wriggled and wiggled and tickled inside her", "bird", ":How absurd", "cat", ":Fancy that", "dog", ":What a hog", "cow", "+how", "horse", "She's dead, of course"
FOR i% = 0 TO 6
PRINT "There was an old lady who swallowed a "; swallowings$(i%, 0); "..."
PROC_comment_on_swallowing(swallowings$(i%, 0), swallowings$(i%, 1))
IF i% > 0 AND i% < 6 THEN
FOR j% = i% TO 1 STEP -1
PRINT "She swallowed the "; swallowings$(j%, 0); " to catch the "; swallowings$(j% - 1, 0); ","
NEXT
PROC_comment_on_swallowing(swallowings$(0, 0), swallowings$(0, 1))
ENDIF
PRINT
NEXT
END
:
DEF PROC_comment_on_swallowing(animal$, observation$)
CASE LEFT$(observation$, 1) OF
WHEN "+":
PRINT "I don't know "; MID$(observation$, 2); " she swallowed a "; animal$;
IF animal$ = "fly" THEN PRINT " -- perhaps she'll die";
PRINT "!"
WHEN ":"
PRINT MID$(observation$, 2); ", to swallow a "; animal$; "!"
OTHERWISE
PRINT observation$; "!"
ENDCASE
ENDPROC</syntaxhighlight>
 
=={{header|BCPL}}==
<syntaxhighlight lang="bcpl">get "libhdr"
 
let animal(n) =
n=0 -> "fly", n=1 -> "spider", n=2 -> "bird",
n=3 -> "cat", n=4 -> "dog", n=5 -> "goat",
n=6 -> "cow", n=7 -> "horse", valof finish
let line(n) =
n=0 -> "I don't know why she swallowed that fly,*NPerhaps she'll die.*N",
n=1 -> "That wiggled and jiggled and tickled inside her",
n=2 -> "How absurd to swallow a bird",
n=3 -> "Imagine that, she swallowed a cat!",
n=4 -> "What a hog to swallow a dog",
n=5 -> "She just opened her throat and swallowed that goat",
n=6 -> "I don't know how she swallowed that cow",
n=7 -> "She's dead, of course.",
valof finish
 
let verse(n) be
$( writef("There was an old lady who swallowed a %S,*N", animal(n))
writef("%S*N", line(n))
unless n=7 for i=n to 1 by -1
$( writef("She swallowed the %S to catch the %S,*N",
animal(i), animal(i-1))
if i <= 2 do writef("%S*N", line(i-1))
$)
$)
 
let start() be for n=0 to 7 do verse(n)</syntaxhighlight>
 
=={{header|Befunge}}==
We start with a collection of reusable phrases stored as a linked list. We then build up the sequence of indices into that list necessary to produce the song (this step is largely programmatic, because of the repetitive nature, although some of the verses require special case handling). Finally we iterate over the indices and print out the associated phrases.
 
<syntaxhighlight lang="befunge">055*46*146*1->00p 36268>5\:4\:2v >\#%"O"/#:3#:+#< g48*- >1-:!#v_\1+::"O"%\"O"/v
>-#2:#\8#1`#:|#-1:-1\7_^#`g00:+<>\#%"O"/#::$#<3#$+g48*-v^\,+*+ 55!:*!!-"|":g+3<
>$ 36 26 58 49 81 36 26 10 \1-:#^\_^#:-1\+<00_@#:>#<$<
DI know an old lady who swallowed a F.|I don't know why she swallowed the 8.|Pe
rhaps she'll die.||5.|She swallowed the / to catch the $fly0. To swallow a 'spi
derS.|That wriggled and jiggled and tickled inside her%Bird/.|Quite absurd$Cat-
.|Fancy that$Dog-.|What a hog$Pig7.|Her mouth was so big%Goat=.|She just opened
her throat$Cow3.|I don't know how'Donkey6.|It was rather wonky&Horse:.|She's d
ead, of course!|</syntaxhighlight>
 
=={{header|C}}==
<syntaxhighlight lang="c">#include <stdio.h>
static char const *animals[] = {
"fly",
"spider",
"bird",
"cat",
"dog",
"goat",
"cow",
"horse"
};
static char const *verses[] = {
"I don't know why she swallowed that fly.\nPerhaps she'll die\n",
"That wiggled and jiggled and tickled inside her",
"How absurd, to swallow a bird",
"Imagine that. She swallowed a cat",
"What a hog to swallow a dog",
"She just opened her throat and swallowed that goat",
"I don't know how she swallowed that cow",
"She's dead of course"
};
 
#define LEN(ARR) (sizeof ARR / sizeof *ARR)
int print(char *c, int s)
 
int main(void)
{
for (size_t i = 0; i < LEN(animals); i++) {
do {
printf("There was an old lady who swallowed a %s\n%s\n", animals[i], verses[i]);
if (s) s = print(dict[*c - 95], 0);
for (size_t j = i; j > 0 && i < LEN(animals) - 1; j--) {
else if (*c == '_') s = 1;
printf("She swallowed the %s to catch the %s\n", animals[j], animals[j-1]);
else putchar(*c == '/' ? '\n' : *c);
if (j == 1) {
} while (*++c);
printf("%s\n", verses[0]);
return s;
}
}
}
}
}</syntaxhighlight>
 
=={{header|C sharp|C#}}==
int main()
<syntaxhighlight lang="csharp">using System;
 
namespace OldLady
{
internal class Program
print(dict[0], 0);
{
return 0;
private const string reason = "She swallowed the {0} to catch the {1}";
}</lang>
private static readonly string[] creatures = {"fly", "spider", "bird", "cat", "dog", "goat", "cow", "horse"};
 
private static readonly string[] comments =
{
"I don't know why she swallowed that fly.\nPerhaps she'll die\n",
"That wiggled and jiggled and tickled inside her",
"How absurd, to swallow a bird",
"Imagine that. She swallowed a cat",
"What a hog to swallow a dog",
"She just opened her throat and swallowed that goat",
"I don't know how she swallowed that cow",
"She's dead of course"
};
 
private static void Main()
{
int max = creatures.Length;
for (int i = 0; i < max; i++)
{
Console.WriteLine("There was an old lady who swallowed a {0}", creatures[i]);
Console.WriteLine(comments[i]);
for (int j = i; j > 0 && i < max - 1; j--)
{
Console.WriteLine(reason, creatures[j], creatures[j - 1]);
if (j == 1)
{
Console.WriteLine(comments[j - 1]);
}
}
}
Console.Read();
}
}
}</syntaxhighlight>
 
=={{header|C++}}==
{{trans|C#}}
<syntaxhighlight lang="cpp">#include <iostream>
 
const char *CREATURES[] = { "fly", "spider", "bird", "cat", "dog", "goat", "cow", "horse" };
const char *COMMENTS[] = {
"I don't know why she swallowed that fly.\nPerhaps she'll die\n",
"That wiggled and jiggled and tickled inside her",
"How absurd, to swallow a bird",
"Imagine that. She swallowed a cat",
"What a hog to swallow a dog",
"She just opened her throat and swallowed that goat",
"I don't know how she swallowed that cow",
"She's dead of course"
};
 
int main() {
auto max = sizeof(CREATURES) / sizeof(char*);
for (size_t i = 0; i < max; ++i) {
std::cout << "There was an old lady who swallowed a " << CREATURES[i] << '\n';
std::cout << COMMENTS[i] << '\n';
for (int j = i; j > 0 && i < max - 1; --j) {
std::cout << "She swallowed the " << CREATURES[j] << " to catch the " << CREATURES[j - 1] << '\n';
if (j == 1)
std::cout << COMMENTS[j - 1] << '\n';
}
}
 
return 0;
}</syntaxhighlight>
{{out}}
<pre>There was an old lady who swallowed a fly
I don't know why she swallowed that fly.
Perhaps she'll die
 
There was an old lady who swallowed a spider
That wiggled and jiggled and tickled inside her
She swallowed the spider to catch the fly
I don't know why she swallowed that fly.
Perhaps she'll die
 
There was an old lady who swallowed a bird
How absurd, to swallow a bird
She swallowed the bird to catch the spider
She swallowed the spider to catch the fly
I don't know why she swallowed that fly.
Perhaps she'll die
 
There was an old lady who swallowed a cat
Imagine that. She swallowed a cat
She swallowed the cat to catch the bird
She swallowed the bird to catch the spider
She swallowed the spider to catch the fly
I don't know why she swallowed that fly.
Perhaps she'll die
 
There was an old lady who swallowed a dog
What a hog to swallow a dog
She swallowed the dog to catch the cat
She swallowed the cat to catch the bird
She swallowed the bird to catch the spider
She swallowed the spider to catch the fly
I don't know why she swallowed that fly.
Perhaps she'll die
 
There was an old lady who swallowed a goat
She just opened her throat and swallowed that goat
She swallowed the goat to catch the dog
She swallowed the dog to catch the cat
She swallowed the cat to catch the bird
She swallowed the bird to catch the spider
She swallowed the spider to catch the fly
I don't know why she swallowed that fly.
Perhaps she'll die
 
There was an old lady who swallowed a cow
I don't know how she swallowed that cow
She swallowed the cow to catch the goat
She swallowed the goat to catch the dog
She swallowed the dog to catch the cat
She swallowed the cat to catch the bird
She swallowed the bird to catch the spider
She swallowed the spider to catch the fly
I don't know why she swallowed that fly.
Perhaps she'll die
 
There was an old lady who swallowed a horse
She's dead of course</pre>
 
=={{header|CLU}}==
<syntaxhighlight lang="clu">old_lady = cluster is swallow
rep = null
own animals: array[string] := array[string]$[
"fly", "spider", "bird", "cat",
"dog", "goat", "cow", "horse"
]
own lines: array[string] := array[string]$[
"I don't know why she swallowed that fly.\nPerhaps she'll die.\n",
"That wiggled and jiggled and tickled inside her",
"How absurd to swallow a bird",
"Imagine that, she swallowed a cat!",
"What a hog to swallow a dog",
"She just opened her throat and swallowed that goat",
"I don't know how she swallowed that cow",
"She's dead, of course."
]
verse = proc (s: stream, n: int)
stream$putl(s, "There was an old lady who swallowed a " || animals[n])
stream$putl(s, lines[n])
if n=8 then return end
for i: int in int$from_to_by(n, 2, -1) do
stream$putl(s, "She swallowed the " || animals[i]
|| " to catch the " || animals[i-1])
if i <= 3 then stream$putl(s, lines[i-1]) end
end
end verse
swallow = proc (s: stream)
for i: int in int$from_to(1, 8) do
verse(s, i)
end
end swallow
end old_lady
 
start_up = proc ()
old_lady$swallow(stream$primary_output())
end start_up</syntaxhighlight>
 
=={{header|COBOL}}==
<syntaxhighlight lang="cobol"> IDENTIFICATION DIVISION.
PROGRAM-ID. OLD-LADY.
 
DATA DIVISION.
WORKING-STORAGE SECTION.
 
01 LYRICS.
03 THERE-WAS PIC X(38) VALUE
"There was an old lady who swallowed a ".
03 SHE-SWALLOWED PIC X(18) VALUE "She swallowed the ".
03 TO-CATCH PIC X(14) VALUE " to catch the ".
01 ANIMALS.
03 FLY.
05 NAME PIC X(6) VALUE "fly".
05 VERSE PIC X(60) VALUE
"I don't know why she swallowed a fly. Perhaps she'll die.".
03 SPIDER.
05 NAME PIC X(6) VALUE "spider".
05 VERSE PIC X(60) VALUE
"That wiggled and jiggled and tickled inside her.".
03 BIRD.
05 NAME PIC X(6) VALUE "bird".
05 VERSE PIC X(60) VALUE
"How absurd, to swallow a bird.".
03 CAT.
05 NAME PIC X(6) VALUE "cat".
05 VERSE PIC X(60) VALUE
"Imagine that, she swallowed a cat.".
03 DOG.
05 NAME PIC X(6) VALUE "dog".
05 VERSE PIC X(60) VALUE
"What a hog, to swallow a dog.".
03 GOAT.
05 NAME PIC X(6) VALUE "goat".
05 VERSE PIC X(60) VALUE
"She just opened her throat and swallowed that goat.".
03 COW.
05 NAME PIC X(6) VALUE "cow".
05 VERSE PIC X(60) VALUE
"I don't know how she swallowed that cow.".
03 HORSE.
05 NAME PIC X(6) VALUE "horse".
05 VERSE PIC X(60) VALUE
"She's dead, of course.".
01 ANIMAL-ARRAY REDEFINES ANIMALS.
03 ANIMAL OCCURS 8 TIMES.
05 NAME PIC X(6).
05 VERSE PIC X(60).
01 MISC.
03 LINE-OUT PIC X(80).
03 A-IDX PIC 9(2).
03 S-IDX PIC 9(2).
 
PROCEDURE DIVISION.
MAIN SECTION.
PERFORM DO-ANIMAL
VARYING A-IDX FROM 1 BY 1 UNTIL A-IDX > 8.
STOP RUN.
 
DO-ANIMAL SECTION.
MOVE SPACES TO LINE-OUT.
STRING
THERE-WAS DELIMITED BY SIZE,
NAME OF ANIMAL(A-IDX) DELIMITED BY SPACE,
","
INTO LINE-OUT
END-STRING.
DISPLAY LINE-OUT.
IF A-IDX > 1 THEN
DISPLAY VERSE OF ANIMAL(A-IDX)
END-IF.
IF A-IDX = 8 THEN
EXIT SECTION
END-IF.
PERFORM DO-SWALLOW
VARYING S-IDX FROM A-IDX BY -1 UNTIL S-IDX = 1.
DISPLAY VERSE OF ANIMAL(1).
DISPLAY SPACES.
 
DO-SWALLOW SECTION.
MOVE SPACES TO LINE-OUT.
STRING
SHE-SWALLOWED DELIMITED BY SIZE,
NAME OF ANIMAL(S-IDX) DELIMITED BY SPACE,
TO-CATCH DELIMITED BY SIZE,
NAME OF ANIMAL(S-IDX - 1) DELIMITED BY SPACE
INTO LINE-OUT
END-STRING.
DISPLAY LINE-OUT.
</syntaxhighlight>
 
=={{header|Commodore BASIC}}==
The portion of the program that handles the lyric logic (the "No Sound" version) is universal and should work across all Commodore models. Since a sound chip is available in Commodore BASIC on the C64, Plus/4, and 128, it is not difficult to take advantage of this. The 64 and Plus/4 versions demonstrate a very rudimentary music player based on the syntax used for the Commodore 128's PLAY command (thus making the data statements nearly identical in those three versions.)
 
The music is not quite as procedural as the lyric strings, since the music is tailored to the unique number of syllables for each phrase, however, each verse does utilize three basic music phrases that can be iterated through.
 
===Commodore BASIC (No Sound)===
<syntaxhighlight lang="gwbasic">
1 rem rosetta code
2 rem old lady who swallowed a fly
5 print chr$(147);chr$(14)
10 dim a$(10),ex$(10),mu$(8,3):a=1
15 for i=1 to 8:read a$(i),ex$(i):next i
20 for c=1 to 8
30 print chr$(147):print " Old Lady Who Swallowed A Fly ":print
40 print "I know an old lady who swallowed"
45 print " a ";a$(c):gosub 200
50 for bc=c to 1 step -1
55 if bc=c or bc<=2 then print ex$(bc):gosub 200
57 if bc=8 then for t=1 to 1500:next
60 if bc>1 then print "She swallowed a "a$(bc)" to catch the "a$(bc-1)";"
61 gosub 200
65 next bc
70 print " ... Perhaps she'll die!"
75 get k$:if k$="q" then end
77 if k$>"0" and k$<"9" then c=asc(k$)-49
80 print:for t=1 to 1000:next t
90 next c
100 end
 
200 for t=1 to 500:next t:return:rem generic delay
 
1000 rem lyrics
1010 data "fly","I don't know why she swallowed a fly..."
1020 data "spider","That wriggled and jiggled and tickled inside her!"
1030 data "bird","How absurd to swallow a bird!"
1040 data "cat","Imagine that! She swallowed a cat!"
1050 data "dog","What a hog, to swallow a dog!"
1060 data "goat","She just opened her throat and swallowed a goat!"
1070 data "cow","I don't know how she swallowed a cow!"
1080 data "horse","...She died, of course!"
</syntaxhighlight>
 
===Commodore 64===
Sound must be played to the Commodore 64 SID chip through direct register access, therefore, the sound table is two-dimensional to account for the high byte and low byte of the appropriate frequencies.
<syntaxhighlight lang="gwbasic">
1 rem rosetta code
2 rem old lady who swallowed a fly - c64
5 print chr$(147);chr$(14)
10 dim a$(10),ex$(10),mu$(8,3):a=1
15 for i=1 to 8:read a$(i),ex$(i):next i:gosub 2500
20 for c=1 to 8
30 print chr$(147):print " Old Lady Who Swallowed A Fly ":print
40 print "I know an old lady who swallowed"
45 print " a ";a$(c):m$=mu$(c,1):gosub 2000
50 for bc=c to 1 step -1
55 if bc=c or bc<=2 then print ex$(bc):m$=mu$(bc,2):gosub 2000
57 if bc=8 then for t=1 to 2000:next
60 if bc>1 then print "She swallowed a "a$(bc)" to catch the "a$(bc-1)";"
61 if bc>1 then m$=mu$(bc,3):gosub 2000
65 next bc
70 print " ... Perhaps she'll die!"
72 m$=mu$(1,3):gosub 2000
75 get k$:if k$="q" then end
77 if k$>"0" and k$<"9" then c=asc(k$)-49
80 print:for t=1 to 1000:next t
90 next c
100 end
 
1000 rem lyrics
1010 data "fly","I don't know why she swallowed a fly..."
1020 data "spider","That wriggled and jiggled and tickled inside her!"
1030 data "bird","How absurd to swallow a bird!"
1040 data "cat","Imagine that! She swallowed a cat!"
1050 data "dog","What a hog, to swallow a dog!"
1060 data "goat","She just opened her throat and swallowed a goat!"
1070 data "cow","I don't know how she swallowed a cow!"
1080 data "horse","...She died, of course!"
 
1100 rem music (optional)
1110 data "8cffaffcffa4f","8ggg4g8feec2c","8c4d8e4f":rem fly
1120 data "8cffaffcffaff","8fgggggfeccc4c","8cffaffc4f8a4f":rem spider
1130 data "8cffaffcffa4f","4g8g4g8feec2c","8cffa4f8c4f8a8ff":rem bird
1140 data "8cffaffcffa4f","8c4g8g4g8feec2c","8cffa4f8c4f8a4f":rem cat
1150 data "8cffaffcffa4f","4g8g4g8feec2c","8cffa4f8c4f8a4f":rem dog
1160 data "8cffaffcffa4f","8ccggg4g8feec2c","8cffa4f8c4f8a4f":rem goat
1170 data "8cffaffcffa4f","8ggg4g8feec2c","8cffa4f8c4f8a4f":rem cow
1180 data "8cffaffcffa2f","4c2d4e2f","8cffa4f8c4f8a4f":rem horse
 
2000 rem note player
2005 for z=1 to len(m$):el$=mid$(m$,z,1)
2010 if el$>="a" and a$<="g" then gosub 2050
2015 if el$>="1" and el$<="8" then du=int(ms/(asc(el$)-48))
2020 next z:return
2050 rem play note
2055 n=asc(el$)-64
2060 poke 54272,nt(n,2):poke 54273,nt(n,1):poke 54276,17
2065 for i=1 to du:next i:poke 54276,16
2070 return
 
2500 rem set up sound table and sid
2505 dim nt(7,2):nt(3,1)=16:nt(3,2)=195
2506 nt(4,1)=18:nt(4,2)=209
2510 nt(5,1)=21:nt(5,2)=31
2515 nt(6,1)=22:nt(6,2)=96
2520 nt(7,1)=25:nt(7,2)=30
2525 nt(1,1)=28:nt(1,2)=49
2530 nt(2,1)=31:nt(2,2)=165
2535 poke 54296,15:poke 54277,9:poke 54278,0
2540 du=250:ms=1000
2550 for i=1 to 8:for j=1 to 3:read mu$(i,j):next j:next i
2599 return
</syntaxhighlight>
 
===Commodore Plus/4===
BASIC 3.5 on the Commodore Plus/4 at least features the SOUND command which simplifies getting the sound processor to play notes, however, a "tuned" sound table still needs to be defined with the appropriate frequencies.
<syntaxhighlight lang="gwbasic">
1 rem rosetta code
2 rem old lady who swallowed a fly - plus/4
5 print chr$(147);chr$(14)
10 dim an$(10),ex$(10),mu$(8,3):a=1
15 for i=1 to 8:read an$(i),ex$(i):next i:gosub 2500
20 for c=1 to 8
30 print chr$(147):print " Old Lady Who Swallowed A Fly ":print
40 print "I know an old lady who swallowed"
45 print " a ";an$(c):m$=mu$(c,1):gosub 2000
50 for bc=c to 1 step -1
55 if bc=c or bc<=2 then print ex$(bc):m$=mu$(bc,2):gosub 2000
57 if bc=8 then for t=1 to 2000:next t
60 if bc>1 then print "She swallowed a "an$(bc)" to catch the "an$(bc-1)";"
61 if bc>1 then m$=mu$(bc,3):gosub 2000
65 next bc
70 print " ... Perhaps she'll die!"
72 m$=mu$(1,3):gosub 2000
75 get k$:if k$="q" then end
77 if k$>"0" and k$<"9" then c=asc(k$)-49:rem jump to animal
80 print:for t=1 to 1000:next t
90 next c
100 end
 
1000 rem lyrics
1010 data "fly","I don't know why she swallowed a fly..."
1020 data "spider","That wriggled and jiggled and tickled inside her!"
1030 data "bird","How absurd to swallow a bird!"
1040 data "cat","Imagine that! She swallowed a cat!"
1050 data "dog","What a hog, to swallow a dog!"
1060 data "goat","She just opened her throat and swallowed a goat!"
1070 data "cow","I don't know how she swallowed a cow!"
1080 data "horse","...She died, of course!"
 
1100 rem music (optional)
1110 data "8cffaffcffa4f","8ggg4g8feec2c","8c4d8e4f":rem fly
1120 data "8cffaffcffaff","8fgggggfeccc4c","8cffaffc4f8a4f":rem spider
1130 data "8cffaffcffa4f","4g8g4g8feec2c","8cffa4f8c4f8a8ff":rem bird
1140 data "8cffaffcffa4f","8c4g8g4g8feec2c","8cffa4f8c4f8a4f":rem cat
1150 data "8cffaffcffa4f","4g8g4g8feec2c","8cffa4f8c4f8a4f":rem dog
1160 data "8cffaffcffa4f","8ccggg4g8feec2c","8cffa4f8c4f8a4f":rem goat
1170 data "8cffaffcffa4f","8ggg4g8feec2c","8cffa4f8c4f8a4f":rem cow
1180 data "8cffaffcffa2f","4c2d4e2f","8cffa4f8c4f8a4f":rem horse
 
2000 rem note player
2005 for z=1 to len(m$):el$=mid$(m$,z,1)
2010 if el$>="a" and a$<="g" then gosub 2050
2015 if el$>="1" and el$<="8" then du=int(ms/(asc(el$)-48))
2020 next:return
2050 rem play note
2055 n=asc(el$)-64
2060 sound 1,nt(n),du
2065 for t=1 to du:next
2070 sound 1,0,0
2075 return
 
2500 rem set up sound table
2505 dim nt(7):nt(3)=596
2506 nt(4)=643
2510 nt(5)=685
2515 nt(6)=704
2520 nt(7)=739
2525 nt(1)=770
2530 nt(2)=798
2535 vol 2
2540 du=250:ms=1000
2550 for i=1 to 8:for j=1 to 3:read mu$(i,j):next j:next i
2599 return
</syntaxhighlight>
 
===Commodore 128===
BASIC 7.0 on the Commodore 128 features a robust PLAY command which will interpret strings of macro commands for commanding the SID processor. This all but eliminates the bulk of the note playing routines. Note the data statements are slightly different as the macros for note duration are different. The 128 uses '''i''', '''q''', and '''h''' for ''eighth'', ''quarter'', and ''half'' notes respectively, while the 64 and Plus/4 examples were coded to use '''8''', '''4''', and '''2''' as it was simpler to use for math operations, rather than an additional look-up table.
<syntaxhighlight lang="gwbasic">
1 rem rosetta code
2 rem old lady who swallowed a fly - c128
5 print chr$(147);chr$(14)
10 dim an$(10),ex$(10),mu$(8,3):a=1
15 for i=1 to 8:read an$(i),ex$(i):next i:gosub 2500
20 for c=1 to 8
30 print chr$(147):print " Old Lady Who Swallowed A Fly ":print
40 print "I know an old lady who swallowed"
45 print " a ";an$(c):m$=mu$(c,1):gosub 2000
50 for bc=c to 1 step -1
55 if bc=c or bc<=2 then print ex$(bc):m$=mu$(bc,2):gosub 2000
57 if bc=8 then for t=1 to 2000:next t
60 if bc>1 then print "She swallowed a "an$(bc)" to catch the "an$(bc-1)";"
61 if bc>1 then m$=mu$(bc,3):gosub 2000
65 next bc
70 print " ... Perhaps she'll die!"
72 m$=mu$(1,3):gosub 2000
75 get k$:if k$="q" then end
77 if k$>"0" and k$<"9" then c=asc(k$)-49:rem jump to animal
80 print:for t=1 to 1000:next t
90 next c
100 end
 
1000 rem lyrics
1010 data "fly","I don't know why she swallowed a fly..."
1020 data "spider","That wriggled and jiggled and tickled inside her!"
1030 data "bird","How absurd to swallow a bird!"
1040 data "cat","Imagine that! She swallowed a cat!"
1050 data "dog","What a hog, to swallow a dog!"
1060 data "goat","She just opened her throat and swallowed a goat!"
1070 data "cow","I don't know how she swallowed a cow!"
1080 data "horse","...She died, of course!"
 
1100 rem music (optional)
1110 data "icffaffcffaqf","igggqgifeechc","icqdieqf":rem fly
1120 data "icffaffcffaff","ifgggggfecccqc","icffaffcqfiaqf":rem spider
1130 data "icffaffcffaqf","qgigqgifeechc","icffaqficqfiaiff":rem bird
1140 data "icffaffcffaqf","icqgigqgifeechc","icffaqficqfiaqf":rem cat
1150 data "icffaffcffaqf","qgigqgifeechc","icffaqficqfiaqf":rem dog
1160 data "icffaffcffaqf","iccgggqgifeechc","icffaqficqfiaqf":rem goat
1170 data "icffaffcffaqf","igggqgifeechc","icffaqficqfiaqf":rem cow
1180 data "icffaffcffahf","qchdqehf","icffaqficqfiaqf":rem horse
 
2000 rem note player
2005 play m$
2010 return
 
2500 rem set up sid
2510 for i=1 to 8:for j=1 to 3:read mu$(i,j):next j:next i
2520 play "v1o4t0u5"
2599 return
</syntaxhighlight>
 
=={{header|Common Lisp}}==
A rather iterative, rather than recursive solution. The lyrics match the original Burl Ives recording (not the later animated cartoon):
 
<syntaxhighlight lang="lisp">(defun verse (what remark &optional always die) (list what remark always die))
(defun what (verse) (first verse))
(defun remark (verse) (second verse))
(defun always (verse) (third verse))
(defun die (verse) (fourth verse))
 
(defun ssa (what remark &optional always die )
(verse what (format nil "~a she swallowed a ~a!" remark what always die)))
(defun tsa (what remark &optional always die)
(verse what (format nil "~a, to swallow a ~a!" remark what)))
(defun asa (what remark &optional always die)
(verse what (format nil "~a, and swallowed a ~a!" remark what)))
 
 
(let ((verses (list
(verse "fly" "I don't know why she swallowed the fly" T)
(verse "spider" "That wriggled and jiggled and tickled inside her" T)
(tsa "bird" "Now how absurd")
(tsa "cat" "Now fancy that")
(tsa "dog" "what a hog")
(asa "goat" "She just opened her throat")
(ssa "cow" "I don't know how")
(verse "horse" "She's dead, of course!" T T))))
 
(loop for verse in verses for i from 0 doing
(let ((it (what verse)))
(format t "I know an old lady who swallowed a ~a~%" it)
(format t "~a~%" (remark verse))
(if (not (die verse)) (progn
(if (> i 0)
(loop for j from (1- i) downto 0 doing
(let* ((v (nth j verses)))
(format t "She swallowed the ~a to catch the ~a~%" it (what v))
(setf it (what v))
(if (always v)
(format t "~a~a~%" (if (= j 0) "But " "") (remark v))))))
(format t "Perhaps she'll die. ~%~%"))))))</syntaxhighlight>
 
{{Out}}
<pre>I know an old lady who swallowed a fly
I don't know why she swallowed the fly
Perhaps she'll die.
 
I know an old lady who swallowed a spider
That wriggled and jiggled and tickled inside her
She swallowed the spider to catch the fly
But I don't know why she swallowed the fly
Perhaps she'll die.
 
...
 
I know an old lady who swallowed a cow
I don't know how she swallowed a cow!
She swallowed the cow to catch the goat
She swallowed the goat to catch the dog
She swallowed the dog to catch the cat
She swallowed the cat to catch the bird
She swallowed the bird to catch the spider
That wriggled and jiggled and tickled inside her
She swallowed the spider to catch the fly
But I don't know why she swallowed the fly
Perhaps she'll die.
 
I know an old lady who swallowed a horse
She's dead, of course!</pre>
 
=={{header|Cowgol}}==
<syntaxhighlight lang="cowgol">include "cowgol.coh";
 
var animals: [uint8][] := {
"fly", "spider", "bird", "cat", "dog", "goat", "cow", "horse"
};
 
var verses: [uint8][] := {
"I don't know why she swallowed that fly - Perhaps she'll die.\n",
"That wiggled and jiggled and tickled inside her!",
"How absurd, to swallow a bird",
"Imagine that! She swallowed a cat!",
"What a hog to swallow a dog",
"She just opened her throat and swallowed that goat",
"I don't know how she swallowed that cow",
"She's dead, of course."
};
 
var i: uint8 := 0;
while i < @sizeof animals loop
print("There was an old lady who swallowed a ");
print(animals[i]);
print(",\n");
print(verses[i]);
print_nl();
var j: uint8 := i;
while j > 0 and i < @sizeof animals-1 loop
print("She swallowed the ");
print(animals[j]);
print(" to catch the ");
print(animals[j-1]);
print(",\n");
if j <= 2 then
print(verses[j-1]);
print_nl();
end if;
j := j - 1;
end loop;
i := i + 1;
end loop;</syntaxhighlight>
 
=={{header|D}}==
{{trans|C}}
<langsyntaxhighlight lang="d">import stdcore.stdc.stdio;
 
autoimmutable dictdata = [
"_ha _c _e _p,/Quite absurd_f_p;_`cat,/Fancy that_fcat;_j`dog,/What a hog"~
"_fdog;_l`pig,/Her mouth_qso big_fpig;_d_r,/She just opened her throat_f_"~
Line 49 ⟶ 1,337:
"low","he_gthe"];
 
bool oldLady(in string part, bool s=false) nothrow @nogc {
foreach (immutable ch; part) {
if (s)
s = oldLady(dictdata[ch - 95'_'], 0false);
else if (ch == '_')
s = true;
Line 63 ⟶ 1,351:
 
void main() {
oldLady(dictdata[0], false).oldLady;
}</langsyntaxhighlight>
 
A more structured alternative version:
=={{header|Forth}}==
<syntaxhighlight lang="d">enum Action { once, every, die }
 
immutable struct T {
swallow-addr is obviously a good candidate for an object, but Forth
string anim;
has many OO candidates - we won't settle that argument here.
Action act;
string phrase;
}
 
immutable T[10] animals = [
<lang forth>: string, ( c-addr u -- ) \ store string at HERE , with a count
T("horse", Action.die, "She's dead, of course!"),
T("donkey", Action.once, "It was rather wonky. To swallow a donkey."),
T("cow", Action.once, "I don't know how. To swallow a cow."),
T("goat", Action.once, "She just opened her throat. To swallow a goat."),
T("pig", Action.once, "Her mouth was so big. To swallow a pig."),
T("dog", Action.once, "What a hog. To swallow a dog."),
T("cat", Action.once, "Fancy that. To swallow a cat."),
T("bird", Action.once, "Quite absurd. To swallow a bird."),
T("spider", Action.once, "That wriggled and jiggled and tickled inside her."),
T("fly", Action.every, "I don't know why she swallowed the fly.")];
 
void main() {
import std.stdio;
 
foreach_reverse (immutable i; 0 .. animals.length) {
writeln("I know an old lady who swallowed a ",
animals[i].anim, ".");
animals[i].phrase.writeln;
 
if (animals[i].act == Action.die)
break;
 
foreach (immutable j, immutable r; animals[i + 1 .. $]) {
writeln("She swallowed the ", animals[i + j].anim,
" to catch the ", r.anim, ".");
if (r.act == Action.every)
r.phrase.writeln;
}
 
"Perhaps she'll die.\n".writeln;
}
}</syntaxhighlight>
 
=={{header|Draco}}==
<syntaxhighlight lang="draco">proc nonrec animal(byte n) *char:
case n
incase 0: "fly"
incase 1: "spider"
incase 2: "bird"
incase 3: "cat"
incase 4: "dog"
incase 5: "goat"
incase 6: "cow"
incase 7: "horse"
esac
corp
 
proc nonrec line(byte n) *char:
case n
incase 0: "I don't know why she swallowed that fly,\r\n"
"Perhaps she'll die.\r\n"
incase 1: "That wiggled and jiggled and tickled inside her,"
incase 2: "How absurd to swallow a bird,"
incase 3: "Imagined that, she swallowed a cat,"
incase 4: "What a hog to swallow a dog,"
incase 5: "She just opened her throat and swallowed that goat,"
incase 6: "I don't know how she swallowed that cow,"
incase 7: "She's dead, of course."
esac
corp
 
proc nonrec verse(byte n) void:
byte a;
writeln("There was an old lady who swallowed a ", animal(n), ", ");
writeln(line(n));
if n/=7 then
for a from n downto 1 do
writeln("She swallowed the ", animal(a),
" to catch the ", animal(a-1), ", ");
if a <= 2 then writeln(line(a-1)) fi
od
fi
corp
 
proc nonrec main() void:
byte n;
for n from 0 upto 7 do verse(n) od
corp</syntaxhighlight>
 
=={{header|EasyLang}}==
{{trans|C}}
<syntaxhighlight>
animals$[] = [ "fly" "spider" "bird" "cat" "dog" "goat" "cow" "horse" ]
verses$[] = [ "I don't know why she swallowed that fly.\nPerhaps she'll die\n" "That wiggled and jiggled and tickled inside her" "How absurd, to swallow a bird" "Imagine that. She swallowed a cat" "What a hog to swallow a dog" "She just opened her throat and swallowed that goat" "I don't know how she swallowed that cow" "She's dead of course" ]
for i to len animals$[]
print "There was an old lady who swallowed a " & animals$[i]
print verses$[i]
if i < len animals$[]
for j = i downto 2
print "She swallowed the " & animals$[j] & " to catch the " & animals$[j - 1]
if j = 2
print verses$[1]
.
.
.
.
</syntaxhighlight>
 
 
=={{header|Elena}}==
ELENA 6.x :
<syntaxhighlight lang="elena">import extensions;
const Creatures = new string[]{"fly", "spider", "bird", "cat", "dog", "goat", "cow", "horse"};
const Comments = new string[]
{
"I don't know why she swallowed that fly"$10"Perhaps she'll die",
"That wiggled and jiggled and tickled inside her",
"How absurd, to swallow a bird",
"Imagine that. She swallowed a cat",
"What a hog to swallow a dog",
"She just opened her throat and swallowed that goat",
"I don't know how she swallowed that cow",
"She's dead of course"
};
public program()
{
for(int i := 0; i < Creatures.Length; i += 1)
{
console
.printLineFormatted("There was an old lady who swallowed a {0}",Creatures[i])
.printLine(Comments[i]);
if(i != 0 && i != Creatures.Length - 1)
{
for(int j := i; j > 0; j -= 1)
{
console.printLineFormatted("She swallowed the {0} to catch the {1}",Creatures[j],Creatures[j - 1])
};
console.writeLine(Comments[0])
};
console.writeLine()
}
}</syntaxhighlight>
 
=={{header|Elixir}}==
{{trans|Ruby}}
<syntaxhighlight lang="elixir">defmodule Old_lady do
@descriptions [
fly: "I don't know why S",
spider: "That wriggled and jiggled and tickled inside her.",
bird: "Quite absurd T",
cat: "Fancy that, S",
dog: "What a hog, S",
goat: "She opened her throat T",
cow: "I don't know how S",
horse: "She's dead, of course.",
]
def swallowed do
{descriptions, animals} = setup(@descriptions)
Enum.each(Enum.with_index(animals), fn {animal, idx} ->
IO.puts "There was an old lady who swallowed a #{animal}."
IO.puts descriptions[animal]
if animal == :horse, do: exit(:normal)
if idx > 0 do
Enum.each(idx..1, fn i ->
IO.puts "She swallowed the #{Enum.at(animals,i)} to catch the #{Enum.at(animals,i-1)}."
case Enum.at(animals,i-1) do
:spider -> IO.puts descriptions[:spider]
:fly -> IO.puts descriptions[:fly]
_ -> :ok
end
end)
end
IO.puts "Perhaps she'll die.\n"
end)
end
def setup(descriptions) do
animals = Keyword.keys(descriptions)
descs = Enum.reduce(animals, descriptions, fn animal, acc ->
Keyword.update!(acc, animal, fn d ->
case String.last(d) do
"S" -> String.replace(d, ~r/S$/, "she swallowed a #{animal}.")
"T" -> String.replace(d, ~r/T$/, "to swallow a #{animal}.")
_ -> d
end
end)
end)
{descs, animals}
end
end
 
Old_lady.swallowed</syntaxhighlight>
 
=={{header|Factor}}==
Windows users should put zlib1.dll[http://downloads.factorcode.org/dlls/] to factor folder.
<syntaxhighlight lang="factor">USING: base85 compression.zlib ;
 
"c%1E4%WlIU5WMphn^P`UexSD=s^-?Jk$NVE7-Gs=fQ9_`T}Y~ggi4hvMSb{SX}vpQXJ;^Yqok7%xd(0
mjR3>N1W_UQ$c@1$1#sAzsbTkHfHerT%K*K_NT><Cl4r<3ZyEa}o#KN}<)twov|KQ@`BE=GXdzugXdWO
s-E}7At$_Vm9CX{KSX)nUpq1~~%N3WyS`ZLg9$IzcccWRh+KGlek2*-;TR+lUB6EZs0X5<&U()_dvQXE
CJ#gDjv>e5yCRDAFrgX{pAnt$DPGHxt*E9$RMRBPeRcoXvT{6xN%o=~9@t{fLM`G}XV^A6Hk!HSBn{YM
ylrFhv&t_M?=}Lzm^6W<+00(I)uM#EY@ah;z@Y)zDUk;J&o^8C<;g7LlMIS{^*(al_mjFQv=BG_DyZn
<}rUt#FCDtKB9S`Y4jg+0PuB?Qt-&(11p?caq^S=1C`$D1fa<y6|YD*77a{4949T_-MVet;6abaEn"
 
base85> 3215 <compressed> uncompress >string print</syntaxhighlight>
 
=={{header|Forth}}==
swallow-addr is obviously a good candidate for an object, but Forth has many OO candidates - we won't settle that argument here.
<syntaxhighlight lang="forth">: string, ( c-addr u -- ) \ store string at HERE , with a count
dup c, here swap dup allot move ;
 
Line 124 ⟶ 1,622:
first @ begin dup verse cr >next dup 0= until drop
cr ." There was an old lady who swallowed a horse..."
cr ." She's dead, of course!" ;</langsyntaxhighlight>
 
=={{header|JFortran}}==
<syntaxhighlight lang="fortran">
program fly
!A program to print the "Old lady swallowed a fly" poem
implicit none
 
character(len=52), dimension(0:8,2) :: line
This defines T to be the required text.
integer :: i,j
!Define Lines of Poem
line(1,1) = 'fly'
line(2,1) = 'spider'
line(3,1) = 'bird'
line(4,1) = 'cat'
line(5,1) = 'dog'
line(6,1) = 'goat'
line(7,1) = 'cow'
line(8,1) = 'horse'
line(0,2) = "Perhaps she'll die."
line(1,2) = "I don't know why she swallowed that fly."
line(2,2) = "That wiggled and jiggled and tickled inside her."
line(3,2) = "How absurd to swallow a bird."
line(4,2) = "Imagine that. She swallowed a cat."
line(5,2) = "What a hog to swallow a dog."
line(6,2) = "She just opened her throat and swallowed that goat."
line(7,2) = "I don't know how she swallowed that cow."
line(8,2) = "She's dead of course."
 
!List each verse
<lang j>T=:''
verses:do i = 1,8
write(*,*) 'There was an old lady who swallowed a '//trim(line(i,1))//"."
write(*,*) trim(line(i,2))
!List things swallowed
swallowed:do j = i,2,-1
write(*,*) "She swallowed the "//trim(line(j,1))//" to catch the "//trim(line(j-1,1))//","
end do swallowed
write(*,*) trim(line(0,2))
write(*,*)
end do verses
end program fly
</syntaxhighlight>
 
=={{header|FreeBASIC}}==
<syntaxhighlight lang="freebasic">dim as string lyrics(0 to 7, 0 to 1) = {_
{ "fly", "I don't know why she swallowed a fly - Perhaps she'll die!" },_
{ "spider", "That wriggled and jiggled and tickled inside her!" },_
{ "bird", "How absurd to swallow a bird!" },_
{ "cat", "Imagine that! She swallowed a cat!" },_
{ "dog", "What a hog, to swallow a dog!" },_
{ "goat", "She just opened her throat and swallowed a goat!" },_
{ "cow", "I don't know how she swallowed a cow."},_
{ "horse", "She's dead of course!" } }
for verse as ubyte = 0 to 7
for countdown as byte = verse to 0 step -1
if countdown = verse then
print "There was an old lady who swallowed a "; lyrics(verse, 0);"."
print lyrics(verse, 1)
if verse = 7 then end
end if
if countdown > 0 then print "She swallowed the ";lyrics(countdown, 0);_
" to catch the ";lyrics(countdown-1, 0);","
if countdown = 2 or countdown = 1 then print lyrics(countdown-1, 1)
next countdown
print
next verse</syntaxhighlight>
 
=={{header|Free Pascal}}==
<syntaxhighlight lang="free pascal">(* A mixture of the lyrics found in Wikipedia and the Ada version
in Rosetta Code. It formats the lyrics like the Wikipedia one *)
program OldLady;
 
uses
SysUtils;
 
const
MaxLadies = 9; //Number of iterations and array items
Animals: array[1..MaxLadies + 1] of shortstring = ( //Add one for the song's end
'fly',
'spider',
'bird',
'cat',
'dog',
'pig',
'goat',
'cow',
'donkey',
'horse'
);
 
Verse1 = 'There was an old lady who swallowed a %s;';
//Verse 2 variations
Verse2Var1 = ' %s'; //Doubles as a spacing formatter
Verse2Var2 = ' %s to swallow a %s;';
Verse2Var3 = ' %s and swallowed a %s';
Verse2Var4 = ' %s she swallowed a %s';
Verse3 = ' She swallowed the %s to catch the %s;';
VerseEnd = 'I don''t know why she swallowed a fly - perhaps she''ll die!';
SongEnd = ' ...She''s dead of course!';
 
SwallowResult: array[1..MaxLadies] of shortstring = (
VerseEnd,
'That wiggled and jiggled and tickled inside her!',
'Quite absurd',
'Fancy that',
'What a hog,',
'Her mouth was so big',
'She just opened her throat',
'I don''t know how',
'It was rather wonky'
);
 
procedure PrintSong;
var
i, j: byte;
SwallowStr: shortstring;
 
begin
for i := 1 to MaxLadies do
begin
WriteLn(Format(Verse1, [Animals[i]]));
case i of
1..2: SwallowStr := Verse2Var1;
3..5: SwallowStr := Verse2Var2;
6, 8..9: SwallowStr := Verse2Var4;
else
SwallowStr := Verse2Var3;
end;
WriteLn(Format(SwallowStr, [SwallowResult[i], Animals[i]]));
if i >= 2 then
begin
for j := i downto 2 do
begin
WriteLn(Format(Verse3, [Animals[j], Animals[j - 1]]));
if (j - 1 = 2) and (i >= 3) then
WriteLn(Format(Verse2Var1, [SwallowResult[2]]));
end;
if j >= 2 then
WriteLn(Format(Verse2Var1, [VerseEnd]));
end;
end;
WriteLn(Format(Verse1, [Animals[MaxLadies + 1]]));
WriteLn(SongEnd);
end;
 
begin
PrintSong;
end.
</syntaxhighlight>
 
=={{header|Frege}}==
{{trans|Haskell|version=256063}}
{{Works with|Frege|3.23.888-g4e22ab6}}
 
Nearly identical to the Haskell. Only the first line of the program is different.
 
<syntaxhighlight lang="frege">module OldLady where
 
import Data.List
 
-- Once means the phrase is only printed in the verse about that animal.
-- Every means the phrase is printed for every verse. It is used for "fly",
-- and could optionally be used for "spider", in the version of the song where
-- "wriggled and jiggled..." is repeated every verse.
-- Die is only used for the horse, and means the chain of animals won't be
-- included in the verse.
data AnimalAction = Once | Every | Die
 
animals = [("horse", Die, "She's dead, of course!"),
("donkey", Once, "It was rather wonky. To swallow a donkey."),
("cow", Once, "I don't know how. To swallow a cow."),
("goat", Once, "She just opened her throat. To swallow a goat."),
("pig", Once, "Her mouth was so big. To swallow a pig."),
("dog", Once, "What a hog. To swallow a dog."),
("cat", Once, "Fancy that. To swallow a cat."),
("bird", Once, "Quite absurd. To swallow a bird."),
("spider", Once, "That wriggled and jiggled and tickled inside her."),
("fly", Every, "I don't know why she swallowed the fly.")]
 
verse :: [(String, AnimalAction, String)] -> [String]
verse ((anim, act, phrase):restAnims) =
let lns = ["I know an old lady who swallowed a " ++ anim ++ ".", phrase]
in case act of Die -> lns
_ -> lns ++ verse' restAnims anim
 
verse' :: [(String, AnimalAction, String)] -> String -> [String]
verse' [] _ = ["Perhaps she'll die."]
verse' ((anim, act, phrase):restAnims) prevAnim =
let why = "She swallowed the " ++ prevAnim ++ " to catch the " ++ anim ++ "."
lns = case act of Every -> [why, phrase]
_ -> [why]
in lns ++ verse' restAnims anim
 
song :: [String]
song = concatMap verse $ tail $ reverse $ tails animals
 
main = putStr $ unlines song</syntaxhighlight>
 
 
 
=={{header|FutureBasic}}==
An added feature of this code is the addition of a proper English voice reciting the rhyme back to you. This is compilable as a standalone app on M1, M2 or Intel Macs.
<syntaxhighlight lang="futurebasic">
include "NSLog.incl"
 
begin enum output
_firstAnimal = 0
_lastAnimal = 7
end enum
 
local fn OldLadySwallowedAFly
NSUInteger i, j, numberOfAnimals
CFMutableStringRef mutStr = fn MutableStringWithCapacity( 0 )
NSLogClear
CFArrayRef animals = @[@"fly", @"spider", @"bird", @"cat", @"dog", @"goat", @"cow", @"horse.."]
CFArrayRef verses = @[@"",¬
@"I don't know why she swallowed the fly — perhaps she'll die!\n",¬
@"That wriggled and jiggled and tickled inside her.",¬
@"How absurd, to swallow a bird!",¬
@"Imagine that, she swallowed a cat!",¬
@"What a hog to swallow a dog!",¬
@"She just opened her throat and swallowed that goat!",¬
@"I wonder how she swallowed a cow?",¬
@"She's dead, of course!"]
numberOfAnimals = len(animals)
for i = 0 to numberOfAnimals -1
NSLog( @"There was an old lady who swallowed a %@.", animals[i] ) : MutableStringAppendFormat( mutStr, @"There was an old lady who swallowed a %@.\n", animals[i] )
if i == _firstAnimal then NSLog( @"%@", verses[1] ) : MutableStringAppendFormat( mutStr, @"%@\n", verses[1] ) : continue
if i > _firstAnimal then NSLog( @"%@", verses[i+1] ) : MutableStringAppendFormat( mutStr, @"%@\n", verses[i+1] )
if i == _lastAnimal then break
if ( i > 0 )
for j = i to 1 step -1
CFStringRef p
if fn StringIsEqual( animals[j-1], @"fly" ) then p = @"." else p = @","
NSLog( @"\tShe swallowed the %@ to catch the %@%@", animals[j], animals[j-1], p ) : MutableStringAppendFormat( mutStr, @"\tShe swallowed the %@ to catch the %@%@\n", animals[j], animals[j-1], p )
if j == 2 then NSLog(@"\tThat wriggled and jiggled and tickled inside her.") : MutableStringAppendString( mutStr, @"\tThat wriggled and jiggled and tickled inside her.\n" )
if j == 1 then NSLog( @"%@", verses[1] ) : MutableStringAppendFormat( mutStr, @"%@\n", verses[1] ) : break
next
end if
next
SpeechSynthesizerRef ref = fn SpeechSynthesizerWithVoice( @"com.apple.speech.synthesis.voice.daniel.premium" )
fn SpeechSynthesizerStartSpeakingString( ref, mutStr )
end fn
 
fn OldLadySwallowedAFly
 
HandleEvents
</syntaxhighlight>
The following is both printed and recited back as audio in a proper English male voice.
{{out}}
<pre>
There was an old lady who swallowed a fly.
I don't know why she swallowed the fly — perhaps she'll die!
 
There was an old lady who swallowed a spider.
That wriggled and jiggled and tickled inside her.
She swallowed the spider to catch the fly.
I don't know why she swallowed the fly — perhaps she'll die!
 
There was an old lady who swallowed a bird.
How absurd, to swallow a bird!
She swallowed the bird to catch the spider,
That wriggled and jiggled and tickled inside her.
She swallowed the spider to catch the fly.
I don't know why she swallowed the fly — perhaps she'll die!
 
There was an old lady who swallowed a cat.
Imagine that, she swallowed a cat!
She swallowed the cat to catch the bird,
She swallowed the bird to catch the spider,
That wriggled and jiggled and tickled inside her.
She swallowed the spider to catch the fly.
I don't know why she swallowed the fly — perhaps she'll die!
 
There was an old lady who swallowed a dog.
What a hog to swallow a dog!
She swallowed the dog to catch the cat,
She swallowed the cat to catch the bird,
She swallowed the bird to catch the spider,
That wriggled and jiggled and tickled inside her.
She swallowed the spider to catch the fly.
I don't know why she swallowed the fly — perhaps she'll die!
 
There was an old lady who swallowed a goat.
She just opened her throat and swallowed that goat!
She swallowed the goat to catch the dog,
She swallowed the dog to catch the cat,
She swallowed the cat to catch the bird,
She swallowed the bird to catch the spider,
That wriggled and jiggled and tickled inside her.
She swallowed the spider to catch the fly.
I don't know why she swallowed the fly — perhaps she'll die!
 
There was an old lady who swallowed a cow.
I wonder how she swallowed a cow?
She swallowed the cow to catch the goat,
She swallowed the goat to catch the dog,
She swallowed the dog to catch the cat,
She swallowed the cat to catch the bird,
She swallowed the bird to catch the spider,
That wriggled and jiggled and tickled inside her.
She swallowed the spider to catch the fly.
I don't know why she swallowed the fly — perhaps she'll die!
 
There was an old lady who swallowed a horse...
She's dead, of course!
</pre>
 
 
 
 
=={{header|Go}}==
[https://play.golang.org/p/OV3YJSWxaJP Go Playground]
<syntaxhighlight lang="go">package main
 
import "fmt"
 
var name, lyric, animals = 0, 1, [][]string{
{"fly", "I don't know why she swallowed a fly. Perhaps she'll die."},
{"spider", "That wiggled and jiggled and tickled inside her."},
{"bird", "How absurd, to swallow a bird."},
{"cat", "Imagine that, she swallowed a cat."},
{"dog", "What a hog, to swallow a dog."},
{"goat", "She just opened her throat and swallowed that goat."},
{"cow", "I don't know how she swallowed that cow."},
{"horse", "She's dead, of course."},
}
 
func main() {
for i, animal := range animals {
fmt.Printf("There was an old lady who swallowed a %s,\n",
animal[name])
 
if i > 0 {
fmt.Println(animal[lyric])
}
 
// Swallowing the last animal signals her death, cutting the
// lyrics short.
if i+1 == len(animals) {
break
}
 
for ; i > 0; i-- {
fmt.Printf("She swallowed the %s to catch the %s,\n",
animals[i][name], animals[i-1][name])
}
 
fmt.Println(animals[0][lyric] + "\n")
}
}</syntaxhighlight>
 
=={{header|Haskell}}==
 
<syntaxhighlight lang="haskell">import Data.List (tails)
 
animals :: [String]
animals =
[ "fly.\nI don't know why she swallowed a fly.\nPerhaps she'll die.\n"
, "spider.\nThat wiggled and jiggled and tickled inside her."
, "bird.\t\nHow absurd, to swallow a bird."
, "cat.\t\nImagine that. She swallowed a cat."
, "dog.\t\nWhat a hog to swallow a dog."
, "goat.\t\nShe just opened her throat and swallowed a goat."
, "cow.\nI don't know how she swallowed a cow."
, "horse.\nShe's dead, of course."
]
 
beginnings :: [String]
beginnings = ("There was an old lady who swallowed a " ++) <$> animals
 
lastVerse :: [String]
lastVerse =
reverse
[ "She swallowed the " ++
takeWhile (/= '.') y ++ " to catch the " ++ takeWhile (/= '\t') x
| (x:y:_:_) <- tails animals ]
 
main :: IO ()
main =
putStr $
concatMap unlines $
zipWith (:) beginnings $ reverse $ ([] :) (tails lastVerse)</syntaxhighlight>
{{out}}<pre>There was an old lady who swallowed a fly.
I don't know why she swallowed a fly.
Perhaps she'll die.
 
There was an old lady who swallowed a spider.
That wiggled and jiggled and tickled inside her.
She swallowed the spider to catch the fly.
I don't know why she swallowed a fly.
Perhaps she'll die.
 
There was an old lady who swallowed a bird.
How absurd, to swallow a bird.
She swallowed the bird to catch the spider.
That wiggled and jiggled and tickled inside her.
She swallowed the spider to catch the fly.
I don't know why she swallowed a fly.
Perhaps she'll die.
 
There was an old lady who swallowed a cat.
Imagine that. She swallowed a cat.
She swallowed the cat to catch the bird.
She swallowed the bird to catch the spider.
That wiggled and jiggled and tickled inside her.
She swallowed the spider to catch the fly.
I don't know why she swallowed a fly.
Perhaps she'll die.
 
There was an old lady who swallowed a dog.
What a hog to swallow a dog.
She swallowed the dog to catch the cat.
She swallowed the cat to catch the bird.
She swallowed the bird to catch the spider.
That wiggled and jiggled and tickled inside her.
She swallowed the spider to catch the fly.
I don't know why she swallowed a fly.
Perhaps she'll die.
 
There was an old lady who swallowed a goat.
She just opened her throat and swallowed a goat.
She swallowed the goat to catch the dog.
She swallowed the dog to catch the cat.
She swallowed the cat to catch the bird.
She swallowed the bird to catch the spider.
That wiggled and jiggled and tickled inside her.
She swallowed the spider to catch the fly.
I don't know why she swallowed a fly.
Perhaps she'll die.
 
There was an old lady who swallowed a cow.
I don't know how she swallowed a cow.
She swallowed the cow to catch the goat.
She swallowed the goat to catch the dog.
She swallowed the dog to catch the cat.
She swallowed the cat to catch the bird.
She swallowed the bird to catch the spider.
That wiggled and jiggled and tickled inside her.
She swallowed the spider to catch the fly.
I don't know why she swallowed a fly.
Perhaps she'll die.
 
There was an old lady who swallowed a horse.
She's dead, of course.
</pre>
 
And a variation on this theme (a little more disaggregated):
 
<syntaxhighlight lang="haskell">import Prelude hiding (lookup)
import Data.Map.Strict (Map, fromList, lookup)
import Data.List (inits, intercalate)
import Data.Maybe (fromMaybe)
import Data.Bool (bool)
 
main :: IO ()
main = (putStrLn . unlines) (ingestion <$> meal)
 
meal :: [[String]]
meal = init (reverse <$> tail (inits menu)) ++ [[last menu]]
 
menu :: [String]
menu = fst <$> courses
 
courses :: [(String, String)]
courses =
[ ("fly", "I don't know why she swallowed a fly - perhaps she'll die")
, ("spider", "It wiggled and jiggled and tickled inside her")
, ("bird", "How absurd, to swallow a bird")
, ("cat", "Imagine that. She swallowed a cat")
, ("dog", "What a hog to swallow a dog")
, ("goat", "She just opened her throat and swallowed a goat")
, ("cow", "I don't know how she swallowed a cow")
, ("horse", "She died, of course")
]
 
ingestion :: [String] -> String
ingestion [] = []
ingestion dishes =
let appetiser = head dishes
story = motivation dishes
in concat
[ "\nThere was an old lady who swallowed a "
, appetiser
, ";\n"
, reputation appetiser
, "."
, bool ("\n\n" ++ story ++ ".") [] (null story)
]
 
motivation :: [String] -> String
motivation [] = []
motivation dishes =
intercalate ";\n" $
zipWith
(\a b -> concat ["She swallowed the ", a, " to catch the ", fullName b])
dishes
(tail dishes)
 
fullName :: String -> String
fullName dish
| "spider" == dish =
dish ++ "\nthat " ++ unwords (tail (words (reputation dish)))
| "fly" == dish = dish ++ ".\n" ++ reputation dish
| otherwise = dish
 
reputation :: String -> String
reputation = fromMaybe [] . flip lookup comments
 
comments :: Map String String
comments = fromList courses</syntaxhighlight>
{{Out}}
<pre>There was an old lady who swallowed a fly;
I don't know why she swallowed a fly - perhaps she'll die.
 
There was an old lady who swallowed a spider;
It wiggled and jiggled and tickled inside her.
 
She swallowed the spider to catch the fly.
I don't know why she swallowed a fly - perhaps she'll die.
 
There was an old lady who swallowed a bird;
How absurd, to swallow a bird.
 
She swallowed the bird to catch the spider
that wiggled and jiggled and tickled inside her;
She swallowed the spider to catch the fly.
I don't know why she swallowed a fly - perhaps she'll die.
 
There was an old lady who swallowed a cat;
Imagine that. She swallowed a cat.
 
She swallowed the cat to catch the bird;
She swallowed the bird to catch the spider
that wiggled and jiggled and tickled inside her;
She swallowed the spider to catch the fly.
I don't know why she swallowed a fly - perhaps she'll die.
 
There was an old lady who swallowed a dog;
What a hog to swallow a dog.
 
She swallowed the dog to catch the cat;
She swallowed the cat to catch the bird;
She swallowed the bird to catch the spider
that wiggled and jiggled and tickled inside her;
She swallowed the spider to catch the fly.
I don't know why she swallowed a fly - perhaps she'll die.
 
There was an old lady who swallowed a goat;
She just opened her throat and swallowed a goat.
 
She swallowed the goat to catch the dog;
She swallowed the dog to catch the cat;
She swallowed the cat to catch the bird;
She swallowed the bird to catch the spider
that wiggled and jiggled and tickled inside her;
She swallowed the spider to catch the fly.
I don't know why she swallowed a fly - perhaps she'll die.
 
There was an old lady who swallowed a cow;
I don't know how she swallowed a cow.
 
She swallowed the cow to catch the goat;
She swallowed the goat to catch the dog;
She swallowed the dog to catch the cat;
She swallowed the cat to catch the bird;
She swallowed the bird to catch the spider
that wiggled and jiggled and tickled inside her;
She swallowed the spider to catch the fly.
I don't know why she swallowed a fly - perhaps she'll die.
 
There was an old lady who swallowed a horse;
She died, of course.</pre>
 
=={{header|Icon}} and {{header|Unicon}}==
This version isn't as compressed as some of the others but it is very straightforward to modify. Just add a new long and terse verse entry and amend the line marked order. This uses a feature of Icon/Unicon that allows procedures to be called with a list datatype instead of an argument list, so we just pre-build argument lists for printf.
<syntaxhighlight lang="icon">procedure main() #: There Was An Old Lady Lyrics
 
verse := table() # arglists for printf - [1] long asides and [2] terse joiners
verse["bird"] := [["%s,\nQuite absurd, %s %s;\n",1,2,1],["%s,\n",1]]
verse["cat"] := [["%s,\nFancy that, %s %s;\n",1,2,1],["%s,\n",1]]
verse["dog"] := [["%s,\nWhat a hog, %s %s;\n",1,2,1],["%s,\n",1]]
verse["pig"] := [["%s,\nHer mouth was so big, %s %s;\n",1,2,1],["%s,\n",1]]
verse["goat"] := [["%s,\nShe just opened her throat, %s %s;\n",1,2,1],["%s,\n",1]]
verse["cow"] := [["%s,\nI don't know how, %s %s;\n",1,2,1],["%s,\n",1]]
verse["donkey"] := [["%s,\nIt was rather wonky, %s %s;\n",1,2,1],["%s,\n",1]]
 
# just long versions of these
verse["fly"] := [["%s,\nBut I don't know why %s %s,\nPerhaps she'll die!\n\n",1,2,1]]
verse["spider"] := [["%s,\nThat wriggled and jiggled and tickled inside her;\n",1]]
verse["horse"] := [["%s...\nShe's dead, of course!\n",1]]
 
every (f := verse[k := key(verse)][1|2])[i := 1 to *f] do # fix every printf args
f[i] := case f[i] of { 1 : k ; 2 : "she swallowed the"; default : f[i]}
zoofilo := []
"fly,spider,bird,cat,dog,pig,goat,cow,donkey,horse," ? # order
while push(zoofilo,tab(find(","))) & move(1) do {
printf("There was an old lady who swallowed a ")
every critter := !zoofilo do {
printf!verse[critter,(critter == (zoofilo[1] | "spider" | "fly"),1)|2]
if critter == "horse" then stop() # dead
printf("She swallowed the %s to catch the ","fly" ~== critter)
}
}
end
 
link printf</syntaxhighlight>
Sample output omitted.
 
{{libheader|Icon Programming Library}}
[http://www.cs.arizona.edu/icon/library/src/procs/printf.icn printf.icn provides printf formatting]
 
=={{header|IS-BASIC}}==
<syntaxhighlight lang="is-basic">100 PROGRAM "OldLady.bas"
110 DIM A$(7),E$(7)
120 FOR N=0 TO 7
130 READ A$(N),E$(N)
140 NEXT
150 LET M$=CHR$(13):LET L$="There was an old lady who swallowed a "
160 TEXT 80:PRINT L$;A$(1);CHR$(241)
170 FOR C=1 TO 7
180 PRINT M$;M$;L$;A$(C);
190 IF C>1 THEN
200 PRINT ";";M$;E$(C);
210 IF C<N THEN
220 FOR B=C TO 2 STEP-1
230 PRINT M$;A$(0);A$(B);" to catch the ";A$(B-1);",;"(1+ABS(B=2));
240 IF B=3 THEN PRINT M$;" ";E$(2);
250 NEXT
260 END IF
270 ELSE
280 PRINT ",";
290 END IF
300 IF C<N THEN PRINT M$ E$(1);E$(0);
310 NEXT
320 PRINT M$;M$;L$;"horse...";M$;"She's dead, of course!"
330 DATA " She swallowed the "," - perhaps she'll die!"
340 DATA fly,I don't know why she swallowed a fly
350 DATA spider,"That wriggled and jiggled and tickled inside her,"
360 DATA bird,"How absurd to swallow a bird!"
370 DATA cat,"Fancy that to swallow a cat!"
380 DATA dog,"What a hog, to swallow a dog!"
390 DATA goat,"Just opened her throat and swallowwed a goat!"
400 DATA cow,"I don't know how she swallowed a cow!"</syntaxhighlight>
 
=={{header|J}}==
This defines T to be the required text.
<syntaxhighlight lang="j">T=:''
e=:3 :'T=:T,y,LF'
E=:e@,&'.'
Line 153 ⟶ 2,299:
'Donkey'N'It was rather wonky'
O'Horse'
Ee'She''s dead, of course!'</langsyntaxhighlight>
 
<pre style="height: 10em; overflow-y: scroll"> T
I know an old lady who swallowed a fly.
I don't know why she swallowed the fly.
Perhaps she'll die.
 
I know an old lady who swallowed a spider.
That wriggled and jiggled and tickled inside her.
She swallowed the spider to catch the fly.
I don't know why she swallowed the fly.
Perhaps she'll die.
 
I know an old lady who swallowed a Bird.
Quite absurd. To swallow a Bird.
She swallowed the Bird to catch the spider.
She swallowed the spider to catch the fly.
I don't know why she swallowed the fly.
Perhaps she'll die.
 
I know an old lady who swallowed a Cat.
Fancy that. To swallow a Cat.
She swallowed the Cat to catch the Bird.
She swallowed the Bird to catch the spider.
She swallowed the spider to catch the fly.
I don't know why she swallowed the fly.
Perhaps she'll die.
 
I know an old lady who swallowed a Dog.
What a hog. To swallow a Dog.
She swallowed the Dog to catch the Cat.
She swallowed the Cat to catch the Bird.
She swallowed the Bird to catch the spider.
She swallowed the spider to catch the fly.
I don't know why she swallowed the fly.
Perhaps she'll die.
 
I know an old lady who swallowed a Pig.
Her mouth was so big. To swallow a Pig.
She swallowed the Pig to catch the Dog.
She swallowed the Dog to catch the Cat.
She swallowed the Cat to catch the Bird.
She swallowed the Bird to catch the spider.
She swallowed the spider to catch the fly.
I don't know why she swallowed the fly.
Perhaps she'll die.
 
I know an old lady who swallowed a Goat.
She just opened her throat. To swallow a Goat.
She swallowed the Goat to catch the Pig.
She swallowed the Pig to catch the Dog.
She swallowed the Dog to catch the Cat.
She swallowed the Cat to catch the Bird.
She swallowed the Bird to catch the spider.
She swallowed the spider to catch the fly.
I don't know why she swallowed the fly.
Perhaps she'll die.
 
I know an old lady who swallowed a Cow.
I don't know how. To swallow a Cow.
She swallowed the Cow to catch the Goat.
She swallowed the Goat to catch the Pig.
She swallowed the Pig to catch the Dog.
She swallowed the Dog to catch the Cat.
She swallowed the Cat to catch the Bird.
She swallowed the Bird to catch the spider.
She swallowed the spider to catch the fly.
I don't know why she swallowed the fly.
Perhaps she'll die.
 
I know an old lady who swallowed a Donkey.
It was rather wonky. To swallow a Donkey.
She swallowed the Donkey to catch the Cow.
She swallowed the Cow to catch the Goat.
She swallowed the Goat to catch the Pig.
She swallowed the Pig to catch the Dog.
She swallowed the Dog to catch the Cat.
She swallowed the Cat to catch the Bird.
She swallowed the Bird to catch the spider.
She swallowed the spider to catch the fly.
I don't know why she swallowed the fly.
Perhaps she'll die.
 
I know an old lady who swallowed a Horse.
She's dead, of course!</pre>
 
=={{header|Java}}==
{{Trans|C| via [[#D|D]]}}
<syntaxhighlight lang="java">public class OldLadySwallowedAFly {
 
final static String[] data = {
"_ha _c _e _p,/Quite absurd_f_p;_`cat,/Fancy that_fcat;_j`dog,/What a hog"
+ "_fdog;_l`pig,/Her mouth_qso big_fpig;_d_r,/She just opened her throat_f_"
+ "r;_icow,/_mhow she_ga cow;_k_o,/It_qrather wonky_f_o;_a_o_bcow,_khorse.."
+ "./She's dead, of course!/", "_a_p_b_e ", "/S_t ", " to catch the ", "fly,/Bu"
+ "t _mwhy s_t fly,/Perhaps she'll die!//_ha", "_apig_bdog,_l`", "spider,/Tha"
+ "t wr_nj_ntickled inside her;_aspider_b_c", ", to_s a ", "_sed ", "There_qan"
+ " old lady who_g", "_a_r_bpig,_d", "_acat_b_p,_", "_acow_b_r,_i", "_adog_bcat"
+ ",_j", "I don't know ", "iggled and ", "donkey", "bird", " was ", "goat", " swal"
+ "low", "he_gthe"};
 
static boolean oldLady(String part, boolean s) {
for (char c : part.toCharArray()) {
if (s)
s = oldLady(data[c - '_'], false);
else if (c == '_')
s = true;
else
System.out.print(c == '/' ? '\n' : c);
}
return s;
}
 
public static void main(String[] args) {
oldLady(data[0], false);
}
}</syntaxhighlight>
 
=={{header|jq}}==
'''Adapted from [[#Wren|Wren]]'''
{{works with|jq}}
'''Also works with gojq and fq, the Go implementations'''
<syntaxhighlight lang=jq>
def animals:
["fly", "spider", "bird", "cat", "dog", "goat", "cow", "horse"];
 
def phrases: [
null,
"That wriggled and jiggled and tickled inside her",
"How absurd to swallow a bird",
"Fancy that to swallow a cat",
"What a hog, to swallow a dog",
"She just opened her throat and swallowed a goat",
"I don't know how she swallowed a cow",
"\n ...She's dead of course"
];
 
def sing:
def cond(q; x): select(q) | x;
range(0;8)
| "There was an old lady who swallowed a \(animals[.]);",
cond(. > 0; "\(phrases[.])"),
cond(. < 7;
"",
cond(. > 0;
range(.; 0; -1) as $j
| " She swallowed the \(animals[$j]) to catch the \(
animals[$j - 1])\(if $j < 3 then ";" else "," end)",
cond($j == 2; " \(phrases[1])!") ),
" I don't know why she swallowed a fly - Perhaps she'll die!\n" );
 
sing
</syntaxhighlight>
{{output}}
As for [[#Wren|Wren]].
 
=={{header|Julia}}==
{{works with|Julia|0.6}}
 
<syntaxhighlight lang="julia">using CodecZlib
 
b64 = b"""eNrtVE1rwzAMvedXaKdeRn7ENrb21rHCzmrs1m49K9gOJv9+cko/HBcGg0LHcpOfnq2np0QL
2FuKgBbICDAoeoiKwEc0hqIUgLAxfV0tQJCdhQM7qh68kheswKeBt5ROYetTemYMCC3rii//
WMS3WkhXVyuFAaLT261JuBWwu4iDbvYp1tYzHVS68VEIObwFgaDB0KizuFs38aSdqKv3TgcJ
uPYdn2B1opwIpeKE53qPftxRd88Y6uoVbdPzWxznrQ3ZUi3DudQ/bcELbevqM32iCIrj3IIh
W6plOJf6L6xaajZjzqW/qAsKIvITBGs9Nm3glboZzkVP5l6Y+0bHLnedD0CttIyrpEU5Kv7N
Mz3XkPBc/TSN3yxGiqMiipHRekycK0ZwMhM8jerGC9zuZaoTho3kMKSfJjLaF8v8wLzmXMqM
zJvGew/jnZPzclA08yAkikegDTTUMfzwDXBcwoE="""
println(String(transcode(ZlibDecompressor(), base64decode(b64))))</syntaxhighlight>
 
<syntaxhighlight lang="julia">animals = [
("fly", "I don't know why she swallowed a fly, perhaps she'll die."),
("spider", "It wiggled and jiggled and tickled inside her."),
("bird", "How absurd, to swallow a bird."),
("cat", "Imagine that, she swallowed a cat."),
("dog", "What a hog, to swallow a dog."),
("goat", "She just opened her throat and swallowed a goat."),
("cow", "I don't know how she swallowed a cow."),
("horse", "She's dead, of course.")]
 
for (i, (animal, lyric)) in enumerate(animals)
println("There was an old lady who swallowed a $animal.\n$lyric")
 
if animal == "horse" break end
 
for ((predator, _), (prey, _)) in zip(animals[i:-1:1], animals[i-1:-1:1])
println("\tShe swallowed the $predator to catch the $prey")
end
 
if animal != "fly" println(animals[1][2]) end # fly lyric
println() # new line
end</syntaxhighlight>
 
=={{header|Kotlin}}==
<syntaxhighlight lang="scala">// version 1.1.3
 
val animals = listOf("fly", "spider", "bird", "cat","dog", "goat", "cow", "horse")
 
val phrases = listOf(
"",
"That wriggled and jiggled and tickled inside her",
"How absurd to swallow a bird",
"Fancy that to swallow a cat",
"What a hog, to swallow a dog",
"She just opened her throat and swallowed a goat",
"I don't know how she swallowed a cow",
"\n ...She's dead of course"
)
 
fun sing() {
for (i in 0..7) {
println("There was an old lady who swallowed a ${animals[i]};")
if (i > 0) println("${phrases[i]}!")
if (i == 7) return
println()
if (i > 0) {
for (j in i downTo 1) {
print(" She swallowed the ${animals[j]} to catch the ${animals[j - 1]}")
println(if (j < 3) ";" else ",")
if (j == 2) println(" ${phrases[1]}!")
}
}
println(" I don't know why she swallowed a fly - Perhaps she'll die!\n")
}
}
 
fun main(args: Array<String>) {
sing()
}</syntaxhighlight>
 
=={{header|Lambdatalk}}==
<syntaxhighlight lang="scheme">
{def A {A.new fly spider bird cat dog goat cow horse}}
-> A
 
{def H
{H.new
fly I don't know why she swallowed that fly{br}Perhaps she'll die |
spider That wiggled and jiggled and tickled inside her |
bird How absurd, to swallow a bird |
cat Imagine that. She swallowed a cat |
dog What a hog to swallow a dog |
goat She just opened her throat and swallowed that goat |
cow I don't know how she swallowed that cow |
horse She's dead of course
}}
-> H
 
{def oldlady {lambda {:w} There was an old lady who swallowed a :w}}
-> oldlady
 
{def swallow {lambda {:a :b} She swallowed the :a to catch the :b}}
-> swallow
 
Writing
 
{hr}{oldlady {A.get 0 {A}}}
{H.get {A.get 0 {A}} {H}}
 
{S.map {lambda {:i}
{hr}{oldlady {A.get :i {A}}}
{br}{H.get {A.get :i {A}} {H}}
{S.map {lambda {:j} {br}* {swallow {A.get :j {A}}
{A.get {- :j 1} {A}}}}
{S.serie :i 1 -1}}
{br}{H.get {A.get 0 {A}} {H}} }
{S.serie 1 6}}
 
{hr}{oldlady {A.get 7 {A}}}
{H.get {A.get 7 {A}} {H}}
 
displays:
 
There was an old lady who swallowed a fly
I don't know why she swallowed that fly
Perhaps she'll die
 
There was an old lady who swallowed a spider
That wiggled and jiggled and tickled inside her
* She swallowed the spider to catch the fly
I don't know why she swallowed that fly
Perhaps she'll die
 
There was an old lady who swallowed a bird
How absurd, to swallow a bird
* She swallowed the bird to catch the spider
* She swallowed the spider to catch the fly
I don't know why she swallowed that fly
Perhaps she'll die
 
...
 
There was an old lady who swallowed a cow
I don't know how she swallowed that cow
* She swallowed the cow to catch the goat
* She swallowed the goat to catch the dog
* She swallowed the dog to catch the cat
* She swallowed the cat to catch the bird
* She swallowed the bird to catch the spider
* She swallowed the spider to catch the fly
I don't know why she swallowed that fly
Perhaps she'll die
 
There was an old lady who swallowed a horse
She's dead of course
</syntaxhighlight>
 
=={{header|Liberty BASIC}}==
<syntaxhighlight lang="lb">
'[RC] Old lady swallowed a fly
'http://rosettacode.org/wiki/Old_lady_swallowed_a_fly
'lyrics
'http://www.timmyabell.com/music/lyrics/ol/oldlady.htm
 
animalList$="fly spider bird cat dog goat cow horse"
reason$(1)="I don't know why she swallowed the fly,"
reason$(2)="That wriggled and jiggled and tickled inside her."
reason$(3)="How absurd to swallow a bird!"
reason$(4)="Imagine that, to swallow a cat!"
reason$(5)="My, what a hog, to swallow a dog!"
reason$(6)="Just opened her throat and swallowed a goat!"
reason$(7)="I wonder how she swallowed a cow?!"
reason$(8)="She's dead, of course!!"
 
i=0
while 1
i=i+1
animal$ = word$(animalList$, i)
if animal$ ="" then exit while
verse$ = "I know an old lady who "
verse2$ = "swallowed a " +animal$
print verse$ +verse2$+","
print reason$(i)
if i = 8 then end
'--------------
animals$=animal$+" "+animals$
animal2$="*"
j=1
while 1
j=j+1
animal2$ = word$(animals$, j)
if animal2$ ="" then exit while
reason$="She swallowed the "+animal$+" to catch the "+animal2$+","
animal$ = animal2$
print reason$
if animal2$ = "fly" then print reason$(1)
if animal2$ = "spider" then print reason$(2)
wend
'--------------
print "I guess she'll die."
print
wend
 
end
</syntaxhighlight>
 
=={{header|Logo}}==
<syntaxhighlight lang="logo">make "data [
; animal inc comment
[fly 2 [I don't know why she swallowed that fly]]
[spider 2 [That wriggled and jiggled and tickled inside her]]
[bird 1 [Quite absurd, to swallow a bird]]
[cat 1 [How about that, to swallow a cat]]
[dog 1 [What a hog, to swallow a dog]]
[pig 1 [Her mouth was so big to swallow a pig]]
[goat 1 [She just opened her throat to swallow a goat.]]
[cow 1 [I don't know how she swallowed a cow.]]
[donkey 1 [It was rather wonky to swallow a donkey]]
[horse 0 [She's dead, of course!]]
]
 
foreach :data [
local "i make "i #
(local "animal "include "comment)
(foreach [animal include comment] ? "make)
print se [There was an old lady who swallowed a] :animal
print :comment
if greater? :include 0 [
if greater? :i 1 [
repeat difference :i 1 [
local "j make "j difference :i repcount
print (se [She swallowed the] (first item sum 1 :j :data)
[to catch the] (first item :j :data))
if greater? item 2 item :j :data 1 [print item 3 item :j :data]
]
]
print [Perhaps she'll die]
print "
]
]
 
bye</syntaxhighlight>
 
=={{header|Lua}}==
<syntaxhighlight lang="lua">animals = {"fly", "spider", "bird", "cat","dog", "goat", "cow", "horse"}
phrases = {
"",
"That wriggled and jiggled and tickled inside her",
"How absurd to swallow a bird",
"Fancy that to swallow a cat",
"What a hog, to swallow a dog",
"She just opened her throat and swallowed a goat",
"I don't know how she swallowed a cow",
" ...She's dead of course"
}
 
for i=0,7 do
io.write(string.format("There was an old lady who swallowed a %s\n", animals[i+1]))
if i>0 then io.write(phrases[i+1]) end
if i==7 then break end
if i>0 then
io.write("\n")
for j=i,1,-1 do
io.write(string.format("She swallowed the %s to catch the %s", animals[j+1], animals[j]))
-- if j<4 then p='.' else p=',' end
-- io.write(string.format("%s\n", p))
io.write("\n")
if j==2 then
io.write(string.format("%s!\n", phrases[2]))
end
end
end
io.write("I don't know why she swallowed a fly - Perhaps she'll die!\n\n")
end</syntaxhighlight>
 
=={{header|MAD}}==
<syntaxhighlight lang="mad"> NORMAL MODE IS INTEGER
INTERNAL FUNCTION(V)
ENTRY TO VERSE.
TRANSFER TO VS(V+1)
VS(1) PRINT COMMENT$ I DON'T KNOW WHY SHE SWALLOWED THAT FLY$
PRINT COMMENT$ PERHAPS SHE'LL DIE$
PRINT COMMENT$ $
FUNCTION RETURN V
VS(2) PRINT COMMENT
0 $ THAT WIGGLED AND JIGGLED AND TICKLED INSIDE HER$
FUNCTION RETURN V
VS(3) PRINT COMMENT$ HOW ABSURD TO SWALLOW A BIRD!$
FUNCTION RETURN V
VS(4) PRINT COMMENT$ IMAGINE THAT - SHE SWALLOWED A CAT!$
FUNCTION RETURN V
VS(5) PRINT COMMENT$ WHAT A HOG TO SWALLOW A DOG$
FUNCTION RETURN V
VS(6) PRINT COMMENT
0 $ SHE JUST OPENED HER THROAT AND SWALLOWED THAT GOAT$
FUNCTION RETURN V
VS(7) PRINT COMMENT$ I DON'T KNOW HOW SHE SWALLOWED THAT COW$
FUNCTION RETURN V
VS(8) PRINT COMMENT$ SHE'S DEAD, OF COURSE.$
END OF FUNCTION
VECTOR VALUES ANIMAL =
0 $FLY$,$SPIDER$,$BIRD$,$CAT$,$DOG$,$GOAT$,$COW$,$HORSE$
VECTOR VALUES LADY =
0 $38HTHERE WAS AN OLD LADY WHO SWALLOWED A ,C,1H,*$
VECTOR VALUES SWALLO =
0 $18HSHE SWALLOWED THE ,C,S1,13HTO CATCH THE ,C,1H,*$
THROUGH VERSE, FOR I=0, 1, I.G.7
PRINT FORMAT LADY, ANIMAL(I)
VERSE.(I)
THROUGH VERSE, FOR J=I, -1, J.E.0 .OR. I.GE.7
PRINT FORMAT SWALLO, ANIMAL(J), ANIMAL(J-1)
VERSE WHENEVER J.LE.2, VERSE.(J-1)
END OF PROGRAM </syntaxhighlight>
 
=={{header|Maple}}==
<syntaxhighlight lang="maple">swallowed := ["fly", "spider", "bird", "cat", "dog", "cow", "horse"]:
phrases := ["I don't know why she swallowed a fly, perhaps she'll die!",
"That wriggled and wiggled and tiggled inside her.",
"How absurd to swallow a bird.",
"Fancy that to swallow a cat!",
"What a hog, to swallow a dog.",
"I don't know how she swallowed a cow.",
"She's dead, of course."]:
for i to numelems(swallowed) do
printf("There was an old lady who swallowed a %s.\n%s\n", swallowed[i], phrases[i]);
if i > 1 and i < 7 then
for j from i by -1 to 2 do
printf("\tShe swallowed the %s to catch the %s.\n", swallowed[j], swallowed[j-1]);
end do;
printf("%s\n\n", phrases[1]);
elif i = 1 then
printf("\n");
end if;
end do;</syntaxhighlight>
{{out}}
<pre>
There was an old lady who swallowed a fly.
I don't know why she swallowed a fly, perhaps she'll die!
 
There was an old lady who swallowed a spider.
That wriggled and wiggled and tiggled inside her.
She swallowed the spider to catch the fly.
I don't know why she swallowed a fly, perhaps she'll die!
 
There was an old lady who swallowed a bird.
How absurd to swallow a bird.
She swallowed the bird to catch the spider.
She swallowed the spider to catch the fly.
I don't know why she swallowed a fly, perhaps she'll die!
 
There was an old lady who swallowed a cat.
Fancy that to swallow a cat!
She swallowed the cat to catch the bird.
She swallowed the bird to catch the spider.
She swallowed the spider to catch the fly.
I don't know why she swallowed a fly, perhaps she'll die!
 
There was an old lady who swallowed a dog.
What a hog, to swallow a dog.
She swallowed the dog to catch the cat.
She swallowed the cat to catch the bird.
She swallowed the bird to catch the spider.
She swallowed the spider to catch the fly.
I don't know why she swallowed a fly, perhaps she'll die!
 
There was an old lady who swallowed a cow.
I don't know how she swallowed a cow.
She swallowed the cow to catch the dog.
She swallowed the dog to catch the cat.
She swallowed the cat to catch the bird.
She swallowed the bird to catch the spider.
She swallowed the spider to catch the fly.
I don't know why she swallowed a fly, perhaps she'll die!
 
There was an old lady who swallowed a horse.
She's dead, of course.
</pre>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<syntaxhighlight lang="mathematica">animals = {"fly", "spider", "bird", "cat", "dog", "goat", "cow",
"horse"};
notes = {"", "That wiggled and jiggled and tickled inside her.\n",
"How absurd, to swallow a bird.\n",
"Imagine that. She swallowed a cat.\n",
"What a hog to swallow a dog.\n",
"She just opened her throat and swallowed that goat.\n",
"I don't know how she swallowed that cow.\n",
"She's dead, of course.",
"I don't know why she swallowed that fly.\nPerhaps she'll die.\n\n\
"};
Print[StringJoin @@ ("There was an old lady who swallowed a " <>
animals[[#]] <> ".\n" <> notes[[#]] <>
If[# == 8, "",
StringJoin @@ ("She swallowed the " <> animals[[#]] <>
" to catch the " <> animals[[# - 1]] <> ".\n" & /@
Range[#, 2, -1]) <> notes[[9]]] & /@ Range[8])];</syntaxhighlight>
{{out}}
<pre>There was an old lady who swallowed a fly.
I don't know why she swallowed that fly.
Perhaps she'll die.
 
There was an old lady who swallowed a spider.
That wiggled and jiggled and tickled inside her.
She swallowed the spider to catch the fly.
I don't know why she swallowed that fly.
Perhaps she'll die.
 
There was an old lady who swallowed a bird.
How absurd, to swallow a bird.
She swallowed the bird to catch the spider.
She swallowed the spider to catch the fly.
I don't know why she swallowed that fly.
Perhaps she'll die.
 
There was an old lady who swallowed a cat.
Imagine that. She swallowed a cat.
She swallowed the cat to catch the bird.
She swallowed the bird to catch the spider.
She swallowed the spider to catch the fly.
I don't know why she swallowed that fly.
Perhaps she'll die.
 
There was an old lady who swallowed a dog.
What a hog to swallow a dog.
She swallowed the dog to catch the cat.
She swallowed the cat to catch the bird.
She swallowed the bird to catch the spider.
She swallowed the spider to catch the fly.
I don't know why she swallowed that fly.
Perhaps she'll die.
 
There was an old lady who swallowed a goat.
She just opened her throat and swallowed that goat.
She swallowed the goat to catch the dog.
She swallowed the dog to catch the cat.
She swallowed the cat to catch the bird.
She swallowed the bird to catch the spider.
She swallowed the spider to catch the fly.
I don't know why she swallowed that fly.
Perhaps she'll die.
 
There was an old lady who swallowed a cow.
I don't know how she swallowed that cow.
She swallowed the cow to catch the goat.
She swallowed the goat to catch the dog.
She swallowed the dog to catch the cat.
She swallowed the cat to catch the bird.
She swallowed the bird to catch the spider.
She swallowed the spider to catch the fly.
I don't know why she swallowed that fly.
Perhaps she'll die.
 
There was an old lady who swallowed a horse.
She's dead, of course.</pre>
 
=={{header|Mercury}}==
<syntaxhighlight lang="mercury">:- module oldlady.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
:- implementation.
:- import_module list, string.
 
:- type animal
---> horse
; donkey
; cow
; goat
; pig
; dog
; cat
; bird
; spider
; fly.
 
:- func verse(animal) = string.
verse(horse) = "She's dead, of course!".
verse(donkey) = "It was rather wonky. To swallow a donkey.".
verse(cow) = "I don't know how. To swallow a cow.".
verse(goat) = "She just opened her throat. To swallow a goat.".
verse(pig) = "Her mouth was so big. To swallow a pig.".
verse(dog) = "What a hog. To swallow a dog.".
verse(cat) = "Fancy that. To swallow a cat.".
verse(bird) = "Quite absurd. To swallow a bird.".
verse(spider) = "That wriggled and jiggled and tickled inside her.".
verse(fly) = "I don't know why she swallowed the fly.".
 
:- pred tocatch(animal, animal).
:- mode tocatch(in, out) is semidet.
:- mode tocatch(out, in) is semidet.
tocatch(horse, donkey).
tocatch(donkey, cow).
tocatch(cow, goat).
tocatch(goat, pig).
tocatch(pig, dog).
tocatch(dog, cat).
tocatch(cat, bird).
tocatch(bird, spider).
tocatch(spider, fly).
 
:- pred swallow(animal::in, io::di, io::uo) is det.
swallow(A, !IO) :-
( if tocatch(A, B) then
io.format("She swallowed the %s to catch the %s.\n",
[s(string(A)), s(string(B))], !IO),
swallow(B, !IO)
else
io.format("%s\nPerhaps she'll die.\n\n", [s(verse(fly))], !IO)
).
 
:- pred swallowed(animal::in, io::di, io::uo) is det.
swallowed(A, !IO) :-
io.format("I know an old lady who swallowed a %s.\n", [s(string(A))], !IO),
( if A = horse then
io.write_string("She's dead, of course!\n", !IO)
else if A = fly, tocatch(B, A) then
swallow(A, !IO),
swallowed(B, !IO)
else if tocatch(B, A) then
io.write_string(verse(A), !IO),
io.nl(!IO),
swallow(A, !IO),
swallowed(B, !IO)
else
true
).
 
main(!IO) :-
swallowed(fly, !IO).</syntaxhighlight>
 
=={{header|Modula-2}}==
<syntaxhighlight lang="modula2">MODULE OldLady;
FROM FormatString IMPORT FormatString;
FROM Terminal IMPORT WriteString,WriteLn,ReadChar;
 
TYPE
AA = ARRAY[0..7] OF ARRAY[0..7] OF CHAR;
VA = ARRAY[0..7] OF ARRAY[0..63] OF CHAR;
VAR
buf : ARRAY[0..127] OF CHAR;
animals : AA;
verses : VA;
i,j : INTEGER;
BEGIN
FormatString("I don't know why she swallowed that fly.\nPerhaps she'll die\n", buf);
 
animals := AA{"fly", "spider", "bird", "cat", "dog", "goat", "cow", "horse"};
verses := VA{
"I don't know why she swallowed that fly.",
"That wiggled and jiggled and tickled inside her",
"How absurd, to swallow a bird",
"Imagine that. She swallowed a cat",
"What a hog to swallow a dog",
"She just opened her throat and swallowed that goat",
"I don't know how she swallowed that cow",
"She's dead of course"
};
 
FOR i:=0 TO 7 DO
FormatString("There was an old lady who swallowed a %s\n%s\n", buf, animals[i], verses[i]);
WriteString(buf);
IF i=0 THEN
WriteString("Perhaps she'll die");
WriteLn;
WriteLn;
END;
j := i;
WHILE (j>0) AND (i<7) DO
FormatString("She swallowed the %s to catch the %s\n", buf, animals[j], animals[j-1]);
WriteString(buf);
IF j=1 THEN
WriteString(verses[0]);
WriteLn;
WriteString("Perhaps she'll die");
WriteLn;
WriteLn
END;
DEC(j)
END;
END;
 
ReadChar
END OldLady.</syntaxhighlight>
 
=={{header|Nanoquery}}==
{{trans|Ursa}}
<syntaxhighlight lang="nanoquery">reason = {"She swallowed the ", " to catch the "}
creatures = {"fly", "spider", "bird", "cat", "dog", "goat", "cow", "horse"}
comments = {"I don't know why she swallowed that fly.\nPerhaps she'll die\n",\
"That wiggled and jiggled and tickled inside her",\
"How absurd, to swallow a bird",\
"Imagine that. She swallowed a cat",\
"What a hog to swallow a dog",\
"She just opened her throat and swallowed that goat",\
"I don't know how she swallowed that cow",\
"She's dead of course"}
 
max = len(creatures)
for i in range(0, max - 1)
println "There was an old lady who swallowed a " + creatures[i]
println comments[i]
for (j = i) ((j > 0) && (i < (max - 1))) (j -= 1)
println reason[0] + creatures[j] + reason[1] + creatures[j - 1]
if j = 1
println comments[j - 1]
end
end
end
 
input()</syntaxhighlight>
 
=={{header|Nim}}==
{{trans|Python}}
{{libheader|nim-lang/zip}}
<syntaxhighlight lang="nim">import zip/zlib, base64
 
const b64 = """
eNrtVE1rwzAMvedXaKdeRn7ENrb21rHCzmrs1m49K9gOJv9+cko/HBcGg0LHcpOfnq2np0QL
2FuKgBbICDAoeoiKwEc0hqIUgLAxfV0tQJCdhQM7qh68kheswKeBt5ROYetTemYMCC3rii//
WMS3WkhXVyuFAaLT261JuBWwu4iDbvYp1tYzHVS68VEIObwFgaDB0KizuFs38aSdqKv3TgcJ
uPYdn2B1opwIpeKE53qPftxRd88Y6uoVbdPzWxznrQ3ZUi3DudQ/bcELbevqM32iCIrj3IIh
W6plOJf6L6xaajZjzqW/qAsKIvITBGs9Nm3glboZzkVP5l6Y+0bHLnedD0CttIyrpEU5Kv7N
Mz3XkPBc/TSN3yxGiqMiipHRekycK0ZwMhM8jerGC9zuZaoTho3kMKSfJjLaF8v8wLzmXMqM
zJvGew/jnZPzclA08yAkikegDTTUMfzwDXBcwoE="""
 
echo b64.decode.uncompress()</syntaxhighlight>
 
=={{header|OCaml}}==
===Using a dictionary===
Only one minimalist line of code (the last line):
<syntaxhighlight lang="ocaml">let d = [|
"I know an old lady who swallowed a "; "fly"; ".\n";
"I don't know why she swallowed the fly.\nPerhaps she'll die.\n\n";
"spider"; "That wriggled and jiggled and tickled inside her";
"She swallowed the "; " to catch the "; "Bird"; "Quite absurd";
". To swallow a "; "Cat"; "Fancy that"; "Dog"; "What a hog"; "Pig";
"Her mouth was so big"; "Goat"; "She just opened her throat"; "Cow";
"I don't know how"; "Donkey"; "It was rather wonky";
"I know an old lady who swallowed a Horse.\nShe's dead, of course!\n";
|]
 
let s0 = [6;4;7;1;2;3]
let s1 = [6;8;7;4;2] @ s0
let s2 = [6;11;7;8;2] @ s1
let s3 = [6;13;7;11;2] @ s2
let s4 = [6;15;7;13;2] @ s3
let s5 = [6;17;7;15;2] @ s4
let s6 = [6;19;7;17;2] @ s5
let s7 = [6;21;7;19;2] @ s6
 
let s =
[0;1;2;3;0;4;2;5;2] @ s0 @
[0;8;2;9;10;8;2] @ s1 @
[0;11;2;12;10;11;2] @ s2 @
[0;13;2;14;10;13;2] @ s3 @
[0;15;2;16;10;15;2] @ s4 @
[0;17;2;18;10;17;2] @ s5 @
[0;19;2;20;10;19;2] @ s6 @
[0;21;2;22;10;21;2] @ s7 @
[23] ;;
 
List.iter (fun i -> print_string d.(i)) s</syntaxhighlight>
===Using dictionary based decompression===
{{trans|D}}
Here we use the function <code ocaml>String.fold_left</code> [http://ocaml-extlib.googlecode.com/svn/doc/apiref/ExtString.String.html#VALfold_left 1] which is not available in the standard library but in the [http://code.google.com/p/ocaml-extlib/ extlib]:
<syntaxhighlight lang="ocaml">let dict = [|
"_ha _c _e _p,\nQuite absurd_f_p;_`cat,\nFancy that_fcat;_j`dog,\nWhat a hog_\
fdog;_l`pig,\nHer mouth_qso big_fpig;_d_r,\nShe just opened her throat_f_r;_i\
cow,\n_mhow she_ga cow;_k_o,\nIt_qrather wonky_f_o;_a_o_bcow,_khorse...\nShe'\
s dead, of course!\n";"_a_p_b_e ";"\nS_t ";" to catch the ";"fly,\nBut _mwhy \
s_t fly,\nPerhaps she'll die!\n\n_ha";"_apig_bdog,_l`";"spider,\nThat wr_nj_n\
tickled inside her;_aspider_b_c";", to_s a ";"_sed ";"There_qan old lady who_\
g";"_a_r_bpig,_d";"_acat_b_p,_";"_acow_b_r,_i";"_adog_bcat,_j";"I don't know \
";"iggled and ";"donkey";"bird";" was ";"goat";" swallow";"he_gthe" |]
let rec old_lady part s =
ExtString.String.fold_left (fun s c ->
if s then old_lady dict.(Char.code c - 95) false
else if c = '_' then true
else (print_char c; s)
) s part
let _ =
old_lady dict.(0) false</syntaxhighlight>
===Using Logic===
<syntaxhighlight lang="ocaml">let an =
[| "fly"; "spider"; "bird"; "cat"; "dog"; "pig"; "goat"; "cow"; "donkey" |]
 
let cm =
[| "Quite absurd";
"Fancy that";
"What a hog";
"Her mouth was so big";
"She just opened her throat";
"I don't know how";
"It was rather wonky"; |]
 
let p = Printf.printf
 
let h n =
for i = n downto 1 do
if i = 1 then
p "That wriggled and jiggled and tickled inside her;\n";
p "She swallowed the %s to catch the %s,\n" an.(i) an.(i-1)
done
 
let g n =
if n >= 2 then p "%s, to swallow a %s;\n" cm.(n-2) an.(n)
 
let f n =
p "There was an old lady who swallowed a %s,\n" an.(n); g n; h n;
p "But I don't know why she swallowed the fly,\nPerhaps she'll die!\n\n"
 
let () =
for i = 0 to 8 do f i done;
p "There was an old lady who swallowed a horse...\n\
She's dead, of course!"</syntaxhighlight>
 
=={{header|Perl}}==
Using string subst:<syntaxhighlight lang="perl">my @animals = (
"fly",
"spider/That wriggled and jiggled and tickled inside her.\n",
"bird//Quite absurd!",
"cat//Fancy that!",
"dog//What a hog!",
"pig//Her mouth was so big!",
"goat//She just opened her throat!",
"cow//I don't know how;",
"donkey//It was rather wonkey!",
"horse:",
);
 
my $s = "swallow";
my $e = $s."ed";
my $t = "There was an old lady who $e a ";
my $_ = $t."But I don't know why she $e the fly;\nPerhaps she'll die!\n\n";
 
my ($a, $b, $c, $d);
while (my $x = shift @animals) {
s/$c//;
($a, $b, $c) = split('/', $x);
$d = " the $a";
 
$c =~ s/;/ she $e$d;\n/;
$c =~ s/!/, to $s$d;\n/;
 
s/$t/"$t$a,\n$c".(($b||$c) && "${b}She $e$d to catch the ")/e;
 
s/:.*/--\nShe's dead, of course!\n/s;
print;
}</syntaxhighlight>
Using compression:
(Assumes a Unix-like OS and the availability of the uudecode and bunzip2 utilities).
<syntaxhighlight lang="perl">open OUT, "| uudecode | bunzip2" and
print OUT <DATA> and
close OUT;
 
__DATA__
begin-base64 644 -
QlpoOTFBWSZTWUSbX/0AAZRfgAAQYIUACBFgbIA//96gQAK9oAAAxhMTQYIx
DIwmDEoAAAAAAxhMTQYIxDIwmBSkiNIaJtCCAzJPU1G4ueVmGZMsMzBz0N5v
hr4j29SRSSCZgyv8BDAAdOE3oFIFIhMAQMtm2Zy/MbRs9U1pgzCzGcaGnTYN
u5NJ+/D4TfkcZZ39PmNJuN8rxjMrJTfvr8rFkxmTDMGFjDLBleGh3L8zlhuO
9vcq6rom3TonOONxyJ1TlG3dz2Tu3xZNtzTLgZu21y1r0dOW/HLntrgdi9ow
hlHTsnRVbJ98DxjYs/K87Q1rJjWazCO7kHbIXUj9DS7dSMHVNSmhwrjHMc8D
INk476V5jJDmnOPXZM38aeAd+DUp/39ccxmDEf3H7u30Rk6zDLGZkPYNq9CP
Pzj39xsVe+KeupMjKsjONsG6dk1bajByHYPOMHxneP2Og3q+dR9ryGk19o0n
onYPUfEfhVc1V+kcbJwmQ/nRwn3Hp6pP4TqvTO/2TfNJkvrrbt8+a9N92oy2
FeXUOI8486Wvor1zajqPDfpwnrn2jOzvo8hkOPrpVajlwnjqPfIry5c0TbKL
559fx8xqpsquRaFYV9I9fT6p7RrI/Gv/F3JFOFCQRJtf/Q==
====</syntaxhighlight>
 
=={{header|Phix}}==
{{Trans|Ada}}
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">lines</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"Perhaps she'll die!\n"</span><span style="color: #0000FF;">},</span> <span style="color: #000000;">animals</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
<span style="color: #008080;">procedure</span> <span style="color: #000000;">swallow</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">animal</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">second_line</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">permanent_second_line</span><span style="color: #0000FF;">=</span><span style="color: #004600;">TRUE</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"There was an old lady who swallowed a %s,\n%s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">animal</span><span style="color: #0000FF;">,</span><span style="color: #000000;">second_line</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">animals</span><span style="color: #0000FF;">)!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">lines</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">prepend</span><span style="color: #0000FF;">(</span><span style="color: #000000;">lines</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"She swallowed the %s to catch the %s,\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">animal</span><span style="color: #0000FF;">,</span><span style="color: #000000;">animals</span><span style="color: #0000FF;">[$]}))</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #000000;">lines</span><span style="color: #0000FF;">,</span><span style="color: #008000;">""</span><span style="color: #0000FF;">)})</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">permanent_second_line</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">lines</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">prepend</span><span style="color: #0000FF;">(</span><span style="color: #000000;">lines</span><span style="color: #0000FF;">,</span><span style="color: #000000;">second_line</span><span style="color: #0000FF;">&</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">animals</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">animals</span><span style="color: #0000FF;">,</span><span style="color: #000000;">animal</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #008080;">procedure</span> <span style="color: #000000;">swallow_all</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">all</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">all</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">string</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">animal</span><span style="color: #0000FF;">,</span><span style="color: #000000;">line2</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">all</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
<span style="color: #000000;">swallow</span><span style="color: #0000FF;">(</span><span style="color: #000000;">animal</span><span style="color: #0000FF;">,</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"%s, %s a %s;"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">line2</span><span style="color: #0000FF;">,</span><span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">animal</span><span style="color: #0000FF;">=</span><span style="color: #008000;">"cow"</span><span style="color: #0000FF;">?</span><span style="color: #008000;">"she swallowed"</span><span style="color: #0000FF;">:</span><span style="color: #008000;">"to swallow"</span><span style="color: #0000FF;">),</span><span style="color: #000000;">animal</span><span style="color: #0000FF;">}),</span> <span style="color: #004600;">FALSE</span><span style="color: #0000FF;">);</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #000000;">swallow</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"fly"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"But I don't know why she swallowed the fly,"</span><span style="color: #0000FF;">);</span>
<span style="color: #000000;">swallow</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"spider"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"That wriggled and jiggled and tickled inside her;"</span><span style="color: #0000FF;">);</span>
<span style="color: #000000;">swallow_all</span><span style="color: #0000FF;">({{</span><span style="color: #008000;">"bird"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Quite absurd"</span><span style="color: #0000FF;">},{</span><span style="color: #008000;">"cat"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Fancy that"</span><span style="color: #0000FF;">},{</span><span style="color: #008000;">"dog"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"What a hog"</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">"pig"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Her mouth was so big"</span><span style="color: #0000FF;">},{</span><span style="color: #008000;">"goat"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"She just opened her throat"</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">"cow"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"I don't know how"</span><span style="color: #0000FF;">},{</span><span style="color: #008000;">"donkey"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"It was rather wonky"</span><span style="color: #0000FF;">}})</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"There was an old lady who swallowed a horse ...\nShe's dead, of course!"</span><span style="color: #0000FF;">)</span>
<!--</syntaxhighlight>-->
 
=={{header|PHP}}==
<syntaxhighlight lang="php"><?php
{{incorrect|PHP|The program does not produce the correct lyrics. (See talk page)}}
<lang php><?php
 
$swallowed = array(
Line 196 ⟶ 3,300:
else
print "Perhaps she'll die." . "\n\n";
}</langsyntaxhighlight>
 
=={{header|PicoLisp}}==
{{trans|C}}
<syntaxhighlight lang="picolisp">(de *Dict
`(chop
"_ha _c _e _p,/Quite absurd_f_p;_`cat,/Fancy that_fcat;_j`dog,\
/What a hog_fdog;_l`pig,/Her mouth_qso big_fpig;_d_r,/She just \
opened her throat_f_r;_icow,/_mhow she_ga cow;_k_o,/It_qrather \
wonky_f_o;_a_o_bcow,_khorse.../She's dead, of course!/" )
`(chop "_a_p_b_e ")
`(chop "/S_t ")
`(chop " to catch the ")
`(chop "fly,/But _mwhy s_t fly,/Perhaps she'll die!//_ha")
`(chop "_apig_bdog,_l`")
`(chop "spider,/That wr_nj_ntickled inside her;_aspider_b_c")
`(chop ", to_s a ")
`(chop "_sed ")
`(chop "There_qan old lady who_g")
`(chop "_a_r_bpig,_d")
`(chop "_acat_b_p,_")
`(chop "_acow_b_r,_i")
`(chop "_adog_bcat,_j")
`(chop "I don't know ")
`(chop "iggled and ")
`(chop "donkey")
`(chop "bird")
`(chop " was ")
`(chop "goat")
`(chop " swallow")
`(chop "he_gthe") )
 
(de oldLady (Lst Flg)
(loop
(let C (pop 'Lst)
(cond
(Flg
(setq Flg
(oldLady (get *Dict (- (char C) 94))) ) )
((= "_" C) (on Flg))
((= "/" C) (prinl))
(T (prin C)) ) )
(NIL Lst) )
Flg )
 
(oldLady (car *Dict))</syntaxhighlight>
 
=={{header|PL/M}}==
<syntaxhighlight lang="plm">100H:
 
/* CP/M CALL */
BDOS: PROCEDURE(FUNC, ARGS);
DECLARE FUNC BYTE, ARGS ADDRESS;
GO TO 5;
END BDOS;
 
/* PRINT STRING */
PRINT: PROCEDURE(STRING);
DECLARE STRING ADDRESS;
CALL BDOS(9, STRING);
END PRINT;
 
DECLARE COMMA$CRLF DATA (',',13,10,'$');
DECLARE CRLF DATA (13,10,'$');
 
DECLARE ANIMALS (8) ADDRESS;
ANIMALS(0) = .'FLY$';
ANIMALS(1) = .'SPIDER$';
ANIMALS(2) = .'BIRD$';
ANIMALS(3) = .'CAT$';
ANIMALS(4) = .'DOG$';
ANIMALS(5) = .'GOAT$';
ANIMALS(6) = .'COW$';
ANIMALS(7) = .'HORSE$';
 
DECLARE VERSES (8) ADDRESS;
VERSES(0) = .('I DON''T KNOW WHY SHE SWALLOWED THAT FLY',
' - PERHAPS SHE''LL DIE.',10,13,'$');
VERSES(1) = .'THAT WIGGLED AND JIGGLED AND TICKLED INSIDE HER$';
VERSES(2) = .'HOW ABSURD TO SWALLOW A BIRD$';
VERSES(3) = .'IMAGINED THAT - SHE SWALLOWED A CAT$';
VERSES(4) = .'WHAT A HOG TO SWALLOW A DOG$';
VERSES(5) = .'SHE JUST OPENED HER THROAT AND SWALLOWED THAT GOAT$';
VERSES(6) = .'I DON''T KNOW HOW SHE SWALLOWED THAT COW$';
VERSES(7) = .'SHE''S DEAD, OF COURSE.$';
DECLARE (I, J) BYTE;
DO I = 0 TO LAST(VERSES);
CALL PRINT(.'THERE WAS AN OLD LADY WHO SWALLOWED A $');
CALL PRINT(ANIMALS(I));
CALL PRINT(.COMMA$CRLF);
CALL PRINT(VERSES(I));
CALL PRINT(.CRLF);
J = I;
DO WHILE J > 0 AND I < LAST(ANIMALS);
CALL PRINT(.'SHE SWALLOWED THE $');
CALL PRINT(ANIMALS(J));
CALL PRINT(.' TO CATCH THE $');
CALL PRINT(ANIMALS(J-1));
CALL PRINT(.COMMA$CRLF);
IF J <= 2 THEN DO;
CALL PRINT(VERSES(J-1));
CALL PRINT(.CRLF);
END;
J = J - 1;
END;
END;
 
CALL BDOS(0,0);
EOF</syntaxhighlight>
 
=={{header|PowerShell}}==
<syntaxhighlight lang="powershell">
$lines = @(
'fly/'
'spider/That wiggled and jiggled and tickled inside her,'
'bird/How absurd, to swallow a bird,'
'cat/Imagine that. She swallowed a cat,'
'dog/What a hog to swallow a dog,'
'goat/She just opened her throat and swallowed that goat,'
'cow/I don''t know how she swallowed that cow,'
'horse/She''s dead of course!'
)
 
$eatenThings = @()
 
for($i=0; $i -lt $lines.Count; $i++)
{
$creature, $comment = $lines[$i].Split("/")
$eatenThings += $creature
 
"I know an old lady who swallowed a $creature,"
if ($comment) {$comment}
if ($i -eq ($lines.Count - 1)) {continue}
for($j=$i; $j -ge 1; $j--)
{
"She swallowed the {0} to catch the {1}," -f $eatenThings[$j, ($j-1)]
}
 
"I don't know why she swallowed the fly."
"Perhaps she'll die."
""
}</syntaxhighlight>
 
=={{header|Python}}==
<syntaxhighlight lang="python">import zlib, base64
 
b64 = b'''
eNrtVE1rwzAMvedXaKdeRn7ENrb21rHCzmrs1m49K9gOJv9+cko/HBcGg0LHcpOfnq2np0QL
2FuKgBbICDAoeoiKwEc0hqIUgLAxfV0tQJCdhQM7qh68kheswKeBt5ROYetTemYMCC3rii//
WMS3WkhXVyuFAaLT261JuBWwu4iDbvYp1tYzHVS68VEIObwFgaDB0KizuFs38aSdqKv3TgcJ
uPYdn2B1opwIpeKE53qPftxRd88Y6uoVbdPzWxznrQ3ZUi3DudQ/bcELbevqM32iCIrj3IIh
W6plOJf6L6xaajZjzqW/qAsKIvITBGs9Nm3glboZzkVP5l6Y+0bHLnedD0CttIyrpEU5Kv7N
Mz3XkPBc/TSN3yxGiqMiipHRekycK0ZwMhM8jerGC9zuZaoTho3kMKSfJjLaF8v8wLzmXMqM
zJvGew/jnZPzclA08yAkikegDTTUMfzwDXBcwoE='''
print(zlib.decompress(base64.b64decode(b64)).decode("utf-8", "strict"))</syntaxhighlight>
 
<syntaxhighlight lang="python">animals = [
("fly", "I don't know why she swallowed a fly, perhaps she'll die."),
("spider", "It wiggled and jiggled and tickled inside her."),
("bird", "How absurd, to swallow a bird."),
("cat", "Imagine that, she swallowed a cat."),
("dog", "What a hog, to swallow a dog."),
("goat", "She just opened her throat and swallowed a goat."),
("cow", "I don't know how she swallowed a cow."),
("horse", "She's dead, of course.")]
 
for i, (animal, lyric) in enumerate(animals):
print("There was an old lady who swallowed a {}.\n{}".format(animal, lyric))
 
if animal == "horse": break
 
for (predator, _), (prey, _) in zip(animals[i:0:-1], animals[i-1::-1]):
print("\tShe swallowed the {} to catch the {}".format(predator, prey))
 
if animal != "fly": print(animals[0][1]) # fly lyric
print() # new line</syntaxhighlight>
 
=={{header|R}}==
<syntaxhighlight lang="r">animals = list(
c("fly", "I don't know why she swallowed a fly, perhaps she'll die."),
c("spider", "It wiggled and jiggled and tickled inside her."),
c("bird", "How absurd, to swallow a bird."),
c("cat", "Imagine that, she swallowed a cat."),
c("dog", "What a hog, to swallow a dog."),
c("goat", "She just opened her throat and swallowed a goat."),
c("cow", "I don't know how she swallowed a cow."),
c("horse", "She's dead, of course.")
)
 
oldladyalive <- TRUE
oldladysnack <- 1
 
while(oldladyalive == TRUE) {
nextmeal <- animals[[oldladysnack]][1]
nextcomment <- animals[[oldladysnack]][2]
print(sprintf("There was an old lady who swallowed a %s. %s",nextmeal,nextcomment))
if(oldladysnack == 8){
oldladyalive <- FALSE # she ate a horse :(
} else if(oldladysnack > 1) {
for(i in oldladysnack:2) {
print(sprintf(" She swallowed the %s to catch the %s",
animals[[i]][1], #e.g. spider (to catch the...
animals[[i-1]][1])) # fly)
}
print(animals[[1]][2])
}
oldladysnack <- oldladysnack + 1
}
</syntaxhighlight>
 
=={{header|Racket}}==
<syntaxhighlight lang="racket">
#lang at-exp racket
 
(define (line . xs) (for-each display xs) (newline))
 
(let loop ([animals
'([fly #f]
[spider "That wriggled and wiggled and tiggled inside her"]
[bird "How absurd to swallow a bird"]
[cat "Fancy that to swallow a cat"]
[dog "What a hog, to swallow a dog"]
[cow "I don't know how she swallowed a cow"]
[horse "She's dead, of course"])]
[seen '()])
(when (pair? animals)
(match animals
[(list (list animal desc) more ...)
@line{There was an old lady that swallowed a @animal,}
(when desc @line{@|desc|.})
(when (pair? more)
(for ([this (cons animal seen)] [that seen])
@line{She swallowed the @this to catch the @that,})
@line{I don't know why she swallowed a fly - perhaps she'll die!}
@line{}
(loop more (cons animal seen)))])))
</syntaxhighlight>
Alternative solution:
<syntaxhighlight lang="racket">
#lang s-exp framework/private/decode
7VK7TsQwEOz9FcM1AcncZyCoQaLey/piCyuObJ+s/D3rXHj4lIIKgaCItJkZ7cyOfM0uTZ5m
7J6siQaFEmhE8AxPPCNbykiFvA/FMAhHP2v1AA5jl/EyhoJiZyRrLlW4xWSipSlVtvMe7MyV
Ul/0SZNjE7XIhSjRDYOv+Mgon+a8zm5MIoes3qvHJkuuf8su5ICecm8X7LvuOLjIWt3Lfjqk
U+SaYuVXditxxdu8b338rOvEUas7GvuVa44Tcuu2/qz7CHuu6PeWwGHQ6rmiBCtz24KwWy0I
3KZdqvwDbfWhXPhY+S59RLX5dkTapF66/2/3fYMNMZklVJfAhlgjHKW2k8B7tbtRrw==
</syntaxhighlight>
 
=={{header|Raku}}==
(formerly Perl 6)
<syntaxhighlight lang="raku" line>my @victims =
fly => " I don't know why S—",
spider => " That wriggled and jiggled and tickled inside her.",
bird => " How absurd, T!",
cat => " Fancy that, S!",
dog => " What a hog, T!",
goat => " She just opened her throat, and in walked the goat!",
cow => " I don't know how S!",
horse => " She's dead, of course...";
 
my @history = "I guess she'll die...\n";
 
for (flat @victims».kv) -> $victim, $_ is copy {
say "There was an old lady who swallowed a $victim...";
 
s/ «S» /she swallowed the $victim/;
s/ «T» /to swallow a $victim!/;
.say;
last when /dead/;
 
@history[0] ~~ s/^X/She swallowed the $victim/;
.say for @history;
@history.unshift($_) if @history < 5;
@history.unshift("X to catch the $victim,");
}</syntaxhighlight>
And that's how I larned it!
 
=={{header|REXX}}==
<syntaxhighlight lang="rexx">/*REXX program displays song lyrics for: "I Know an Old Lady who Swallowed a Fly". */
sw= 79 /*the width of the terminal screen, -1.*/
@.=; @.1 = "I don't know why she swallowed a fly,"
@.2 = "That wriggled and jiggled and tickled inside her."; @.2.0=.
@.3 = "How absurd to swallow a bird!"
@.4 = "Imagine that, to swallow a cat!"
@.5 = "My, what a hog, to swallow a dog!"
@.6 = "Just opened her throat and swallowed a goat!"
@.7 = "I wonder how she swallowed a cow?!"
@.8 = "She's dead, of course!!"
$ = 'fly spider bird cat dog goat cow horse'
#= words($) /*#: number of animals to be swallowed*/
 
do j=1 for #; say
say center('I know an old lady who swallowed a' word($, j)",", sw)
if j\==1 then say center(@.j, sw)
if j ==# then leave /*Is this the last verse? We're done.*/
do k=j to 2 by -1; km= k-1; ??= word($, km)','
say center('She swallowed the' word($,k) "to catch the" ??, sw)
if @.km.0\=='' then say center(@.km, sw)
end /*k*/ /* [↑] display the lyrics of the song.*/
say center(@.1, sw)
say center("I guess she'll die.", sw)
end /*j*/ /*stick a fork in it, we're all done. */</syntaxhighlight>
{{out|output|text=&nbsp; (with the lyrics being centered):}}
<pre>
I know an old lady who swallowed a fly,
I don't know why she swallowed a fly,
I guess she'll die.
 
I know an old lady who swallowed a spider,
That wriggled and jiggled and tickled inside her.
She swallowed the spider to catch the fly,
I don't know why she swallowed a fly,
I guess she'll die.
 
I know an old lady who swallowed a bird,
How absurd to swallow a bird!
She swallowed the bird to catch the spider,
That wriggled and jiggled and tickled inside her.
She swallowed the spider to catch the fly,
I don't know why she swallowed a fly,
I guess she'll die.
 
I know an old lady who swallowed a cat,
Imagine that, to swallow a cat!
She swallowed the cat to catch the bird,
She swallowed the bird to catch the spider,
That wriggled and jiggled and tickled inside her.
She swallowed the spider to catch the fly,
I don't know why she swallowed a fly,
I guess she'll die.
 
I know an old lady who swallowed a dog,
My, what a hog, to swallow a dog!
She swallowed the dog to catch the cat,
She swallowed the cat to catch the bird,
She swallowed the bird to catch the spider,
That wriggled and jiggled and tickled inside her.
She swallowed the spider to catch the fly,
I don't know why she swallowed a fly,
I guess she'll die.
 
I know an old lady who swallowed a goat,
Just opened her throat and swallowed a goat!
She swallowed the goat to catch the dog,
She swallowed the dog to catch the cat,
She swallowed the cat to catch the bird,
She swallowed the bird to catch the spider,
That wriggled and jiggled and tickled inside her.
She swallowed the spider to catch the fly,
I don't know why she swallowed a fly,
I guess she'll die.
 
I know an old lady who swallowed a cow,
I wonder how she swallowed a cow?!
She swallowed the cow to catch the goat,
She swallowed the goat to catch the dog,
She swallowed the dog to catch the cat,
She swallowed the cat to catch the bird,
She swallowed the bird to catch the spider,
That wriggled and jiggled and tickled inside her.
She swallowed the spider to catch the fly,
I don't know why she swallowed a fly,
I guess she'll die.
 
I know an old lady who swallowed a horse,
She's dead, of course!!
</pre>
 
=={{header|Ruby}}==
<syntaxhighlight lang="ruby">descriptions = {
:fly => "I don't know why S",
:spider => "That wriggled and jiggled and tickled inside her.",
:bird => "Quite absurd T",
:cat => "Fancy that, S",
:dog => "What a hog, S",
:goat => "She opened her throat T",
:cow => "I don't know how S",
:horse => "She's dead, of course.",
}
animals = descriptions.keys
 
animals.each_with_index do |animal, idx|
puts "There was an old lady who swallowed a #{animal}."
 
d = descriptions[animal]
case d[-1]
when "S" then d[-1] = "she swallowed a #{animal}."
when "T" then d[-1] = "to swallow a #{animal}."
end
puts d
break if animal == :horse
 
idx.downto(1) do |i|
puts "She swallowed the #{animals[i]} to catch the #{animals[i-1]}."
case animals[i-1]
when :spider, :fly then puts descriptions[animals[i-1]]
end
end
 
print "Perhaps she'll die.\n\n"
end</syntaxhighlight>
 
=={{header|Rust}}==
[https://play.rust-lang.org/?gist=294c9e29f206d7c8d8028aa5e7002d9a&version=nightly Rust Playground]
<syntaxhighlight lang="rust">enum Action {Once, Every, Die}
use Action::*;
 
fn main() {
let animals = [ ("horse" , Die , "She's dead, of course!")
, ("donkey", Once , "It was rather wonky. To swallow a donkey.")
, ("cow" , Once , "I don't know how. To swallow a cow.")
, ("goat" , Once , "She just opened her throat. To swallow a goat.")
, ("pig" , Once , "Her mouth was so big. To swallow a pig.")
, ("dog" , Once , "What a hog. To swallow a dog.")
, ("cat" , Once , "Fancy that. To swallow a cat.")
, ("bird" , Once , "Quite absurd. To swallow a bird.")
, ("spider", Once , "That wriggled and jiggled and tickled inside her.")
, ("fly" , Every, "I don't know why she swallowed the fly.")
];
 
for (i, a) in animals.iter().enumerate().rev() {
println!("There was an old lady who swallowed a {}\n{}", a.0, a.2);
 
if let Die = a.1 {break}
 
for (swallowed, to_catch) in animals[i..].iter().zip(&animals[i+1..]) {
println!("She swallowed the {} to catch the {}.", swallowed.0, to_catch.0);
 
if let Every = to_catch.1 {
println!("{}", to_catch.2);
}
}
 
println!("Perhaps she'll die.\n");
}
}</syntaxhighlight>
 
=={{header|Scala}}==
<syntaxhighlight lang="scala">case class Verse(animal: String, remark: String, die: Boolean = false, always: Boolean = false)
 
val verses = List(
Verse("horse", "She’s dead, of course!", die = true),
Verse("donkey", "It was rather wonky. To swallow a donkey."),
Verse("cow", "I don’t know how. To swallow a cow."),
Verse("goat", "She just opened her throat. To swallow a goat."),
Verse("pig", "Her mouth was so big. To swallow a pig."),
Verse("dog", "What a hog. To swallow a dog."),
Verse("cat", "Fancy that. To swallow a cat."),
Verse("bird", "Quite absurd. To swallow a bird."),
Verse("spider", "That wriggled and jiggled and tickled inside her."),
Verse("fly", "I don’t know why she swallowed the fly.", always = true)
)
 
for (i <- 1 to verses.size; verse = verses takeRight i; starting = verse.head) {
println(s"There was an old lady who swallowed a ${starting.animal},")
println(starting.remark)
if (!starting.die) {
for (List(it, next) <- verse.sliding(2,1)) {
println(s"She swallowed the ${it.animal} to catch the ${next.animal},")
if (next.always) println(next.remark)
}
println("Perhaps she’ll die!")
println
}
}</syntaxhighlight>
{{out}}
<pre>There was an old lady who swallowed a fly,
I don’t know why she swallowed the fly.
Perhaps she’ll die!
 
There was an old lady who swallowed a spider,
That wriggled and jiggled and tickled inside her.
She swallowed the spider to catch the fly,
I don’t know why she swallowed the fly.
Perhaps she’ll die!
 
There was an old lady who swallowed a bird,
Quite absurd. To swallow a bird.
She swallowed the bird to catch the spider,
She swallowed the spider to catch the fly,
I don’t know why she swallowed the fly.
Perhaps she’ll die!
 
...
 
There was an old lady who swallowed a horse,
She’s dead, of course!
</pre>
 
=={{header|Scratch}}==
See https://scratch.mit.edu/projects/192324257/.
 
=={{header|Seed7}}==
<syntaxhighlight lang="seed7">$ include "seed7_05.s7i";
 
const array array string: verses is [] (
[] ("fly", "I don't know why she swallowed the fly."),
[] ("spider", "That wriggled and jiggled and tickled inside her."),
[] ("bird", "Quite absurd. To swallow a bird."),
[] ("cat", "Fancy that. To swallow a cat."),
[] ("dog", "What a hog. To swallow a dog."),
[] ("pig", "Her mouth was so big. To swallow a pig."),
[] ("goat", "She just opened her throat. To swallow a goat."),
[] ("cow", "I don't know how. To swallow a cow."),
[] ("donkey", "It was rather wonky. To swallow a donkey."),
[] ("horse", "She's dead, of course!"));
 
const proc: main is func
local
var integer: verseNumber is 0;
var integer: animal is 0;
begin
for key verseNumber range verses do
writeln("There was an old lady who swallowed a " <& verses[verseNumber][1] <& ",");
writeln(verses[verseNumber][2]);
if verseNumber <> length(verses) then
for animal range verseNumber downto 2 do
writeln("She swallowed the " <& verses[animal][1] <& " to catch the " <& verses[pred(animal)][1] <& ",");
end for;
if verseNumber <> 1 then
writeln(verses[1][2]);
end if;
writeln("Perhaps she'll die!");
writeln;
end if;
end for;
end func;</syntaxhighlight>
 
=={{header|Sidef}}==
{{trans|Raku}}
<syntaxhighlight lang="ruby">var victims = [
:fly: " I don't know why S—",
:spider: " That wriggled and jiggled and tickled inside her.",
:bird: " How absurd, T!",
:cat: " Fancy that, S!",
:dog: " What a hog, T!",
:goat: " She just opened her throat, and in walked the goat!",
:cow: " I don't know how S!",
:horse: " She's dead, of course...",
];
 
var history = ["I guess she'll die...\n"];
 
victims.each { |pair|
var (victim, verse) = pair...;
say "There was an old lady who swallowed a #{victim}...";
 
verse.sub!(/\bS\b/, "she swallowed the #{victim}");
verse.sub!(/\bT\b/, "to swallow a #{victim}!");
 
say verse;
verse ~~ /dead/ && break;
 
history[0].sub!(/^X/, "She swallowed the #{victim}");
history.each{.say};
history.len < 5 && history.unshift(verse);
history.unshift("X to catch the #{victim},");
};</syntaxhighlight>
 
=={{header|Tcl}}==
Because the song is highly repetitive, it compresses wonderfully.
<syntaxhighlight lang="tcl">package require Tcl 8.6
 
puts [zlib inflate [binary decode base64 "
7VRNa8MwDL3nV2inXkZ+xDa29taxws5q7NZuPSvYDib/fnJKPxwXBoNCx3KTn56t
p6dEC9hbioAWyAgwKHqIisBHNIaiFICwMX1dLUCQnYUDO6oevJIXrMCngbeUTmHr
U3pmDAgt64ov/1jEt1pIV1crhQGi09utSbgVsLuIg272KdbWMx1UuvFRCDm8BYGg
wdCos7hbN/Gknair904HCbj2HZ9gdaKcCKXihOd6j37cUXfPGOrqFW3T81sc560N
2VItw7nUP23BC23r6jN9ogiK49yCIVuqZTiX+i+sWmo2Y86lv6gLCiLyEwRrPTZt
4JW6Gc5FT+ZemPtGxy53nQ9ArbSMq6RFOSr+zTM915DwXP00jd8sRoqjIoqR0XpM
nCtGcDITPI3qxgvc7mWqE4aN5DCknyYy2hfL/MC85lzKjMybxnsP452T83JQNPMg
JIpHoA001DH88A0=
"]]</syntaxhighlight>
 
=={{header|TXR}}==
Here is somewhat verbose program showing a different approach.
 
The idea is to start with the last two verses of the song, and then work backwards to produce the earlier verses. This is done by recursively pattern matching on the song to extract text and produce the earlier verse, which is then prepended to the song.
 
The later verse does not contain one key piece of information we need to produce the prior verse: the animal-specific answer line for the prior animal. So we look this up by scanning a text which serves as a table.
 
The recursion terminates when the second pattern case matches the first verse: the third line is "Perhaps she'll die". In this case the song is not lengthened any more, and a terminating flag variable is bound to true.
 
Note one detail: in the first verse we have "... don't know why she swallowed the fly". But in subsequent verses it is
"that fly" not "the fly". So we do a lookup on the fly also to substitute the appropriate line, and in the fly case we skip the original line (see the first <code>@(maybe)</code>).
<syntaxhighlight lang="txr">@(deffilter abbr
("IK" "I know an old lady who swallowed a") ("SW" "She swallowed the")
("SS" "she swallowed") ("CA" "to catch the") ("XX" "Perhaps she'll die")
("C" "cow") ("G" "goat") ("D" "dog") ("@" "cat") ("R" "bird")
("$" "spider") ("F" "fly"))
@(bind lastverse
("IK C"
"I don't know how SS the C"
"SW C CA G"
"SW G CA D"
"SW D CA @"
"SW @ CA R"
"SW R CA $"
"SW $ CA F"
"But I don't know why SS that F"
"XX"
""
"IK horse"
"She's alive and well of course!"))
@(bind animal_line
("G: Opened her throat and down went the G!"
"D: What a hog to swallow a D!"
"@: Imagine that! She swallowed a @!"
"R: How absurd to swallow a R!"
"$: That wriggled and jiggled and tickled inside her"
"F: But I don't know why SS the F"))
@(define expand_backwards (song lengthened_song done))
@ (local line2 line3 verse rest animal previous_animal previous_animal_verse)
@ (next :list song)
@ (cases)
IK @animal
@line2
SW @animal CA @previous_animal
@ (maybe)
But @(skip)F
@ (end)
@ (collect)
@ verse
@ (until)
 
@ (end)
@ (collect)
@ rest
@ (end)
@ (next :list animal_line)
@ (skip)
@previous_animal: @previous_animal_verse
@ (output :into lengthened_song)
IK @previous_animal
@previous_animal_verse
@ (repeat)
@ verse
@ (end)
 
@ (repeat)
@ song
@ (end)
@ (end)
@ (bind done nil)
@ (or)
IK @(skip)
@line2
XX
@ (bind lengthened_song song)
@ (bind done t)
@ (end)
@(end)
@(define expand_song (in out))
@ (local lengthened done)
@ (expand_backwards in lengthened done)
@ (cases)
@ (bind done nil)
@ (expand_song lengthened out)
@ (or)
@ (bind out lengthened)
@ (end)
@(end)
@(expand_song lastverse song)
@(output :filter abbr)
@ (repeat)
@song
@ (end)
@(end)</syntaxhighlight>
 
=={{header|UNIX Shell}}==
{{works_with|Bash}}
<syntaxhighlight lang="sh">animals=(fly spider bird cat dog pig goat cow donkey horse)
comments=("I don't know why she swallowed that fly"
"That wriggled and jiggled and tickled inside her"
"Quite absurd, to swallow a bird"
"How about that, to swallow a cat"
"What a hog, to swallow a dog"
"Her mouth was so big to swallow a pig"
"She just opened her throat to swallow a goat."
"I don't know how she swallowed a cow."
"It was rather wonky to swallow a donkey"
"She's dead, of course!")
include=(2 2 1 1 1 1 1 1 1 0)
 
for (( i=0; i<${#animals[@]}; ++i )); do
echo "There was an old lady who swallowed a ${animals[i]}"
echo "${comments[i]}"
if (( include[i] )); then
if (( i )); then
for (( j=i-1; j>=0; --j )); do
echo "She swallowed the ${animals[j+1]} to catch the ${animals[j]}"
if (( include[j] > 1 )); then
echo "${comments[j]}"
fi
done
fi
echo "Perhaps she'll die"
echo
fi
done</syntaxhighlight>
 
=={{header|Ursa}}==
{{trans|C#}}
<syntaxhighlight lang="ursa">decl string<> reason creatures comments
append "She swallowed the " " to catch the " reason
append "fly" "spider" "bird" "cat" "dog" "goat" "cow" "horse" creatures
append "I don't know why she swallowed that fly.\nPerhaps she'll die\n" comments
append "That wiggled and jiggled and tickled inside her" comments
append "How absurd, to swallow a bird" comments
append "Imagine that. She swallowed a cat" comments
append "What a hog to swallow a dog" comments
append "She just opened her throat and swallowed that goat" comments
append "I don't know how she swallowed that cow" comments
append "She's dead of course" comments
 
decl int max
set max (size creatures)
for (decl int i) (< i max) (inc i)
out "There was an old lady who swallowed a " creatures<i> endl console
out comments<i> endl console
decl int j
for (set j i) (and (> j 0) (< i (- max 1))) (dec j)
out reason<0> creatures<j> reason<1> creatures<(int (- j 1))> endl console
if (= j 1)
out comments<(int (- j 1))> endl console
end if
end for
end for
in string console</syntaxhighlight>
 
=={{header|VBScript}}==
<syntaxhighlight lang="vb">
a=array( _
array("fly",""),_
array("spider","That wiggled and jiggled and tickled inside her"), _
array("bird","How absurd, to swallow a bird"), _
array("cat","Imagine that. She swallowed a cat"), _
array("dog","What a hog to swallow a dog"), _
array("goat","She just opened her throat and swallowed that goat"),_
array("cow","I don't know how she swallowed that cow"), _
array("horse","She's dead of course...")_
)
 
b1="I don't know why she swallowed the fly." & vbcrlf &"Perhaps she'll die."& vbcrlf
b2="There was an old lady who swallowed a @ani@."
b3="She swallowed the @ani@ to catch the @pani@."
 
sub print(s): wscript.stdout.write(s) & vbcrlf : end sub
 
for i=0 to ubound(a)
ani=a(i)(0)
print replace(b2,"@ani@",ani)
print a(i)(1)
if i=ubound(a) then exit for 'horse
for j= i-1 to 0 step -1
oldani=ani
ani=a(j)(0)
print replace(replace(b3,"@ani@",oldani),"@pani@",ani)
if j=1 then print a(1)(1) ' spider
next
print b1
next
</syntaxhighlight>
=={{header|V (Vlang)}}==
<syntaxhighlight lang="v (vlang)">const (
name = 0
lyric = 1
animals = [
["fly", "I don't know why she swallowed a fly. Perhaps she'll die."],
["spider", "That wiggled and jiggled and tickled inside her."],
["bird", "How absurd, to swallow a bird."],
["cat", "Imagine that, she swallowed a cat."],
["dog", "What a hog, to swallow a dog."],
["goat", "She just opened her throat and swallowed that goat."],
["cow", "I don't know how she swallowed that cow."],
["horse", "She's dead, of course."],
]
)
fn main() {
for i, animal in animals {
println("There was an old lady who swallowed a ${animal[name]},")
if i > 0 {
println(animal[lyric])
}
// Swallowing the last animal signals her death, cutting the
// lyrics short.
if i+1 == animals.len {
break
}
for j := i; j > 0; j-- {
println("She swallowed the ${animals[j][name]} to catch the ${animals[j-1][name]},")
}
println("${animals[0][lyric]}\n")
}
}</syntaxhighlight>
 
{{out}}
<pre>
There was an old lady who swallowed a fly,
I don't know why she swallowed a fly. Perhaps she'll die.
 
There was an old lady who swallowed a spider,
That wiggled and jiggled and tickled inside her.
She swallowed the spider to catch the fly,
I don't know why she swallowed a fly. Perhaps she'll die.
 
There was an old lady who swallowed a bird,
How absurd, to swallow a bird.
She swallowed the bird to catch the spider,
She swallowed the spider to catch the fly,
I don't know why she swallowed a fly. Perhaps she'll die.
 
There was an old lady who swallowed a cat,
Imagine that, she swallowed a cat.
She swallowed the cat to catch the bird,
She swallowed the bird to catch the spider,
She swallowed the spider to catch the fly,
I don't know why she swallowed a fly. Perhaps she'll die.
 
There was an old lady who swallowed a dog,
What a hog, to swallow a dog.
She swallowed the dog to catch the cat,
She swallowed the cat to catch the bird,
She swallowed the bird to catch the spider,
She swallowed the spider to catch the fly,
I don't know why she swallowed a fly. Perhaps she'll die.
 
There was an old lady who swallowed a goat,
She just opened her throat and swallowed that goat.
She swallowed the goat to catch the dog,
She swallowed the dog to catch the cat,
She swallowed the cat to catch the bird,
She swallowed the bird to catch the spider,
She swallowed the spider to catch the fly,
I don't know why she swallowed a fly. Perhaps she'll die.
 
There was an old lady who swallowed a cow,
I don't know how she swallowed that cow.
She swallowed the cow to catch the goat,
She swallowed the goat to catch the dog,
She swallowed the dog to catch the cat,
She swallowed the cat to catch the bird,
She swallowed the bird to catch the spider,
She swallowed the spider to catch the fly,
I don't know why she swallowed a fly. Perhaps she'll die.
 
There was an old lady who swallowed a horse,
She's dead, of course.
</pre>
 
=={{header|Wren}}==
{{trans|Kotlin}}
<syntaxhighlight lang="wren">var animals = ["fly", "spider", "bird", "cat","dog", "goat", "cow", "horse"]
 
var phrases = [
"",
"That wriggled and jiggled and tickled inside her",
"How absurd to swallow a bird",
"Fancy that to swallow a cat",
"What a hog, to swallow a dog",
"She just opened her throat and swallowed a goat",
"I don't know how she swallowed a cow",
"\n ...She's dead of course"
]
 
var sing = Fn.new {
for (i in 0..7) {
System.print("There was an old lady who swallowed a %(animals[i]);")
if (i > 0) System.print("%(phrases[i])!")
if (i == 7) return
System.print()
if (i > 0) {
for (j in i..1) {
System.write(" She swallowed the %(animals[j]) to catch the %(animals[j - 1])")
System.print((j < 3) ? ";" :",")
if (j == 2) System.print(" %(phrases[1])!")
}
}
System.print(" I don't know why she swallowed a fly - Perhaps she'll die!\n")
}
}
 
sing.call()</syntaxhighlight>
 
=={{header|XPL0}}==
{{trans|C}}
<syntaxhighlight lang "XPL0">include xpllib; \For Print
 
int Animals, Verses, I, J;
[Animals:= ["fly", "spider", "bird", "cat", "dog", "goat", "cow", "horse"];
Verses:= [
"I don't know why she swallowed that fly.^m^jPerhaps she'll die^m^j",
"That wiggled and jiggled and tickled inside her",
"How absurd, to swallow a bird",
"Imagine that. She swallowed a cat",
"What a hog to swallow a dog",
"She just opened her throat and swallowed that goat",
"I don't know how she swallowed that cow",
"She's dead of course" ];
for I:= 0 to 8-1 do
[Print("There was an old lady who swallowed a %s\n%s\n", Animals(I), Verses(I));
J:= I;
while J > 0 and I < 8-1 do
[Print("She swallowed the %s to catch the %s\n", Animals(J), Animals(J-1));
if J = 1 then Print("%s\n", Verses(0));
J:= J-1;
]
]
]</syntaxhighlight>
 
=={{header|Z80 Assembly}}==
Copy this into WinApe's built-in assembler, press Ctrl+F9 to assemble, then type <code>CALL &8000</code> into the BASIC terminal to see the output. (Remember that WinApe uses pure ASCII meaning that Shift+6 on your keyboard is the & symbol!)
Press any key to print each verse. After the last verse, press any key to return to BASIC.
 
<syntaxhighlight lang="z80">waitChar equ &BB06
PrintChar equ &BB5A
 
org &8000
 
ld ix,VerseTable
ld iy,OldLadyLookup
ld b,8 ;8 verses total
 
 
outerloop_song:
push bc
ld a,(ix+0)
ld c,a ;get the low byte of verse ptr
ld a,(ix+1)
ld b,a ;get the high byte
;bc = the memory location of Verse1
call loop_meta_PrintString
inc ix
inc ix ;next verse
pop bc
 
call WaitChar ;wait for user to press any key before continuing so they
; have time to read it.
 
djnz outerloop_song
 
ReturnToBasic:
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SUBROUTINES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
loop_meta_PrintString:
ld a,(bc)
or a ;compare A to 0. 0 is the null terminator for verses.
ret z
cp 255 ;255 means "goto the verse specified after the 255"
jr z,GotoPreviousVerse
ld (smc_loop_meta_PrintString_alpha+2),a
;use self modifying code to point IY's offset to the correct
; song line, without changing IY itself.
inc a
ld (smc_loop_meta_PrintString_beta+2),a
smc_loop_meta_PrintString_alpha:
ld a,(iy+0) ;the "+0" gets clobbered with the desired lyric low byte
ld L,a
smc_loop_meta_PrintString_beta:
ld a,(iy+0) ;the "+0" gets clobbered with the desired lyric high byte
ld H,a
call PrintString ;now print the string in HL.
inc bc
jp loop_meta_PrintString
;;;;;;;;;;;;;;;;;;;;;;;
GotoPreviousVerse:
inc bc ;advance past &FF opcode
ld a,(bc) ;get low byte
ld e,a
inc bc ;advance to high byte
ld a,(bc)
ld d,a
push de
pop bc
inc bc ;advance past "There was an old lady who..."
jp loop_meta_PrintString
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PrintString:
ld a,(hl)
or a
ret z
call PrintChar
inc hl
jr PrintString
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DATA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
VerseTable:
word Verse1,Verse2,Verse3,Verse4,Verse5,Verse6,Verse7,Verse8
Verse1:
byte 2,4,40,6,40,0 ;fly
Verse2:
byte 2,8,40,10,40,36,8,38,255 ;spider
word Verse1
Verse3:
byte 2,12,40,14,40,36,12,38,255 ;bird
word Verse2
Verse4:
byte 2,16,40,18,40,36,16,38,255 ;cat
word Verse3
Verse5:
byte 2,20,40,22,40,36,20,38,255 ;dog
word Verse4
Verse6:
byte 2,24,40,26,40,36,24,38,255 ;goat
word Verse5
Verse7:
byte 2,28,40,30,40,36,28,38,255 ;cow
word Verse6
Verse8:
byte 2,32,40,34,0 ;horse
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
OldLadyLookup:
word null ;0
word OldLady ;2
word Fly ;4
word Fly2 ;6
word Spider ;8
word Spider2 ;10
word Bird ;12
word Bird2 ;14
word Cat ;16
word Cat2 ;18
word Dog ;20
word Dog2 ;22
word Goat ;24
word Goat2 ;26
word Cow ;28
word Cow2 ;30
word Horse ;32
word Horse2 ;34
word Catch1 ;36
word Catch2 ;38
word Song_NewLine ;40
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
null:
byte 0
OldLady:
byte "There was an old lady who swallowed a ",0
Fly:
byte "fly",0
Fly2:
byte "I don't know why she swallowed a fly, perhaps she'll die.",0
Spider:
byte "spider",0
Spider2:
byte "It wiggled and jiggled and tickled inside her.",0
Bird:
byte "bird",0
Bird2:
byte "How absurd, to swallow a bird.",0
Cat:
byte "cat",0
Cat2:
byte "Imagine that, she swallowed a cat.",0
Dog:
byte "dog",0
Dog2:
byte "What a hog, to swallow a dog.",0
Goat:
byte "goat",0
Goat2:
byte "She just opened her throat and swallowed a goat.",0
Cow:
byte "cow",0
Cow2:
byte "I don't know how she swallowed a cow.",0
Horse:
byte "horse",0
Horse2:
byte "She's dead, of course.",0
Catch1:
byte "She swallowed the ",0
Catch2:
byte " to catch the ",0
Song_NewLine:
byte 13,10,0 ;control codes for a new line.</syntaxhighlight>
 
=={{header|zkl}}==
{{trans|Tcl}}
Uncompresses the base64 encoded gziped text of the song. Uses shared libraries zlib and msg hashing for the codecs.
<syntaxhighlight lang="zkl">var ZLib=Import("zeelib"), MsgHash=Import("zklMsgHash");
text:=
"eJztlE1uwyAQhdflFOOVNyhXyLap1FV7AWKIoaFMBFjIt++M7YVpLfVHilQp2cHMg3l8T+IA"
"54AFVAD0GrzSIxSLkIryHovRoODkRykOoDG0eVYXO0KyZqXKtFt0/WBS4nbrPWhndoKK3w5J"
"F6dNlA/i1aoMJbq+99wIGt5W6+y6M69dSKQHa+JOvHxxMl8GGaFTubNrd9d9xdFFLcUjq45p"
"iJotLP2l22zY5XptdqHxaxjyP8GgcXT4XfUuGLqNdjUO6m/RoHJtdoZ6M9g09lI8j5Ia9AoF"
"lvY1OFJsgaNybXcK4LYA/4Bvj4zlaUgZ8GIC1SzbsBEZN9n/LN5izfXa+hTbPZQ/fxZY+HDB"
"wPMtqesBk2K/+V+QtvI7B3zP7OqZWYzJTI7aBNooLQFPlMdA5aYRH3dS5jc=";
 
MsgHash.base64decode(text) :
ZLib.Inflator().write(_).close().read().text.println();</syntaxhighlight>
{{out}}
<pre>
I know an old lady who swallowed a fly,
I don't know why she swallowed the fly,
I guess she'll die.
...
I know an old lady who swallowed a horse,
She's dead, of course!!
</pre>
Anonymous user