🎾

Education: Racket制御構文の基礎: if式とbegin式

2023/04/18に公開

はじめに

本記事では、Racket 言語における基礎的な制御構文であるifについて説明します。
Racket では、if文if式という特殊な式として評価され、値を返します。

複数の式を取り扱うための式であるbegin式についても説明します。
begin式は、複数の式をまとめて 1つの式として評価し、最後の式の結果を返します。複数の式(=複数の処理)を 1つにまとめられるため、if式と一緒に使われることがあります。

制御構文

if式

if 式は、条件分岐を行なうための制御構文です。<述語>[1]を評価し、結果が真(#t)なら<真の場合の式>を評価し、偽(#f)の場合は<偽の場合の式>を評価します。
if 式は、<述語>の結果により<真の場合の式>か<偽の場合の式>のどちらかを評価し、両方を評価することはできません。与えられた式のすべてを評価しない式を特殊形式[2]とよびます。
また、Racket では<偽の場合の式>を省略することはできません。何らかの式を含める必要があります。

if式の構文は、つぎのとおりです。

(if
  <述語>    ; 真偽を判断する式
    <真の場合の式>  ; 述語の評価結果が真(`#t`)だった場合に評価される式
    <偽の場合の式>  ; 述語の評価結果が偽(`#f`)だった場合に評価される式
)

注意点

  • Racket では、真偽値を返す関数を<述語>と呼ぶ。複数の<述語>があった場合はさいごに評価した結果を返す
  • Racket の if 式では、条件の結果が偽(#f)の場合に必ず何かを返す必要がある点に注意する。もし何も返せない場合は、voidを返すことができる

以下のサンプルコードでは、if 式を使い、x が y よりも大きい場合に「x は y よりも大きい」と出力し、そうでない場合には「x は y よりも小さい」と出力しています。

(define x 5)
(define y 3)

(if (> x y)
  (display "xはyよりも大きい")
  (display "xはyよりも小さい"))

となります。

if式の特殊な使用方法

if式では、次のような特殊な用法も使えます。

(define x 2)
(define y 3)

((if #f * /) x y)

上記の場合、(if #f * /)の結果は、/となります。結果(/ x y)を評価することになり、商である`2/3'が返ります。

begin式

begin式は、複数の式をひとまとめにします。
"begin式"でまとめられた式は、先頭から順に評価され、最後に評価した式の結果が、全体の"begin式"の評価結果となります。

begin式の構文は、つぎのとおりです

(begin
  (<式1>)
  (<式2>)
   .
   .
   .
  (<式n>)
  )

以下のサンプルコードでは、メッセージを表示する式と改行をする式の 2つを 1つの式にまとめています。

(define x 3)
(define y 5)
(if (> x y)
  (begin
    (display "xはyよりも大きい")
    (display "\n")  ;  改行
    )
  (begin
    (display "xはyよりも小さい")
    (display "\n")  ;  改行
    ))

となります。

さいごに

以上で、Racket の if 式と begin ブロックについて説明しました。
if式は条件分岐を行なうための式であり、begin式はコードブロックを作成し、複数の式を 1つの式としてまとめました。
2つともプログラムの基本構造としてよく使うので、これを機会に理解を含めましょう。

それでは、Happy Hacking!

参考資料

Webサイト

脚注
  1. 述語: if 式などで使う、真偽値を返す式。複数の式の場合は、さいごに評価した式の結果となる。 ↩︎

  2. 特殊形式: 特殊形式とは、通常の式とは異なり、Racket の一般的な評価ルールに従わない例外的な式。if、define、and、or などが特殊形式に該当する。 ↩︎

GitHubで編集を提案

Discussion