<2> Clascal のオブジェクト指向拡張 (Pascal へのオブジェクト指向拡張の歴史と Delphi)

# 2. Clascal のオブジェクト指向拡張
**Apple** の **Lisa** には **Lisa Pascal** と呼ばれる製品/言語 [^3] が存在し、これをオブジェクト指向拡張したものが **Clascal** です。アプリケーション開発環境 **Lisa Workshop** 3.0 上で動作する Clascal は 1984 年の 9 月にリリースされました。最初の Clascal の正式なリリース日は不明ですが、少なくとも 1983 年には存在していたようです。

Clascal は Apple が Pascal に対して行った最初のオブジェクト指向拡張です。Clascal は Object Pascal ではありません。

開発は Apple の **Personal Office Systems (POS) Division** (The Lisa Division / The 32-Bit Systems Division) で行われたとの事です。

:::note info
2023 年 1 月 19 日、Apple Lisa の 40 周年記念として、Lisa OS (と Tool Kit) のソースコードが公開されました。Clascal で書かれています。
:::

**See also:**

 - [Clascal (Wikipedia:En)](https://en.wikipedia.org/wiki/Clascal)
 - [Lisa Office System (Wikipedia:En)](https://en.wikipedia.org/wiki/Apple_Lisa#Lisa_OS)
 - [Lisa Toolkit (Wikipedia:En)](https://en.wikipedia.org/wiki/MacApp#Pascal_versions)
 - [Clascal (wiki.freepascal.org)](https://wiki.freepascal.org/Clascal)
 - [An Introduction to Clascal (wiki.freepascal.org にあるコピー)](http://bitsavers.informatik.uni-stuttgart.de/pdf/apple/lisa/toolkit_3.0/Package_2_Examples/02_An_Introduction_To_Clascal_Jul84.pdf)
 - [Revisiting Apple’s ill-fated Lisa computer, 40 years on (ars TECHNICA)](https://arstechnica.com/gadgets/2023/01/revisiting-apples-ill-fated-lisa-computer-40-years-on/)
 - [Pioneering Apple Lisa goes “open source” thanks to Computer History Museum (ars TECHNICA)](https://arstechnica.com/information-technology/2023/01/pioneering-apple-lisa-goes-open-source-thanks-to-computer-history-museum/)
 - [THE ART OF CODE: APPLE LISA (Computer History Musium)](https://info.computerhistory.org/apple-lisa-code)
 - [Lost World of Mac (bellwood-lab.jp)](https://bellwood-lab.jp/)

## 2.1. Clascal のクラス型
Clascal のクラス型は別ユニットで定義する必要があります。プログラム本体で定義する事はできません。

### 2.1.1. クラス型の定義

Clascal のルートクラス [^1] は **TObject** です。よって Clascal のすべてのクラスは TObject の下位クラスとなります。

クラスの定義は **interface** セクションで "クラス型名 = **subclass of** 親クラス" のように行います。

:::note info
ルートクラスは

```pascal
THOGE = SUBCLASS OF NIL
```

のように NIL からの派生として作るようです。
:::


クラスに属するメソッド (関数/手続き) の実装は **implementation** セクションに "**methods of** クラス型名; ～ **end**;" のブロックを作り、グループ化して記述します。

```pascal:Sample.pas
unit Sample;

interface

type
  TCls = subclass of TObject
    ID: Integer;
    function TCls.CREATE(object: TObject; itsHeap: THeap): TCls;
  end;

implementation

methods of TCls;
  function TCls.CREATE(object: TObject; itsHeap: THeap): TCls;
  begin
    if object = NIL then
      object := NewObject(itsHeap, THISCLASS);
    SELF := TCls(object);
    SELF.ID := 0;
  end;
end;

end.
```

Clascal のクラス型にはコンストラクタやデストラクタがなく (CREATE メソッドの実装は必須)、プロパティもありません。

 - 多重継承はできません。
 - **override** 指令の付いたメソッドは、自クラスで上位クラスの同名メソッドを上書きする事を意味します。
 - **abstruct** 指令の付いたメソッドは抽象メソッドです。自クラスでは機能を実装せず、機能は下位クラスで実装する必要があります。但し、下位クラスで実装されなくてもエラーにはなりません。
 - **default** 指令の付いたメソッドは、下位クラスで機能を実装される事を前提とします。**default** 指令の付いたメソッドが上位クラスにある場合、下位クラスで機能を実装せずにメソッドを呼び出してもエラーにならずに、この **default** 指令の付いたメソッドが呼び出されます。
 - 自クラスを表すにはキーワード `SELF` を使います。
 - 親クラスを表すにはキーワード `SUPERSELF` を使います。SUPERSELF は **override** メソッド内でよく使われます。

### 2.1.2. クラス型の作成と破棄

```pascal
var
  Cls: TCls;
begin

  Cls := TCls.CREATE(NIL, mainHeap);
  ...
  Cls.Free;

end;

```

CREATE メソッドを使ってオブジェクトを生成 (インスタンス化) し、Free メソッド (TObject で実装されている) で破棄します。

## 2.2. Apple と Pascal
Apple][ の時代から Apple 社のコンピュータには Pascal がありました [^2]。

この **Pascal Syntax Poster** は[ジェフ・ラスキン](https://ja.wikipedia.org/wiki/%E3%82%B8%E3%82%A7%E3%83%95%E3%83%BB%E3%83%A9%E3%82%B9%E3%82%AD%E3%83%B3)が考案したもので、[スティーブ・ジョブス](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%86%E3%82%A3%E3%83%BC%E3%83%96%E3%83%BB%E3%82%B8%E3%83%A7%E3%83%96%E3%82%BA)がトム・カミフジにデザインを依頼して出来た Apple][ Pascal の構文図です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/f9709f9e-8ae3-694d-5427-b6ec0ecea8da.png)
※ 流石ジョブスというか、ラスキンの努力が (半分くらい) 台無しなポスターに仕上がっています (w

 - [The History of Apple’s Pascal “Syntax” Poster, 1979-80 (vintagecomputer.ca)](http://vintagecomputer.ca/the-history-of-apples-pascal-syntax-poster-1979-80/)
 - [Pascal Syntax Poster (pascal-central.com)](http://pascal-central.com/pascal-syntax.html) <- 高画質版のポスター画像が置いてあります
 - [宝物のApple Pascal Syntax Poster (合同会社ギズモン)](https://gizmon.co.jp/archives/1747)

古い Mac OS や Lisa Office System (Lisa OS) 等はその大部分が Pascal で書かれていましたし、Adobe のフォトショップも初期のバージョンは Pascal で書かれていました。

**See also:**

 - [The Legacy of the Apple Lisa Personal Computer: An Outsider's View (David T. Craig)](http://www.cs.oberlin.edu/~jwalker/lisa-legacy/)
 - [ADOBE PHOTOSHOP SOURCE CODE (Computer History Museum)](https://computerhistory.org/blog/adobe-photoshop-source-code/?key=adobe-photoshop-source-code)
 - [A Brief History of Apple Computer's Work with the Pascal Language (applefritter.com)](https://www.applefritter.com/content/brief-history-apple-computer%E2%80%99s-work-pascal-language)

# 参考文献
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/a5128843-1ac8-a102-5779-de8902346cd6.png)

| タイトル | 著者 | ISBN-10<br>(Amazon) |出版年|
|:--|:--|:-:|:-:|
| オブジェクト指向プログラミング〈下巻〉 | カート・J.シュマッカー (著)<br>大谷 和利 (訳) |  [4890520929](https://www.amazon.co.jp/dp/4890520929/)  | 1990/9/15 |

Clascal は断片的な情報しかなく、エミュレータ等で実行して検証する事もほぼ不可能に近いです。日本語で書かれた Clascal の情報なんていうのはこの書籍くらいにしか存在しないのではないでしょうか？

# 索引
[ [← 1. オブジェクト指向拡張とレコード](https://qiita.com/ht_deko/items/9be573c964f340f6a422) ] [ [↑ 目次へ](https://qiita.com/ht_deko/items/ff2d90c9174290583377) ] [ [→ 3. Macintosh 用 Pascal のオブジェクト指向拡張](https://qiita.com/ht_deko/items/cd245180363e1911afa7) ]

[^1]: 親クラスのない (それ以上上位に遡れない) クラスの事。
[^2]: 概要は「[用語集 (標準 Pascal 範囲内での Delphi 入門)](https://qiita.com/ht_deko/items/56e4910d7e00d9bcc5b2)」を参照。
[^3]: Apple][ および Apple III Pascal のスーパーセット。Lisa Workshop の最初期から Lisa Pascal はオブジェクト指向拡張されているので、"Lisa Pascal (製品) = Clascal (言語)" という認識でいいように思う。