<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.compsci.ca/skins/common/feed.css?270"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://wiki.compsci.ca/index.php?action=history&amp;feed=atom&amp;title=Pascal_Whirlwind</id>
		<title>Pascal Whirlwind - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.compsci.ca/index.php?action=history&amp;feed=atom&amp;title=Pascal_Whirlwind"/>
		<link rel="alternate" type="text/html" href="http://wiki.compsci.ca/index.php?title=Pascal_Whirlwind&amp;action=history"/>
		<updated>2026-05-01T13:46:59Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.16.0</generator>

	<entry>
		<id>http://wiki.compsci.ca/index.php?title=Pascal_Whirlwind&amp;diff=3567&amp;oldid=prev</id>
		<title>Wtd: /* Hello, Pascal! */</title>
		<link rel="alternate" type="text/html" href="http://wiki.compsci.ca/index.php?title=Pascal_Whirlwind&amp;diff=3567&amp;oldid=prev"/>
				<updated>2008-10-14T03:55:48Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Hello, Pascal!&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
		&lt;tr valign='top'&gt;
		&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Older revision&lt;/td&gt;
		&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Revision as of 03:55, 14 October 2008&lt;/td&gt;
		&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;== Hello, Pascal! ==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;== Hello, Pascal! ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Let me just open my text editor and create a file called hellopascal.pas.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Let me just open my text editor and create a file called &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;tt&amp;gt;&lt;/ins&gt;hellopascal.pas&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;/tt&amp;gt;&lt;/ins&gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;program HelloPascal;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;program HelloPascal;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 8:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 8:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;end.&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;end.&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;And then assuming I've installed the Free Pascal Compiler, I simply &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;opern &lt;/del&gt;my command-line, run &amp;quot;fpc hellopascal&amp;quot;, and I'm left with a binary by the same name.&amp;nbsp; I don't need to attach the &amp;quot;.pas&amp;quot; extension.&amp;nbsp; The compiler knows to look for source files with that extension.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;And then assuming I've installed the &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;[[&lt;/ins&gt;Free Pascal&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;]] &lt;/ins&gt;Compiler, I simply &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;open &lt;/ins&gt;my command-line, run &amp;quot;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;tt&amp;gt;&lt;/ins&gt;fpc hellopascal&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;/tt&amp;gt;&lt;/ins&gt;&amp;quot;, and I'm left with a binary by the same name.&amp;nbsp; I don't need to attach the &amp;quot;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;tt&amp;gt;&lt;/ins&gt;.pas&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;/tt&amp;gt;&lt;/ins&gt;&amp;quot; extension.&amp;nbsp; The compiler knows to look for source files with that extension.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;== Names for things ==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;== Names for things ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Wtd</name></author>	</entry>

	<entry>
		<id>http://wiki.compsci.ca/index.php?title=Pascal_Whirlwind&amp;diff=3566&amp;oldid=prev</id>
		<title>Wtd at 03:54, 14 October 2008</title>
		<link rel="alternate" type="text/html" href="http://wiki.compsci.ca/index.php?title=Pascal_Whirlwind&amp;diff=3566&amp;oldid=prev"/>
				<updated>2008-10-14T03:54:06Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Hello, Pascal! ==&lt;br /&gt;
&lt;br /&gt;
Let me just open my text editor and create a file called hellopascal.pas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;program HelloPascal;&lt;br /&gt;
begin&lt;br /&gt;
   writeln('Hello, Pascal!')&lt;br /&gt;
end.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And then assuming I've installed the Free Pascal Compiler, I simply opern my command-line, run &amp;quot;fpc hellopascal&amp;quot;, and I'm left with a binary by the same name.  I don't need to attach the &amp;quot;.pas&amp;quot; extension.  The compiler knows to look for source files with that extension.&lt;br /&gt;
&lt;br /&gt;
== Names for things ==&lt;br /&gt;
&lt;br /&gt;
Let's give that message a name.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;program HelloPascal;&lt;br /&gt;
const&lt;br /&gt;
   greeting = 'Hello, Pascal!';&lt;br /&gt;
begin&lt;br /&gt;
   writeln(greeting)&lt;br /&gt;
