<4> 動作の概念 (標準 Pascal 範囲内での Delphi 入門)〔裏〕


# 4. 動作の概念


## 4.1. 代入文と式

#### ・論理評価 (拡張 Pascal の場合)

**拡張 Pascal** では、このあいまいな論理評価を避けるために **and_then** と **or_else** という論理演算子を新たに追加しています。これらの演算子は**短絡論理評価**する事が保証されています。

#### ・論理評価 (MPW Pascal の場合)

**MPW Pascal** では、**and** と **or** とは別に **&** と **|** が 使えます。これらは **短絡演算子** と呼ばれます。但し、一つの式の中でこれらを混在させる事はできません。

**See also:**

 - [ISO/IEC 10206:1991 Extended Pascal (ISO)](https://www.iso.org/standard/18237.html)
 - [『Macintosh Programmer’s Workshop Object Pascal 日本語版』を読んでみる (Qiita)](https://qiita.com/ht_deko/items/faefeb7123d04733ec8c)
 - [<3> Macintosh 用 Pascal のオブジェクト指向拡張 (Pascal へのオブジェクト指向拡張の歴史と Delphi) (Qiita)](https://qiita.com/ht_deko/items/cd245180363e1911afa7)

## 4.2. 手続き呼び出し文

## 4.3. 複合文と空文

## 4.4. 繰り返し文

### 4.4.1. while 文

### 4.4.2. repeat 文

### 4.4.3. for to do 文


#### ・制御変数に値を代入
制御変数に値を代入することは許されませんが、**Turbo Pascal** では可能でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/ec2efad5-894e-8c2a-0b18-b14a4c2901b5.png)

**See also:**

 - [Delphi のご先祖を辿る (Qiita)](https://qiita.com/ht_deko/items/b41b0cd45181aec522d4) 
 - [Pascal の勉強に使えそうな Pascal 処理系 (Qiita)](https://qiita.com/ht_deko/items/6376997a6d74e77c89e3)


### (4.4.4.) for in do 文

#### ・for in do (拡張 Pascal の場合)

この構文は**拡張 Pascal** にもありました。

```pascal
program ForInDo(output);
var
  i: Integer;
begin
  for i in [100, 200, 100] do
    Writeln(i);
end.
```

#### ・for in do (Pascal 8000 の場合)

**Pascal 8000** には **forall in do** がありました。

```pascal
forall i in [1, 3, 4, 6] do
  flag[i] := True;
```

**See also:**

 - [ISO/IEC 10206:1991 Extended Pascal (ISO)](https://www.iso.org/standard/18237.html)
 - [#47 Pascal プログラミング 増訂版 - サイエンス社の Information & Computing シリーズから Pascal 関連の書籍を読んでみる (Qiita)](https://qiita.com/ht_deko/items/93899a6fe0c2f46cc945#47-pascal-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E5%A2%97%E8%A8%82%E7%89%88)

#### (4.4.4.1.) 配列式を使った反復処理
#### (4.4.4.2.) 文字列式を使った反復処理
#### (4.4.4.3.) 集合式を使った反復処理
#### (4.4.4.4.) コレクション式を使った反復処理


### (4.4.5.) break と continue

#### ・break と continue の由来

この拡張は **Turbo Pascal 7.0** 以降のようです。**MPW Pascal** にはそれ以前に **leave** と **cycle** が存在しました。

|C|Apple|Borland|
|:---|:---|:---|
|break|leave|Break|
|continue|cycle|Continue|

そもそもの由来は **C 言語**だと思います。

標準 Pascal でこれらに近い事をやりたいのであれば、制御変数ともう一段のループを使うか [goto](https://qiita.com/ht_deko/items/05af01a81f7c3bb5eeb4#47-goto-%E6%96%87) 文を使います。

#### ・類似の機能

**Pascal 8000** には無限ループを構成する **loop～end** 構文と、それから脱出するための **exit** がありました。

```pascal
loop
  i := i + 1;
  if a[i] = 0 then
    exit;
  j := j - 1;
end;
```

この構文は **Modula-2** にもあります。

**See also:**

 - [Delphi のご先祖を辿る (Qiita)](https://qiita.com/ht_deko/items/b41b0cd45181aec522d4) 
 - [Pascal の勉強に使えそうな Pascal 処理系 (Qiita)](https://qiita.com/ht_deko/items/6376997a6d74e77c89e3)
 - [『Macintosh Programmer’s Workshop Object Pascal 日本語版』を読んでみる (Qiita)](https://qiita.com/ht_deko/items/faefeb7123d04733ec8c)
 - [<3> Macintosh 用 Pascal のオブジェクト指向拡張 (Pascal へのオブジェクト指向拡張の歴史と Delphi) (Qiita)](https://qiita.com/ht_deko/items/cd245180363e1911afa7)
 - [#47 Pascal プログラミング 増訂版 - サイエンス社の Information & Computing シリーズから Pascal 関連の書籍を読んでみる (Qiita)](https://qiita.com/ht_deko/items/93899a6fe0c2f46cc945#47-pascal-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E5%A2%97%E8%A8%82%E7%89%88)
 - [割と簡単に ’標準 Modula-2 / Oberon-2' を試してみたい (Qiita)](https://qiita.com/ht_deko/items/8e8be01f749915167a91)

## 4.5. 条件式

### 4.5.1. if 文

### 4.5.2. case 文 
**case** 文のケースセレクタの最後には空のケースセレクタが許されます。

```pascal
  case i of
    1: a := 1; 
    2: a := 2;
    3: a := 3
  end
↓
  case i of 1:a:=1 ; 2:a:=2 ; 3:a:=3 end
```

つまりは **end** の前のセミコロンが許されます。

```pascal
  case i of
    1: a := 1; 
    2: a := 2;
    3: a := 3; (* 空のケースセレクタ *)
  end
↓
  case i of 1:a:=1 ; 2:a:=2 ; 3:a:=3 ; (* 空のケースセレクタ *) end
```

古い規格では、ケースセレクタ間に空のケースセレクタが許されていました。

#### ・case 文の else の由来

**case** 文の拡張ですが、 **Turbo Pascal** には 1.0 から **else** が、その前身である **BLS Pascal** には **others** が、**OS-9 Pascal** や **MPW Pascal** には **otherwise** がありました。

```pascal
// Turbo Pascal / Delphi
case n of
  1: v := 100;
  2: v := 200;
else
  v := 0;
end;

// BLS Pascal
case n of
  1:
    v := 100;
  2: 
    v := 200;
  others:
    v := 0;
end;

// OS-9 Pascal
case n of
  1:
    v := 100;
  2: 
    v := 200;
  otherwise:
    v := 0;
end;

// MPW Pascal
case n of
  1: v := 100;
  2: v := 200;
otherwise
  v := 0;
end;
```

**otherwise** 拡張は標準 Pascal の策定中にも検討されていたようです。

**See also:**

 - [Delphi のご先祖を辿る (Qiita)](https://qiita.com/ht_deko/items/b41b0cd45181aec522d4) 
 - [Pascal の勉強に使えそうな Pascal 処理系 (Qiita)](https://qiita.com/ht_deko/items/6376997a6d74e77c89e3)
 - [『Macintosh Programmer’s Workshop Object Pascal 日本語版』を読んでみる (Qiita)](https://qiita.com/ht_deko/items/faefeb7123d04733ec8c)
 - [<3> Macintosh 用 Pascal のオブジェクト指向拡張 (Pascal へのオブジェクト指向拡張の歴史と Delphi) (Qiita)](https://qiita.com/ht_deko/items/cd245180363e1911afa7)

## 4.6. with 文

## 4.7. goto 文

### (4.7.1.) Pascal と goto

#### ・主語の大きな話をすべきではない

Linus Torvalds 氏が Linux カーネルで **goto** 文が使われている事に対する議論の中で

> Of course, in stupid languages like Pascal, 
> where labels cannot be descriptive, goto's can be bad.

 - [Linux: Using goto In Kernel Code (kerneltrap.org: Internet Archive)](https://web.archive.org/web/20051128093253/http://kerneltrap.org/node/553/2131)

と述べています。意訳すると「**Pascal のようにラベルに識別子が使えないクソ言語で goto 使っちゃダメだろうけどね**」という事なのですが、先述の通り Delphi ではラベルに識別子が使えますし、Turbo Pascal でも使えました。

Linus 氏の発言は 2003 年の事ですが `Pascal` という大きな主語で語ってはいけませんよね。既に Delphi 誕生から 8 年、Turbo Pascal 誕生からなら 20 年経っていますので、氏の Pascal に対する知識はアップデートされていない事が伺い知れます (アップデートする必要もなかったのでしょうけれど)。

少なくともこの話をもって「**Linus 氏が言ってるから Pascal はクソ言語**」と言ってはいけません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21785/5bb49595-0610-55e0-4155-5c43d32632a8.png)

Ed Post 氏の ["Real Programmers Don't Use PASCAL (本物のプログラマはPascalを使わない)"](https://ht-deko.com/delphiforum/?vasthtmlaction=viewtopic&t=1005.0) にしても、デバッガを使わずにバグを修正するような**凄腕の Fortran 使い以外に言われる筋合いはない**話です。他の言語を使ってる人がこれを言ってきたら、まず中身を読んでいません。

["Why Pascal is Not My Favorite Programming Language (何故 Pascal はお気に入りのプログラミング言語ではないのか)"](http://www.lysator.liu.se/c/bwk-on-pascal.html) にしても、**書いてるのは K&R の Brian W. Kernighan 氏**ですので、話半分で聞いた方がいいかもしれません。前提が標準 Pascal なら言ってる事は正しいのですが `Pascal` という大きな主語だと正しくありません。

例えば MPW や MacApp の開発に携わった Dan Allen 氏は次のように述べています。
> MPW Pascal overcomes most of Brian Kernighan's objections to Pascal included in his famous memo "Why Pascal Is Not My Favorite Programming Language."

 - [The Macintosh Programmer's Workshop (Dr.Dobb's)](https://www.drdobbs.com/architecture-and-design/the-macintosh-programmers-workshop/184408063)


**拡張 Pascal** の仕様からの反論もあります。

> The criticisms in Kernighan's paper have become outdated and mostly irrelevant with the implementation of Extended Pascal. The paper would not have been mentioned at all, except that the criticisms contained within the paper are used by many in the field today against current implementations of Pascal.

 - [The Pascal Programming Language - Myth 6: Pascal is Not For Serious Programmers (pascal-central.com)](http://pascal-central.com/ppl/chapter4.html#Myth6)

よって、今時この話を持ち出す人もまず中身を読んでいません。あるいは標準 Pascal と Delphi 等のモダンな Pascal との違いを説明できないでしょう。

この件に限りませんが、"**とあるものを持ち上げるために別のものを貶める**" という手法は悪手だと思います。

## (4.8.) 文の正確な定義

# 索引
[:ramen:](https://qiita.com/ht_deko/items/05af01a81f7c3bb5eeb4) [ [← 3. プログラムヘッダと宣言部〔裏〕](https://qiita.com/ht_deko/items/26e37c293ee14c43238e) ] [ [↑ 目次へ](https://qiita.com/ht_deko/items/46fcdbb11cdc58872160) ] [ [→ 5. 列挙型と部分範囲型〔裏〕](https://qiita.com/ht_deko/items/e581e8f5c0c32d5a58e2)) ]