🎾

Education: Racket言語入門: 複数の条件分岐を扱うcond式の基礎

2023/04/21に公開

はじめに

この記事では、Racket の制御構文の 1つであるcond式について説明します。
cond式は、複数の条件に基づく条件分岐を簡単に書くための構文で、他のプログラミング言語での、if-elif-else構文に相当します。本記事では、cond式の基礎的な使い方について説明します。

技術用語

この記事では、以下の技術用語を扱います。

  • cond式 → Racket 言語の条件分岐において、複数の条件分岐に使用する特殊形式
  • 特殊形式 → Racket の一般的な式と違い、評価の方法が異なる式。cond式は特殊形式の 1つ
  • <述語> → 条件分岐をする式において、条件を示す式。真(#t)、偽(#f)のいずれかを返す
  • else → cond式において、すべての述語に当てはまらなかった場合に評価される特殊記号
  • <else式> → else に当てはまった場合に評価される式

cond式

cond式の概要

cond式は Racket において、複数の条件分岐に使用される特殊形式です。
以下は、cond式の特徴です。

  • condは、複数の<述語>のうち、評価が真となった場合の<式>の評価を返す
  • 複数の<述語>が真となる場合は、先頭の述語の<式>のみ評価する
  • '<述語>に対応する<式>がない場合は、<述語>`の結果を返す
  • 評価が真となる<述語>がなかった場合は、voidを返す
  • elseがある場合は、voidのかわりにelse節<式>の評価を返す

cond式の構文

cond式の構文は、以下のとおりです。

cond式
(cond
  [(<述語1>) (<式1>)]
  [(<述語2>) (<式2>)]
   .
   .
   .
  [(<述語n) (<式n>)]
  [else     (<else式>)]

cond式のサンプルコード

以下のサンプルコードは、condを使って曜日の短縮形から日本語の曜日を取得する方法を示しています。

japanese-week.rkt
#lang racket

(define (japanese-week day)
  (cond
    [(eqv? day "Mon") "月曜日"]
    [(eqv? day "Tue") "火曜日"]
    [(eqv? day "Wed") "水曜日"]
    [(eqv? day "Thu") "木曜日"]
    [(eqv? day "Fri") "金曜日"]
    [(eqv? day "Sat") "土曜日"]
    [(eqv? day "Sun") "日曜日"]
  ))

上記のコードでは、引数dayを"Mon"、"Tue"`といった曜日の短縮形と比較しています。
day が短縮形と一致した場合は、対応する日本語の曜日を返しています。

else

elseの概要

elsecond式の最後にかける特殊記号です。<述語>に当てはまる条件がなかった場合は、elseではじまるelse節<else式>を評価します。

elseのサンプルコード

以下のサンプルコードは、曜日の短縮形から休日と平日を判断しています。

weekend.rkt
#lang racket

(define (weekend day)
  (cond
    [(eqv? day "Sat") "休日"]
    [(eqv? day "Sun") "休日"]
    [else "平日"]
  ))

上記のコードでは、引数`day'を短縮形"Sat","Sun"と比較しています。一致する場合は"休日"を返し、day がそれ以外の場合は、else 節を評価して"平日"を返します。

注意点

  • else はcond式の最後にしか書けない。else節のあとに述語が続くとエラーとなる
  • else 節の<else式>は省略できない。<else式>がない場合は、エラーとなる

さいごに

この記事で紹介した Racket の cond 式を理解し、プログラミングに活用することで、効率的なコーディングができるようになります。ぜひ Racket 言語でのプログラミングに挑戦して、独自のアプリケーションやツールを開発してみてください。Racket 言語は、関数型プログラミングの理解や、より高度なプログラミング言語を学ぶための良い入門言語です。

参考資料

Webリソース

GitHubで編集を提案

Discussion