end.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It's a tribute to Pascal that what I've done is pretty easy to see.  I've started a const clause, in which I define constant values and give them names.&lt;br /&gt;
&lt;br /&gt;
But why the semi-colon ''there''?  Pascal uses semi-colons as separators.  The semi-colon indicates to the compiler that I wish to separate two things.  In thise case, I'm separating the definition of the constant greeting, and the begin keyword.  One is not necessary after the call to the writeln procedure because Pascal gives special importance to the &amp;quot;end&amp;quot; keyword.&lt;br /&gt;
&lt;br /&gt;
Let's say that I now wish to give a name to the very action of writing that message.  I'll create a procedure, sicne procedures and fucntions are how executable code is primarily grouped and named.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;program HelloPascal;&lt;br /&gt;
const&lt;br /&gt;
   greeting = 'Hello, Pascal!';&lt;br /&gt;
   &lt;br /&gt;
   procedure WriteMessage;&lt;br /&gt;
   begin&lt;br /&gt;
      writeln(greeting)&lt;br /&gt;
   end;&lt;br /&gt;
begin&lt;br /&gt;
   WriteMessage&lt;br /&gt;
end.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Greeting anyone ==&lt;br /&gt;
&lt;br /&gt;
A bit of flexibility would be nice.  To that end I'll define a greet procedure with a name parameter, and then pass 'world' as its argument when I call it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;program HelloPascal;&lt;br /&gt;
const&lt;br /&gt;
   greeting = 'Hello, Pascal!';&lt;br /&gt;
&lt;br /&gt;
   procedure WriteMessage;&lt;br /&gt;
   begin&lt;br /&gt;
      writeln(greeting)&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   procedure Greet(name: string);&lt;br /&gt;
   begin&lt;br /&gt;
      writeln('Hello, ' + name + '!')&lt;br /&gt;
   end;&lt;br /&gt;
begin&lt;br /&gt;
   WriteMessage;&lt;br /&gt;
   Greet('world')&lt;br /&gt;
end.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Let's discriminate ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;program HelloPascal;&lt;br /&gt;
   procedure Greet(name: string);&lt;br /&gt;
   begin&lt;br /&gt;
      if name = 'wtd' then&lt;br /&gt;
         writeln(name + '?!  That cur!')&lt;br /&gt;
      else&lt;br /&gt;
         writeln('Hello, ' + name + '!')&lt;br /&gt;
   end;&lt;br /&gt;
begin&lt;br /&gt;
   Greet('wtd')&lt;br /&gt;
end.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
But that only said one thing to wtd, and that's just not enough.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;program HelloPascal;&lt;br /&gt;
   procedure Greet(name: string);&lt;br /&gt;
   begin&lt;br /&gt;
      if name = 'wtd' then &lt;br /&gt;
         begin&lt;br /&gt;
            writeln(name + '?!  That cur!');&lt;br /&gt;
            writeln('Off with the scoundrel''s head!')&lt;br /&gt;
         end&lt;br /&gt;
      else&lt;br /&gt;
         writeln('Hello, ' + name + '!')&lt;br /&gt;
   end;&lt;br /&gt;
begin&lt;br /&gt;
   Greet('wtd')&lt;br /&gt;
end.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== A quick note ==&lt;br /&gt;
&lt;br /&gt;
Pascal is case-insensitive, so you may see code with If or IF.  That's fine.  You can define Greet and then use it as greet, and that is also fine.  The best advice is to pick a style and stick to it.&lt;br /&gt;
&lt;br /&gt;
== Let's use a type ==&lt;br /&gt;
&lt;br /&gt;
Let's create a record type which contains a more complex name, and a procedure which acts on it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;program HelloPascal;&lt;br /&gt;
type&lt;br /&gt;
   name = record&lt;br /&gt;
      first, last : string;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   procedure Greet(n : name);&lt;br /&gt;
   begin&lt;br /&gt;
      writeln('Hello, ', n.first, ' ', n.last, '!')&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
   bobsName : name;&lt;br /&gt;
begin&lt;br /&gt;
   bobsName.first := 'Bob';&lt;br /&gt;
   bobsName.last := 'Smith';&lt;br /&gt;
&lt;br /&gt;
   Greet(bobsName)&lt;br /&gt;
end.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Let's add a bit of sugar ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;program HelloPascal;&lt;br /&gt;
type&lt;br /&gt;
   name = record&lt;br /&gt;
      first, last : string;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   procedure Greet(n : name);&lt;br /&gt;
   begin&lt;br /&gt;
      with n do&lt;br /&gt;
         writeln('Hello, ', first, ' ', last, '!')&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
   bobsName : name;&lt;br /&gt;
begin&lt;br /&gt;
   bobsName.first := 'Bob';&lt;br /&gt;
   bobsName.last := 'Smith';&lt;br /&gt;
&lt;br /&gt;
   Greet(bobsName)&lt;br /&gt;
end.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Isn't consistency grand? ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;program HelloPascal;&lt;br /&gt;
type&lt;br /&gt;
   name = record&lt;br /&gt;
      first, last : string;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   procedure Greet(n : name);&lt;br /&gt;
   begin&lt;br /&gt;
      with n do&lt;br /&gt;
         writeln('Hello, ', first, ' ', last, '!')&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
   bobsName : name;&lt;br /&gt;
begin&lt;br /&gt;
   with bobsName do begin&lt;br /&gt;
      first := 'Bob';&lt;br /&gt;
      last := 'Smith';&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   Greet(bobsName)&lt;br /&gt;
end.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note how I provided a block of code to the with construct, rather than just a single statement.  You should also note that this is how I did the same for conditionals.&lt;br /&gt;
&lt;br /&gt;
== New names are good ==&lt;br /&gt;
&lt;br /&gt;
So let's create a procedure which helps us create them.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;program HelloPascal;&lt;br /&gt;
type&lt;br /&gt;
   name = record&lt;br /&gt;
      first, last : string;&lt;br /&gt;
   end;&lt;br /&gt;
   &lt;br /&gt;
   procedure InitializeName(var n : name; first, last : string);&lt;br /&gt;
   begin&lt;br /&gt;
      n.first := first;&lt;br /&gt;
      n.last := last&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   procedure Greet(n : name);&lt;br /&gt;
   begin&lt;br /&gt;
      with n do&lt;br /&gt;
         writeln('Hello, ', first, ' ', last, '!')&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
   bobsName : name;&lt;br /&gt;
begin&lt;br /&gt;
   InitializeName(bobsName, 'Bob', 'Smith');&lt;br /&gt;
&lt;br /&gt;
   Greet(bobsName)&lt;br /&gt;
end.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== There's only one problem... ==&lt;br /&gt;
&lt;br /&gt;
In order to initialize a name, I have to have a name variable.  I can't just create a name and use it directly.  For that I'd need a function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;program HelloPascal;&lt;br /&gt;
type&lt;br /&gt;
   name = record&lt;br /&gt;
      first, last : string;&lt;br /&gt;
   end;&lt;br /&gt;
   &lt;br /&gt;
   function NewName(first, last : string) : name;&lt;br /&gt;
   var&lt;br /&gt;
      n : name;&lt;br /&gt;
   begin&lt;br /&gt;
      n.first := first;&lt;br /&gt;
      n.last := last;&lt;br /&gt;
      &lt;br /&gt;
      NewName := n&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   procedure Greet(n : name);&lt;br /&gt;
   begin&lt;br /&gt;
      with n do&lt;br /&gt;
         writeln('Hello, ', first, ' ', last, '!')&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
   bobsName : name;&lt;br /&gt;
begin&lt;br /&gt;
   bobsName := NewName('Bob', 'Smith');&lt;br /&gt;
&lt;br /&gt;
   Greet(bobsName)&lt;br /&gt;
end.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or just:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;program HelloPascal;&lt;br /&gt;
type&lt;br /&gt;
   name = record&lt;br /&gt;
      first, last : string;&lt;br /&gt;
   end;&lt;br /&gt;
   &lt;br /&gt;
   function NewName(first, last : string) : name;&lt;br /&gt;
   var&lt;br /&gt;
      n : name;&lt;br /&gt;
   begin&lt;br /&gt;
      n.first := first;&lt;br /&gt;
      n.last := last;&lt;br /&gt;
      &lt;br /&gt;
      NewName := n&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   procedure Greet(n : name);&lt;br /&gt;
   begin&lt;br /&gt;
      with n do&lt;br /&gt;
         writeln('Hello, ', first, ' ', last, '!')&lt;br /&gt;
   end;&lt;br /&gt;
begin&lt;br /&gt;
   Greet(NewName('Bob', 'Smith'))&lt;br /&gt;
end.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Time for some cleaning up ==&lt;br /&gt;
&lt;br /&gt;
We've got a decent-sized program now, and that's good.  But what if I want to use my name type and it's associated routines elsewhere?&lt;br /&gt;
&lt;br /&gt;
Well, let's create a file named nameunit.pas that will contain a unit, or module of code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;unit NameUnit;&lt;br /&gt;
&lt;br /&gt;
interface&lt;br /&gt;
&lt;br /&gt;
   type&lt;br /&gt;
       name = record&lt;br /&gt;
          first, last : string;&lt;br /&gt;
      end;&lt;br /&gt;
&lt;br /&gt;
   function NewName(first, last : string) : name;&lt;br /&gt;
   procedure Greet(n : name);&lt;br /&gt;
&lt;br /&gt;
implementation&lt;br /&gt;
&lt;br /&gt;
   function NewName(first, last : string) : name;&lt;br /&gt;
   var&lt;br /&gt;
      n : name;&lt;br /&gt;
   begin&lt;br /&gt;
      n.first := first;&lt;br /&gt;
      n.last := last;&lt;br /&gt;
&lt;br /&gt;
      NewName := n&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   procedure Greet(n : name);&lt;br /&gt;
   begin&lt;br /&gt;
      with n do&lt;br /&gt;
         writeln('Hello, ', first, ' ', last, '!')&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
end.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And now we'll rewrite our hellopascal.pas program.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;program HelloPascal;&lt;br /&gt;
uses&lt;br /&gt;
   NameUnit;&lt;br /&gt;
begin&lt;br /&gt;
   Greet(NewName('Bob', 'Smith'))&lt;br /&gt;
end.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Much nicer, eh?&lt;br /&gt;
&lt;br /&gt;
Whereas previous programs had been compiled with &amp;quot;fpc hellopascal&amp;quot;, this new setup shall be compiled with &amp;quot;fpc hellopascal nameunit&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== A Pointless Array ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;program HelloPascal;&lt;br /&gt;
uses&lt;br /&gt;
   NameUnit;&lt;br /&gt;
var&lt;br /&gt;
   names : array [1..10] of Name;&lt;br /&gt;
begin&lt;br /&gt;
   names[1] := NewName('Bob', 'Smith');&lt;br /&gt;
   Greet(names[1])&lt;br /&gt;
end.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slightly less pointless ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;program HelloPascal;&lt;br /&gt;
uses&lt;br /&gt;
   NameUnit;&lt;br /&gt;
var&lt;br /&gt;
   names : array [1..10] of Name;&lt;br /&gt;
   i : Integer;&lt;br /&gt;
begin&lt;br /&gt;
   for i := 1 to 10 do&lt;br /&gt;
      names'' := NewName('Bob', 'Smith');&lt;br /&gt;
&lt;br /&gt;
   for i := 1 to 10 do&lt;br /&gt;
      Greet(names[1])&lt;br /&gt;
end.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or perhaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;program HelloPascal;&lt;br /&gt;
uses&lt;br /&gt;
   NameUnit;&lt;br /&gt;
var&lt;br /&gt;
   names : array [1..10] of Name;&lt;br /&gt;
   i : Integer;&lt;br /&gt;
begin&lt;br /&gt;
   for i := 1 to 10 do&lt;br /&gt;
   begin&lt;br /&gt;
      names''.first := 'Bob';&lt;br /&gt;
      names''.last := 'Smith';&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   for i := 1 to 10 do&lt;br /&gt;
      Greet(names[1])&lt;br /&gt;
end.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or even:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;program HelloPascal;&lt;br /&gt;
uses&lt;br /&gt;
   NameUnit;&lt;br /&gt;
var&lt;br /&gt;
   names : array [1..10] of Name;&lt;br /&gt;
   i : Integer;&lt;br /&gt;
begin&lt;br /&gt;
   for i := 1 to 10 do&lt;br /&gt;
   with names'' do&lt;br /&gt;
   begin&lt;br /&gt;
      first := 'Bob';&lt;br /&gt;
      last := 'Smith';&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   for i := 1 to 10 do&lt;br /&gt;
      Greet(names[1])&lt;br /&gt;
end.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pointers Galore! ==&lt;br /&gt;
&lt;br /&gt;
Arrays are so static.  Let's use a linked list instead.  That means pointers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;program HelloPascal;&lt;br /&gt;
uses&lt;br /&gt;
   NameUnit;&lt;br /&gt;
type&lt;br /&gt;
   PNode = ^TNode;&lt;br /&gt;
&lt;br /&gt;
   TNode = record&lt;br /&gt;
      Data : Name;&lt;br /&gt;
      Next : PNode;&lt;br /&gt;
   end;&lt;br /&gt;
var&lt;br /&gt;
   list : PNode;&lt;br /&gt;
&lt;br /&gt;
   procedure GreetAllInList(list : PNode);&lt;br /&gt;
   var&lt;br /&gt;
      current : PNode;&lt;br /&gt;
   begin&lt;br /&gt;
      current := list;&lt;br /&gt;
&lt;br /&gt;
      while current &amp;lt;&amp;gt; nil do&lt;br /&gt;
      with current^ do&lt;br /&gt;
      begin&lt;br /&gt;
         Greet(data);&lt;br /&gt;
&lt;br /&gt;
         current := next;&lt;br /&gt;
      end;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   procedure NewList(var list : PNode; value : Name);&lt;br /&gt;
   begin&lt;br /&gt;
      New(list);&lt;br /&gt;
&lt;br /&gt;
      with list^ do&lt;br /&gt;
      begin&lt;br /&gt;
         data := value;&lt;br /&gt;
         next := nil;&lt;br /&gt;
      end;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   procedure AppendToList(var list : PNode; value : Name);&lt;br /&gt;
   var&lt;br /&gt;
      current, last : PNode;&lt;br /&gt;
   begin&lt;br /&gt;
      if list = nil then&lt;br /&gt;
         NewList(list, value)&lt;br /&gt;
      else begin&lt;br /&gt;
         current := list;&lt;br /&gt;
&lt;br /&gt;
         while current &amp;lt;&amp;gt; nil do&lt;br /&gt;
         with current^ do&lt;br /&gt;
         begin&lt;br /&gt;
            last := current;&lt;br /&gt;
            current := next;&lt;br /&gt;
         end;&lt;br /&gt;
&lt;br /&gt;
         NewList(last^.next, value);&lt;br /&gt;
      end;&lt;br /&gt;
   end;&lt;br /&gt;
begin&lt;br /&gt;
   AppendToList(list, NewName('Foo', 'Bar'));&lt;br /&gt;
   AppendToList(list, NewName('Bob', 'Smith'));&lt;br /&gt;
&lt;br /&gt;
   GreetAllInList(list);&lt;br /&gt;
end.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aren't objects grand? ==&lt;br /&gt;
&lt;br /&gt;
Wha?!  Pascal has objects?  Well, yes, Pascal has the ability to work with objects.  In the following I'll be using the Free Pascal compiler's OO extension.  As a result, I have to compile with the &amp;quot;-S2&amp;quot; option.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;program Test;&lt;br /&gt;
uses&lt;br /&gt;
   Name, NameList;&lt;br /&gt;
var&lt;br /&gt;
   list : TNameList;&lt;br /&gt;
begin&lt;br /&gt;
   list := TNameList.Create;&lt;br /&gt;
&lt;br /&gt;
   list.Append(TName.Create('Bob', 'Smith'));&lt;br /&gt;
   list.Append(TName.Create('Foo', 'Bar'));&lt;br /&gt;
&lt;br /&gt;
   list.GreetAll;&lt;br /&gt;
end.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And to make that possible, the following two units.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;unit Name;&lt;br /&gt;
&lt;br /&gt;
interface&lt;br /&gt;
&lt;br /&gt;
   type&lt;br /&gt;
      TName = class&lt;br /&gt;
	     First, Last : String;&lt;br /&gt;
      public&lt;br /&gt;
	     constructor Create(f, l : String);&lt;br /&gt;
&lt;br /&gt;
	     function FullName : String;&lt;br /&gt;
	     procedure Greet;&lt;br /&gt;
      end;&lt;br /&gt;
&lt;br /&gt;
implementation&lt;br /&gt;
&lt;br /&gt;
   constructor TName.Create(f, l : String);&lt;br /&gt;
   begin&lt;br /&gt;
      First := f;&lt;br /&gt;
      Last := l;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   function TName.FullName : String;&lt;br /&gt;
   begin&lt;br /&gt;
      FullName := First + ' ' + Last;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   procedure TName.Greet;&lt;br /&gt;
   begin&lt;br /&gt;
      writeln('Hello, ', FullName, '!');&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
end.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;unit NameList;&lt;br /&gt;
&lt;br /&gt;
interface&lt;br /&gt;
&lt;br /&gt;
   uses&lt;br /&gt;
&lt;br /&gt;
      Name;&lt;br /&gt;
&lt;br /&gt;
   type&lt;br /&gt;
      PNode = ^TNode;&lt;br /&gt;
&lt;br /&gt;
      TNode = record&lt;br /&gt;
         Data : TName;&lt;br /&gt;
         Next : PNode;&lt;br /&gt;
      end;&lt;br /&gt;
&lt;br /&gt;
      TNameList = class&lt;br /&gt;
         Head : PNode;&lt;br /&gt;
      public&lt;br /&gt;
         constructor Create;&lt;br /&gt;
&lt;br /&gt;
         procedure Append(NewName : TName);&lt;br /&gt;
         procedure GreetAll;&lt;br /&gt;
      end;&lt;br /&gt;
&lt;br /&gt;
implementation&lt;br /&gt;
&lt;br /&gt;
   constructor TNameList.Create;&lt;br /&gt;
   begin&lt;br /&gt;
      Head := nil;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   procedure TNameList.Append(NewName : TName);&lt;br /&gt;
   var&lt;br /&gt;
      current : PNode;&lt;br /&gt;
   begin&lt;br /&gt;
      if Head = nil then&lt;br /&gt;
         begin&lt;br /&gt;
            New(Head);&lt;br /&gt;
            Head^.Data := NewName;&lt;br /&gt;
            Head^.Next := nil;&lt;br /&gt;
         end&lt;br /&gt;
      else&lt;br /&gt;
         begin&lt;br /&gt;
            current := Head;&lt;br /&gt;
&lt;br /&gt;
            while current^.Next &amp;lt;&amp;gt; nil do&lt;br /&gt;
               current := current^.Next;&lt;br /&gt;
&lt;br /&gt;
            New(current^.Next);&lt;br /&gt;
            with current^.Next^ do&lt;br /&gt;
            begin&lt;br /&gt;
               Data := NewName;&lt;br /&gt;
               Next := nil;&lt;br /&gt;
            end;&lt;br /&gt;
         end;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   procedure TNameList.GreetAll;&lt;br /&gt;
   var&lt;br /&gt;
      current : PNode;&lt;br /&gt;
   begin&lt;br /&gt;
      current := Head;&lt;br /&gt;
&lt;br /&gt;
      while current &amp;lt;&amp;gt; nil do&lt;br /&gt;
      begin&lt;br /&gt;
         current^.Data.Greet;&lt;br /&gt;
         current := current^.Next;&lt;br /&gt;
      end;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
end.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Objects and interfaces ==&lt;br /&gt;
&lt;br /&gt;
So we've seen that it's possible to have objects in Pascal.  But then, some would argue that interfaces are a key concept in object-oriented programming.  Pascal can handle that too.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;program InterfaceTest;&lt;br /&gt;
&lt;br /&gt;
type&lt;br /&gt;
   IHasName = interface&lt;br /&gt;
      function Name : string;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   TName = class(TInterfacedObject, IHasName)&lt;br /&gt;
      constructor Create(f, l : string);&lt;br /&gt;
&lt;br /&gt;
      function First : string;&lt;br /&gt;
      function Last : string;&lt;br /&gt;
      function Name : string;&lt;br /&gt;
   private&lt;br /&gt;
      FFirst, FLast : string;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   TSingleName = class(TInterfacedObject, IHasName)&lt;br /&gt;
      constructor Create(n : string);&lt;br /&gt;
&lt;br /&gt;
      function Name : string;&lt;br /&gt;
   private&lt;br /&gt;
      FName : string;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   { The Greet function }&lt;br /&gt;
&lt;br /&gt;
   procedure Greet(n : IHasName);&lt;br /&gt;
   begin&lt;br /&gt;
      writeln('Hello, ', n.Name, '!');&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   { Implement TName }&lt;br /&gt;
&lt;br /&gt;
   constructor TName.Create(f, l : string);&lt;br /&gt;
   begin&lt;br /&gt;
      FFirst := f;&lt;br /&gt;
      FLast := l;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   function TName.First : string;&lt;br /&gt;
   begin&lt;br /&gt;
      First := FFirst;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   function TName.Last : string;&lt;br /&gt;
   begin&lt;br /&gt;
      Last := FLast;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   function TName.Name : string;&lt;br /&gt;
   begin&lt;br /&gt;
      Name := FFirst + ' ' + FLast;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   { Implement TSingleName }&lt;br /&gt;
&lt;br /&gt;
   constructor TSingleName.Create(n : string);&lt;br /&gt;
   begin&lt;br /&gt;
      FName := n;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   function TSingleName.Name : string;&lt;br /&gt;
   begin&lt;br /&gt;
      Name := FName;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
   Names : array [1..2] of IHasName;&lt;br /&gt;
   Index : integer;&lt;br /&gt;
   &lt;br /&gt;
begin&lt;br /&gt;
   Names[1] := TName.Create('Bob', 'Smith');&lt;br /&gt;
   Names[2] := TSingleName.Create('Foo');&lt;br /&gt;
&lt;br /&gt;
   for Index := 1 to 2 do Greet(Names[Index]);&lt;br /&gt;
end.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Abstract Base Classes ==&lt;br /&gt;
&lt;br /&gt;
Of course, we could accomplish much the same with an abstract class.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;program AbstractClassTest;&lt;br /&gt;
&lt;br /&gt;
type&lt;br /&gt;
   TNameBase = class(TObject)&lt;br /&gt;
      function Name : string; virtual; abstract;&lt;br /&gt;
      procedure Greet;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   TName = class(TNameBase)&lt;br /&gt;
      constructor Create(f, l : string);&lt;br /&gt;
&lt;br /&gt;
      function First : string;&lt;br /&gt;
      function Last : string;&lt;br /&gt;
      function Name : string; override;&lt;br /&gt;
   private&lt;br /&gt;
      FFirst, FLast : string;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   TSingleName = class(TNameBase)&lt;br /&gt;
      constructor Create(n : string);&lt;br /&gt;
&lt;br /&gt;
      function Name : string; override;&lt;br /&gt;
   private&lt;br /&gt;
      FName : string;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   { Implement TNameBase }&lt;br /&gt;
&lt;br /&gt;
   procedure TNameBase.Greet;&lt;br /&gt;
   begin&lt;br /&gt;
      writeln('Hello, ', Name, '!');&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   { Implement TName }&lt;br /&gt;
&lt;br /&gt;
   constructor TName.Create(f, l : string);&lt;br /&gt;
   begin&lt;br /&gt;
      FFirst := f;&lt;br /&gt;
      FLast := l;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   function TName.First : string;&lt;br /&gt;
   begin&lt;br /&gt;
      First := FFirst;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   function TName.Last : string;&lt;br /&gt;
   begin&lt;br /&gt;
      Last := FLast;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   function TName.Name : string;&lt;br /&gt;
   begin&lt;br /&gt;
      Name := FFirst + ' ' + FLast;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   { Implement TSingleName }&lt;br /&gt;
&lt;br /&gt;
   constructor TSingleName.Create(n : string);&lt;br /&gt;
   begin&lt;br /&gt;
      FName := n;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   function TSingleName.Name : string;&lt;br /&gt;
   begin&lt;br /&gt;
      Name := FName;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
   Names : array [1..2] of TNameBase;&lt;br /&gt;
   Index : integer;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
   Names[1] := TName.Create('Bob', 'Smith');&lt;br /&gt;
   Names[2] := TSingleName.Create('Foo');&lt;br /&gt;
&lt;br /&gt;
   for Index := 1 to 2 do Names[Index].Greet;&lt;br /&gt;
&lt;br /&gt;
end.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
Author: [[Wtd]]&lt;/div&gt;</summary>
		<author><name>Wtd</name></author>	</entry>

	</feed>