名 称
bc - 任 意 精 度 の 計 算 言 語
書 式
bc [ -hlwsqv ] [long-options] [ file ... ]
バ ー ジ ョ ン
こ の マ ニ ュ ア ル は GNU bc version 1.06 に つ い て 記 述 し て あ り ま す 。
解 説
bc
は 、 任 意 の 精
度 の 数 値 を 扱
う 事 が で き 、
プ ロ グ ラ ミ ン
グ 言 語 C の 文 法
に よ く 似 た 形
の 入 力 を 対 話
的 に 実 行 す る
言 語 で す 。 コ
マ ン ド ラ イ ン
の オ プ シ ョ ン
の 指 定 に よ り
、 標 準 数 学 ラ
イ ブ ラ リ を 使
用 す る こ と も
で き ま す 。 こ
れ を 指 定 し た
場 合 は 、 ど の
フ ァ イ ル を 処
理 す る よ り も
前 に 数 学 ラ イ
ブ ラ リ が 定 義
さ れ ま す 。 bc
は 動 作 を 開 始
す る と ま ず 最
初 に コ マ ン ド
ラ イ ン で 指 定
し た フ ァ イ ル
を 順 に 処 理 し
ま す 。 す べ て
の フ ァ イ ル を
処 理 し た 後 は
、 bc は 標 準 入
力 か ら の 読 み
込 み を 行 い ま
す 。 す べ て の
コ ー ド は 、 そ
れ が 読 み 込 ま
れ た 時 点 で 実
行 さ れ て い き
ま す 。 (も し 、
フ ァ イ ル 中 に
プ ロ セ ッ サ を
止 め る コ マ ン
ド が 含 ま れ て
い た 場 合 は 、
標 準 入 力 か ら
の 読 み 込 み は
行 わ れ ま せ ん
。 ) 本 バ ー ジ ョ
ン の bc は 、 伝
統 的 な bc の 実
装 お よ び POSIX の ド
ラ フ ト 規 格 よ
り も 拡 張 さ れ
て い ま す 。 コ
マ ン ド ラ イ ン
オ プ シ ョ ン に
よ り 、 こ れ ら
の 拡 張 に 対 し
て 警 告 を 表 示
し た り 拒 絶 し
た り す る こ と
が 可 能 で す 。
本 ド キ ュ メ ン
ト で は 、 こ の
プ ロ セ ッ サ が
受 理 す る 言 語
に つ い て 説 明
し ま す 。 拡 張
機 能 に つ い て
は そ の 旨 明 記
し ま す 。 オ プ
シ ョ ン
-h, --help 使 用 方 法 を
表 示 し 、 終 了
し ま す 。
-i, --interactive 対 話 モ ー
ド を 強 制 し ま
す 。
-l, --mathlib 標 準 数 学 ラ
イ ブ ラ リ を 定
義 し ま す 。
-w, --warn
POSIX bc に 対 す る 拡 張 機 能 が 入 力 さ れ た 場 合 は 警 告 を 出 し ま す 。
-s, --standard
POSIX bc の 言 語 仕 様 に 厳 密 に 従 っ て 処 理 し ま す 。
-q, --quiet
GNU bc 導 入 メ ッ セ ー ジ を 表 示 し ま せ ん 。
-v, --version バ ー
ジ ョ ン 番 号 と
著 作 権 を 表 示
し て 終 了 し ま
す 。 数
bc に お け る 最 も
基 本 的 な 要 素
は ’数 ’ で す 。
数 は 、 整 数 部
と 小 数 部 が あ
り 、 任 意 の 精
度 を と る こ と
が で き ま す 。
す べ て の 数 は
、 内 部 で は 10 進
数 で 表 現 さ れ
て お り 、 計 算
も 10 進 数 で 行 わ
れ ま す 。 (本 バ
ー ジ ョ ン で は
、 除 算 と 乗 算
で 結 果 に 切 捨
て が 起 こ り ま
す 。 ) 数 に は length
と scale と い う 2 つ
の 属 性 が あ り
ま す 。 length は 10 進
で の 有 効 桁 数
で 、 scale は 小 数 点
以 下 の 10 進 で の
有 効 桁 数 で す
。 例 え ば 、
.000001 は 、
lengthが 6 で 、 scale も 6 で
す 。
1935.000 は 、 lengthが 7 で
、 scale が 3 で す 。
変 数 数 は 、 単
純 変 数 と 配 列
の 2 種 類 の 変 数
に 保 存 さ れ ま
す 。 単 純 変 数
と 配 列 変 数 に
は 共 に 名 前 が
付 け ら れ ま す
。 こ の 名 前 は
、 最 初 の 1 文 字
目 が ア ル フ ァ
ベ ッ ト で 、 後
は 、 ア ル フ ァ
ベ ッ ト 、 数 字
お よ び ア ン ダ
ス コ ア を 任 意
の 文 字 数 組 み
合 わ せ て 使 う
こ と が で き ま
す 。 す べ て の
ア ル フ ァ ベ ッ
ト は 小 文 字 で
な け れ ば な り
ま せ ん 。 (ア ル
フ ァ ベ ッ ト と
数 字 を 使 っ た
名 前 の 機 能 は
拡 張 機 能 で す
。 POSIX bc で は 、 変
数 に 英 小 文 字 1
文 字 し か 許 さ
れ ま せ ん 。 ) 配
列 変 数 の 名 前
に は 必 ず ブ ラ
ケ ッ ト ([]) が つ く
の で 、 変 数 の
型 は 文 脈 に お
い て は っ き り
し て い ま す 。
特 殊 な 変 数 と
し て scale, ibase, obase, last の
4 つ の 変 数 が あ
り ま す 。 scale で
計 算 時 の 小 数
点 以 下 の 有 効
桁 数 を 指 定 し
ま す 。 scale の デ
フ ォ ル ト は 0 で
す 。 ibase と obase
で 入 力 お よ び
出 力 の 変 換 基
数 を 指 定 し ま
す 。 デ フ ォ ル
ト で は 、 入 力
、 出 力 の 基 数
は 共 に 10 で す 。
last は 、 最 後 に
bc が 出 力 し た
数 を 保 持 し て
い ま す (こ れ は
拡 張 機 能 で す
)。 こ れ ら に つ
い て は 、 後 で
適 切 な と こ ろ
で 詳 し く 説 明
し ま す 。 こ れ
ら の 変 数 に は
、 式 で 使 わ れ
る 代 入 と 同 様
の 代 入 を 行 う
こ と が 可 能 で
す 。 コ メ ン
ト
bc は 、 /* か ら */ の 間 を コ メ ン ト と し て 扱 い ま す 。 コ メ ン ト は ど こ か ら 始 ま っ て い て も よ く 、 1 文 字 の 空 白 と し て 扱 わ れ ま す 。 (こ れ に よ り 、 コ メ ン ト は そ の 前 後 の 入 力 ア イ テ ム を 切 り 離 し ま す 。 た と え ば 、 変 数 名 の 途 中 に コ メ ン ト を 置 く こ と は で き ま せ ん 。 ) コ メ ン ト の 中 に は い く つ 改 行 が あ っ て も か ま い ま せ ん 。
bc
を ス ク リ プ ト
と し て も 使 え
る よ う に す る
た め 、 1 行 コ メ
ン ト が 拡 張 機
能 と し て 追 加
さ れ ま し た 。 1
行 コ メ ン ト は
# で 始 ま り 、
次 の 改 行 ま で
有 効 で す 。 そ
の 改 行 文 字 自
体 は コ メ ン ト
の 一 部 と は み
な さ れ ず 、 普
通 に 処 理 さ れ
ま す 。 式
’数 ’ は 、 式 お
よ び 文 に よ っ
て 操 作 さ れ ま
す 。 こ の 言 語
は 対 話 的 に な
る よ う に 設 計
さ れ て い る た
め 、 文 お よ び
式 は 可 能 な 限
り 即 座 に 実 行
さ れ ま す 。
"main" プ ロ グ ラ
ム と い っ た も
の は な く 、 そ
の か わ り 、 コ
ー ド は そ れ に
出 く わ し た 時
点 で 実 行 さ れ
ま す 。 (後 で 述
べ る ’関 数 ’は
、 そ れ に 出 く
わ し た 時 点 で
定 義 さ れ ま す
。 ) 式 の 最 も 単
純 な も の は 、
た だ の 定 数 で
す 。 bc は 、 入
力 さ れ た 定 数
を 、 変 数 ibase で
指 定 さ れ る 現
在 の 基 数 を 元
に 、 内 部 的 に
は 10 進 表 現 の 数
に 変 換 し ま す
。 (関 数 の 場 合
に は 例 外 が あ
り ま す 。 ) ibase に
は 、 2 か ら 16 ま で
が 使 用 で き ま
す 。 こ の 範 囲
を 越 え る 値 を
ibase に 代 入 し よ
う と す る と 、 2
あ る い は 16 を 指
定 し た こ と に
な り ま す 。 数
の 入 力 に は 、 0-9
お よ び A-F の 文 字
が 利 用 で き ま
す 。 (注 意 : こ れ
は 大 文 字 で な
け れ ば な り ま
せ ん 。 小 文 字
は 変 数 名 で す
。 ) 1 桁 の 数 は
ibase の 値 に 関 係
な く そ の 値 を
持 ち ま す (す な
わ ち A=10)。 複 数 桁
の 数 の 場 合 、
bc は ibase 以 上 の 値
を も つ す べ て
の 入 力 桁 を
ibase-1に 変 更 し ま
す 。 こ れ に よ
り 、 数 FFF は 常
に 、 そ の 入 力
基 数 を 使 っ て 3
桁 で 表 現 可 能
な 最 大 の 値 を
表 し ま す 。 す
べ て の 演 算 式
が 、 他 の 多 く
の 高 級 言 語 に
似 た も の と な
っ て い ま す 。
数 の 型 は 1 種 類
し か な い た め
、 型 変 換 の 規
則 は あ り ま せ
ん 。 そ の か わ
り 、 式 の 有 効
桁 数 に 関 す る
規 則 が あ り ま
す 。 す べ て の
式 に 有 効 桁 数
が あ り 、 こ れ
は そ の 被 演 算
数 の 有 効 桁 数
と 施 さ れ る 演
算 、 そ れ に 多
く の 場 合 、 変
数 scale か ら 決 定
さ れ ま す 。 scale
に は 、 0 か ら C の
整 数 で 表 現 で
き る 最 大 の 値
ま で が 指 定 可
能 で す 。 以 下
、 bc で 使 用 可 能
な 演 算 子 を 説
明 し ま す 。 な
お 、 完 全 形 の
式 を "expr"、 単 純
変 数 ま た は 配
列 変 数 を "var" と
表 記 し ま す 。
単 純 変 数 は 単
に
name と 表
し 、 配 列 変 数
は
name[expr] と 表 し ま
す 。 特 に 言 及
し な い 限 り 、
結 果 の 有 効 桁
数 は 、 注 目 し
て い る 式 の 最
大 有 効 桁 数 に
な り ま す 。
- expr 結 果 は そ の 式 の 符 号 を 反 転 し た も の と な り ま す 。 |
||
++ var 変 数 を |
1 だ け イ ン ク リ メ ン ト し 、 そ の 新 し い 値 が 式 の 結 果 と な り ま す 。
-- var 変 数 を |
1 だ け デ ク リ メ ン ト し 、 そ の 新 し い 値 が 式 の 結 果 と な り ま す 。
は そ の 変 数 の 値 と な り 、 そ れ か ら そ の 変 数 を 1 だ け イ ン ク リ メ ン ト し ま す 。 式 の 結 果 は そ の 変 数 の 値 と な り 、 そ れ か ら そ の 変 数 を 1 だ け デ ク リ メ ン ト し ま す 。 expr + expr 式 の
結 果 は 2 つ の 式
の 和 と な り ま
す 。 "var" が 一 度 し か 評 価 さ れ な い こ と 以 外 は "var = var <op> expr" と 同 じ で す 。 "var" が 配 列 の 場 合 は 動 作 が 違 う こ と が あ り 得 ま す 。 関 係 演 算 は 特 殊 な 演 算 で 、 結 果 は 常 に 0 か 1 に な り ま す 。 関 係 が 偽 の 時 0、 真 の 時 1 に な り ま す 。 関 係 演 算 は 、 演 算 式 の ど こ で も 使 う 事 が で き ま す 。 (POSIX bcで は 、 関 係 演 算 は 、 if, while, for 文 の 中 だ け で 、 し か も 1 つ の 関 係 式 し か 使 用 で き ま せ ん 。 ) 関 係 演 算 子 は 以 下 の 通 り 。 expr1 < expr2 expr1 が expr2 よ り 小 さ い 場 合 1 に な り ま す 。 expr1 <= expr2 expr1 が expr2 よ り 小 さ い か 等 し い 場 合 1 に な り ま す 。 expr1 > expr2 expr1 が expr2 よ り 大 き い 場 合 1 に な り ま す 。 expr1 >= expr2 expr1 が expr2 よ り 大 き い か 等 し い 場 合 1 に な り ま す 。 expr1 == expr2 expr1 と expr2 が 等 し い 場 合 1 に な り ま す 。 expr1 != expr2 expr1 と expr2 が 等 し く な い 場 合 1 に な り ま す 。 論 理 演 算 も 使 え ま す 。 (POSIX bc に は 論 理 演 算 は あ り ま せ ん 。 ) 論 理 演 算 も 関 係 演 算 と 同 様 、 結 果 は 0 か 1 (各 々 偽 お よ び 真 ) に な り ま す 。 論 理 演 算 子 は 以 下 の 通 り 。
expr && expr expr1 と expr2 が 両 方 と も 0 で な い な ら 、 1 に な り ま す 。 expr || expr expr1 と expr2 の
ど ち ら か 一 方
が 0 で な い な ら
、 1 に な り ま す
。 各 演 算 子 の
優 先 順 位 と 結
合 規 則 は 次 の
通 り で す 。 (最
初 の も の ほ ど
低 く 、 後 に い
く ほ ど 高 い 優
先 順 位 で 先 に
実 行 さ れ ま す
。 ) C プ ロ グ ラ マ の ほ と ん ど は 、 ’’3 < 5’’ の 関 係 演 算 が 実 行 さ れ た 結 果 (つ ま り 1) が 変 数 ’’a’’ に 代 入 さ れ る 、 と 考 え る で し ょ う 。 と こ ろ が bc で は 、 ま ず 3 が 変 数 ’’a’’ に 代 入 さ れ 、 そ れ か ら 3 と 5 の 比 較 が 行 わ れ る の で す 。 こ の 間 違 い を 避 け る た め に 、 関 係 演 算 や 論 理 演 算 を 代 入 演 算 と 共 に 用 い る 場 合 は 、 括 弧 を 使 う の が 最 良 で す 。 bc
に は 特 別 な 式
が さ ら に い く
つ か 備 わ っ て
い ま す 。 そ れ
は ユ ー ザ 定 義
関 数 と 標 準 関
数 に 関 す る も
の で 、 す べ て
"name(parameters)"
と い う 形 を し
て い ま す 。 ユ
ー ザ 定 義 関 数
に つ い て は 関
数 の 章 を 参 照
し て 下 さ い 。
標 準 関 数 は 以
下 の 通 り で す : expression の 有 効 桁 数 を 返 し ま す 。 read ( ) (拡 張 機 能 ) 関 数 の 出 現 位 置 に 関 係 な く 、 標 準 入 力 か ら 数 を 読 み 取 り ま す 。 デ ー タ と プ ロ グ ラ ム の 両 方 を 標 準 入 力 か ら 与 え る よ う な 場 合 に は 、 問 題 を 生 じ う る こ と に 注 意 し て 下 さ い 。 最 良 の 方 法 は 、 ユ ー ザ か ら デ ー タ の 入 力 の 必 要 が あ る な ら 、 プ ロ グ ラ ム は あ ら か じ め 作 っ て お き 、 標 準 入 力 か ら プ ロ グ ラ ム を 入 力 し な い よ う に す る こ と で す 。 read 関 数 の 値 は 標 準 入 力 か ら 読 み 込 ん だ 数 で す 。 そ の 際 、 変 換 基 数 と し て 変 数 ibase の 現 在 の 値 が 用 い ら れ ま す 。 scale ( expression ) expression の 小 数 点 以 下 の 有 効 桁 数 を 返 し ま す 。 sqrt ( expression ) expression の 平 方 根 を 返 し ま す 。 expression に 負 の 値 を 指 定 し た 場 合 は 、 ラ ン タ イ ム エ ラ ー に な り ま す 。 文 文 は (ほ と ん ど の 算 術 言 語 が そ う で あ る よ う に )、 処 理 を 順 番 に 実 行 し て い く 単 位 で す 。 bc で は 文 は 「 で き る だ け 早 い 段 階 で 」 実 行 さ れ ま す 。 改 行 が 入 力 さ れ た 時 点 で 、 実 行 可 能 な 文 が 存 在 し て い れ ば 、 即 座 に 実 行 し ま す 。 こ の た め bc で は 改 行 が 重 要 な 役 割 を 持 っ て い ま す 。 実 際 、 セ ミ コ ロ ン と 改 行 が 文 の 区 切 り と し て 使 用 さ れ ま す 。 不 適 当 な 場 所 で 改 行 を 入 力 す る と 、 文 法 エ ラ ー に な り ま す 。 改 行 は 文 の 区 切 り で す が 、 バ ッ ク ス ラ ッ シ ュ を 用 い て 改 行 を 隠 す こ と が で き ま す 。 bc に と っ て 、 "\<nl>" (<nl>は 改 行 ) は 改 行 で は な く 空 白 に 見 え ま す 。 文 の リ ス ト は 、 セ ミ コ ロ ン と 改 行 で 区 切 ら れ た 文 の 並 び で す 。 以 下 、 bc の 文 の 種 類 と そ の 動 作 に つ い て 説 明 し ま す 。 (な お 、 以 下 の 説 明 で ([]) で 括 っ た 部 分 は 省 略 可 能 な 項 で す 。 )
<assignment> ..." で 始 ま っ て い れ ば 、 そ れ は 代 入 文 と し て 扱 わ れ ま す 。 そ う で な け れ ば 、 演 算 式 は 評 価 さ れ て 出 力 に 表 示 さ れ ま す 。 結 果 が 表 示 さ れ た 後 、 改 行 が 表 示 さ れ ま す 。 例 え ば 、 "a=1" は 代 入 文 で あ り 、 "(a=1)" は 代 入 文 が 埋 め 込 ま れ た 演 算 式 で す 。 表 示 さ れ る 数 値 は す べ て 、 変 数 obase で 決 ま る 基 数 で 表 示 さ れ ま す 。 obase に 指 定 で き る 値 は 2 か ら BC_BASE_MAX ま で で す 。 (「 制 限 」 の 章 を 参 照 。 ) 基 数 2 か ら 16 ま で で は 、 通 常 の 数 表 記 法 が 用 い ら れ ま す 。 基 数 が 16 よ り 大 き い 場 合 、 bc は 、 各 桁 を 10 進 表 記 す る 複 数 桁 文 字 表 記 法 で 表 示 し ま す 。 複 数 桁 文 字 表 記 法 で は 、 各 桁 は 空 白 で 区 切 ら れ ま す 。 各 桁 は "obase-1" を 10 進 で 表 記 す る の に 必 要 な 桁 数 の 数 字 か ら 成 り ま す 。 数 の 精 度 は 任 意 に 選 べ る た め 、 数 に よ っ て は 1 行 に 表 示 で き な い 場 合 も あ り ま す 。 そ の よ う な 長 い 数 は 、 行 末 に "\" を 付 け て 次 行 に 継 続 し ま す 。 1 行 に 表 示 で き る 文 字 数 は 70 で す 。 bc の 対 話 的 性 質 に よ り 、 あ る 数 を 表 示 す る と 、 表 示 し た 値 が 特 殊 変 数 last に 代 入 さ れ る と い う 副 作 用 が 生 じ ま す 。 ユ ー ザ は タ イ プ し 直 す こ と な く 最 後 に 表 示 さ れ た 値 を 再 利 用 で き ま す 。 last に 値 を 代 入 す る こ と も 可 能 で 、 そ の 場 合 、 前 回 表 示 さ れ た 値 が 代 入 値 で 上 書 き さ れ ま す 。 新 し く 代 入 し た 値 は 、 次 に 数 が 表 示 さ れ る か 別 の 値 が last に 代 入 さ れ る ま で 有 効 で す 。 (bc の 実 装 に よ っ て は 、 数 の 一 部 に な っ て い な い 単 一 の ピ リ オ ド (.) を last の 短 縮 表 記 と し て 用 い る こ と が で き ま す 。 )
り 、 次 の 二 重 引 用 符 ま で の す べ て の 文 字 を 含 み ま す 。 改 行 を 含 め 、 す べ て の 文 字 は 文 字 通 り に 解 釈 さ れ ま す 。 文 字 列 の 後 に 改 行 は 出 力 さ れ ま せ ん 。 print list print 文 (こ れ は 拡 張 機 能 で す ) は 、 も う ひ と つ の 出 力 方 法 で す 。 "list" は コ ン マ で 区 切 っ た 文 字 列 お よ び 演 算 式 の リ ス ト で あ り 、 各 文 字 列 あ る い は 演 算 式 が リ ス ト の 順 に 表 示 さ れ ま す 。 最 後 に 改 行 は 出 力 さ れ ま せ ん 。 演 算 式 は 評 価 さ れ 、 そ の 値 が 表 示 さ れ る と と も に 、 変 数 last に 代 入 さ れ ま す 。 print 文 中 の 文 字 列 は 出 力 に 表 示 さ れ ま す が 、 特 殊 文 字 を 含 め る こ と が で き ま す 。 特 殊 文 字 は バ ッ ク ス ラ ッ シ ュ (\) で 始 ま り ま す 。 bc で 使 え る 特 殊 文 字 は 、 "a" (ベ ル )、 "b" (バ ッ ク ス ペ ー ス )、 "f" (フ ォ ー ム フ ィ ー ド )、 "n" (改 行 )、 "r" (復 帰 )、 "q" (二 重 引 用 符 )、 "t" (タ ブ )、 "\" (バ ッ ク ス ラ ッ シ ュ ) で す 。 こ れ 以 外 は 無 視 さ れ ま す 。 { statement_list } 複
文 で す 。 複 数
の 文 を 1 つ の グ
ル ー プ に ま と
め て 実 行 し ま
す 。 if 文 は 演 算 式 expression を 評 価 し 、 そ の 値 に 応 じ て 文 statement1 ま た は 文 statement2 を 実 行 し ま す 。 expression の 値 が 0 で な け れ ば statement1 が 実 行 さ れ ま す 。 statement2 が 存 在 し 、 expression の 値 が 0 な ら ば 、 statement2 が 実 行 さ れ ま す 。 (else 節 は 拡 張 機 能 で す 。 ) while ( expression ) statement while 文 は expression が 0 で な い 間 、 繰 り 返 し statement を 実 行 し ま す 。 statement の 実 行 前 に 毎 回 expression を 評 価 し ま す 。 expression の 値 が 0 に な る か 、 break 文 を 実 行 す る と 、 ル ー プ が 終 了 し ま す 。 for ( [expression1] ; [expression2] ; [expression3] ) statement for 文 は statement
の 繰 り 返 し 実
行 を 制 御 し ま
す 。 expression1 は ル ー
プ 実 行 の 前 に
評 価 さ れ ま す
。 expression2 は statement の 実
行 前 に 毎 回 評
価 さ れ 、 そ の
値 が 0 で な け れ
ば statement が 実 行 さ
れ ま す 。 expression2 の
値 が 0 に な る と
、 ル ー プ は 終
了 し ま す 。 各
statement 実 行 の 後 、
再 び expression2 が 評 価
さ れ る 前 に expression3
が 評 価 さ れ ま
す 。 expression1 あ る い
は expression3 が 省 略 さ
れ て い る と 、
そ こ で は 何 も
評 価 さ れ ま せ
ん 。 expression2 が 省 略
さ れ て い る 場
合 、 expression2 が 1 で あ
る の と 同 様 に
扱 わ れ ま す 。
(各 expression が 省 略 可
能 な の は 拡 張
機 能 で す 。 POSIX bc
で は 、 3 つ の expression
は ど れ も 省 略
で き ま せ ん 。 )
以 下 は for 文 と 等
価 な コ ー ド で
す :
に 中 断 し ま す 。 continue そ れ を 含 む 最 も 内 側 の for 文 に お け る 次 の 繰 り 返 し に 進 み ま す 。 (continue 文 は 拡 張 機 能 で す )
(0 == 1) halt" の 場 合 は bc は 終 了 し ま せ ん 。 halt 文 が 実 行 さ れ な い か ら で す 。
return ( expression ) 関 数 か ら 戻 り ま す 。 関 数 の 結 果 は expression に な り ま す 。 (関 数 の 章 を 参 照 ) 拡 張 機 能 で す が 、 括 弧 は 必 須 で は あ り ま せ ん 。 疑 似 文 こ れ ら は 今 ま で の 文 と は 動 作 が 異 な り ま す 。 疑 似 文 は 実 行 文 で は な く 、 「 コ ン パ イ ル 」 時 点 で 処 理 さ れ ま す 。
warranty 保 証 に 関 す る 注 意 を 長 め に 表 示 し ま す 。 (warranty は 拡 張 機 能 で す ) 関 数 関 数 は 、 後 で 実 行 さ れ る べ き 計 算 手 順 を 定 義 す る 機 能 で す 。 bc の 関 数 は 常 に 値 を 計 算 し 、 そ れ を 呼 び だ し 側 に 返 し ま す 。 関 数 定 義 は 、 そ れ が 入 力 か ら 読 み 込 ま れ た 時 点 で 定 義 が 行 わ れ る と い う 点 で 「 ダ イ ナ ミ ッ ク (動 的 )」 で す 。 一 度 定 義 さ れ た 関 数 は 、 同 じ 名 前 で 別 の 関 数 が 定 義 さ れ る ま で 使 用 可 能 で 、 新 し い 関 数 が 定 義 さ れ た 場 合 は 、 前 の 関 数 が 置 き 換 え ら れ ま す 。 関 数 の 定 義 は 、 以 下 の よ う に 行 い ま す : define name
( parameters ) { newline auto_list は 省 略 可 能 で 、 ロ ー カ ル 変 数 と し て 使 用 す る 変 数 の リ ス ト で す 。 auto_list が 存 在 す る な ら 、 そ の 文 法 は "auto name, ... ;" と な り ま す 。 (セ ミ コ ロ ン は 省 略 可 能 で す 。 ) 各 name が ロ ー カ ル 変 数 の 名 前 と な り ま す 。 配 列 は パ ラ メ ー タ と 同 様 の 表 記 で 指 定 で き ま す 。 こ れ ら の 変 数 は 、 関 数 の 最 初 で そ の 値 が ス タ ッ ク に プ ッ シ ュ さ れ た の ち 値 0 に 初 期 化 さ れ 、 関 数 の 実 行 中 に 使 用 さ れ ま す 。 こ れ ら の 変 数 は 関 数 出 口 に て ポ ッ プ さ れ 、 (関 数 呼 び 出 し 時 の )元 の 値 が 復 元 さ れ ま す 。 パ ラ メ ー タ は 実 際 に は ロ ー カ ル 変 数 で あ り 、 関 数 呼 び 出 し で 与 え ら れ た 値 に 初 期 化 さ れ ま す 。 bc の ロ ー カ ル 変 数 は 伝 統 的 な 意 味 で の ロ ー カ ル 変 数 と 異 な り 、 関 数 A が 関 数 B を 呼 び 出 し て い る よ う な 場 合 、 関 数 B の 中 に 関 数 A の ロ ー カ ル 変 数 と 同 じ 名 前 の ロ ー カ ル 変 数 が な い 限 り 、 関 数 A の ロ ー カ ル 変 数 名 を そ の ま ま 使 っ て 、 関 数 B か ら 関 数 A の ロ ー カ ル 変 数 を ア ク セ ス で き ま す 。 ロ ー カ ル 変 数 と パ ラ メ ー タ は ス タ ッ ク に プ ッ シ ュ さ れ る た め 、 bc は 再 帰 的 な 関 数 呼 び 出 し を サ ポ ー ト し て い ま す 。 関 数 本 体 は bc の 文 の リ ス ト で す 。 繰 り 返 し 述 べ ま す と 、 文 は セ ミ コ ロ ン か 改 行 で 区 切 ら れ て い ま す 。 return 文 に よ り 関 数 は 終 了 し 、 値 を 返 し ま す 。 return 文 に は 2 つ の 形 式 が あ り 、 ひ と つ め の 形 式 "return" は 、 呼 び 出 し 元 に 値 0 を 返 し ま す 。 も う ひ と つ の 形 式 "return ( expression )" は 、 expression の 値 を 計 算 し 、 そ れ を 呼 び 出 し 元 に 返 し ま す 。 各 関 数 の 最 後 に は "return (0)" が あ る も の と 解 釈 さ れ ま す 。 こ れ に よ り 、 明 示 的 に return 文 を 置 か な く て も 、 関 数 は 終 了 し て 値 0 を 返 し ま す 。 関 数 の 中 で は 、 変 数 ibase の 動 作 が 変 わ り ま す 。 関 数 の 中 で 使 わ れ て い る 定 数 は 、 関 数 の 呼 び だ し 時 点 の ibase を 元 に 変 換 が 行 わ れ ま す 。 こ の た め 、 関 数 内 部 で ibase を 変 更 し て も 無 視 さ れ ま す 。 た だ し 、 標 準 関 数 read を 呼 び 出 し た 場 合 は 例 外 で 、 こ れ は 常 に 現 在 の ibase の 値 を も と に 変 換 が 行 わ れ ま す 。 拡 張 機 能 で す が 、 定 義 の 書 式 が 若 干 緩 や か に な り ま し た 。 標 準 で は 、 開 く ブ レ ー ス が define キ ー ワ ー ド と 同 じ 行 に あ る こ と と 、 他 の 部 分 が 引 き 続 く 行 に あ る こ と が 必 須 で す 。 本 バ ー ジ ョ ン の bc で は 、 関 数 の 開 く ブ レ ー ス の 前 後 の 改 行 数 は 任 意 で す 。 例 え ば 、 次 の 定 義 は 合 法 で す 。 define d (n) { return (2*n); } define d (n) { return (2*n); }数 学 ラ イ ブ ラ リ bc に -l オ プ シ ョ ン を 付 け て 起 動 し た 場 合 は 、 数 学 ラ イ ブ ラ リ が 読 み 込 ま れ 、 デ フ ォ ル ト の scale が 20 に 設 定 さ れ ま す 。 数 学 関 数 は 、 そ れ を 呼 び 出 し た 時 点 の scale の 値 に 従 っ て 計 算 を 行 い ま す 。 数 学 ラ イ ブ ラ リ に よ っ て 使 用 可 能 に な る 関 数 は 、 次 の 通 り で す :
j (n,x) 整 数 n 次 の ベ ッ セ ル 関 数 使 用 例 次 の 例 は 、 /bin/sh で シ ェ ル 変 数 pi に ’’パ イ ’’ の 値 を 代 入 し ま す 。 pi=$(echo "scale=10; 4*a(1)" | bc -l) 次 の 例 は 、 数 学 ラ イ ブ ラ リ で 使 わ れ て い る ’’e (x)’’ の 定 義 で す 。 こ の 関 数 は POSIX bc で 記 述 さ れ て い ま す 。 scale = 20 /* Uses the fact that e^x = (e^(x/2))^2 When x is small enough, we use the series: e^x = 1 + x + x^2/2! + x^3/3! + ... */ define e(x) { auto a, d, e, f, i, m, v, z /* Check the sign of x. */ if (x<0) { m = 1 x = -x} /* Precondition x. */ z = scale; scale = 4 + z + .44*x; while (x > 1) { f += 1; x /= 2;} /* Initialize the variables. */ v = 1+x a = x d = 1 for (i=2; 1; i++) { e = (a *= x) / (d *= i) if (e == 0) { if (f>0) while (f--) v = v*v; scale = z if (m) return (1/v); return (v/1);} v += e}}次 の 例 は 、 bc の 拡 張 機 能 を 使 っ て 、 ’’checkbook balances’’ (小 切 手 帳 残 高 ) を 計 算 す る 簡 単 な プ ロ グ ラ ム で す 。 こ の プ ロ グ ラ ム を フ ァ イ ル に し て お く と 、 毎 回 タ イ プ し な お さ ず に 何 度 も 使 う こ と が で き ま す 。 scale=2 print "\nCheck book program!\n" print " Remember, deposits are negative transactions.\n" print " Exit by a 0 transaction.\n\n" print "Initial balance? "; bal = read() bal /= 1 print "\n" while (1) { "current balance = "; bal "transaction? "; trans = read() if (trans == 0) break; bal -= trans bal /= 1} quit次 の 例 は 、 再 帰 呼 び 出 し に よ り 階 乗 を 計 算 す る 関 数 で す 。define f (x) { if (x <= 1) return (1); return (f(x-1) * x);} readline
と libedit の オ プ シ
ョ ン
変 数 の 処 理 に 関 し て POSIX 標 準 に 準 拠 し て い ま せ ん 。
の 文 字 を 使 い ま す 。 こ の バ ー ジ ョ ン で は 、 先 頭 が 文 字 で 始 ま り 、 文 字 と 数 字 と ア ン ダ ー ス コ ア で 構 成 さ れ る 2 文 字 以 上 の 名 前 が 使 え る よ う に 拡 張 さ れ て い ま す 。
は あ ら ゆ る 文 字 を 含 め る こ と が で き な け れ ば な ら な い 、 と し て い ま す 。
if 文 , else 節 POSIX bc に は else 節 は あ り ま せ ん 。
&&, ||, ! POSIX bc に は 論 理 演 算 子 は あ り ま せ ん 。 read 関 数 POSIX bc に は read 関 数 は あ り ま せ ん 。 print 文 POSIX bc に は print 文 は あ り ま せ ん 。 continue 文 POSIX bc に は continue 文 は あ り ま せ ん 。 return 文 POSIX bc で
は 、 return 文 の 周 り
に 括 弧 が 必 要
で す 。 配 列 パ
ラ メ ー タ function format POSIX bc で は 、 開 く ブ レ ー ス が define キ ー ワ ー ド と 同 じ 行 に あ り 、 auto 文 が 次 の 行 に あ る こ と が 必 要 で す 。 =+, =-, =*, =/, =%, =^ POSIX bc で
は こ れ ら の 「
旧 式 」 の 代 入
演 算 子 を 定 義
す る 必 要 は あ
り ま せ ん 。 こ
の バ ー ジ ョ ン
で は こ れ ら の
「 旧 式 」 代 入
演 算 子 が 使 え
る か も 知 れ ま
せ ん 。 limits 文 を 使
っ て 、 イ ン ス
ト ー ル し た バ
ー ジ ョ ン が こ
れ ら を サ ポ ー
ト し て い る か
ど う か 、 確 か
め て み て 下 さ
い 。 も し そ の
バ ー ジ ョ ン が
「 旧 式 」 代 入
演 算 子 を サ ポ
ー ト し て い れ
ば 、 文 "a =- 1" は
a に 値 -1 を 代 入
す る 代 わ り に
a を 1 減 じ ま す
。 数 字 表 記 中
の 空 白 他 の bc
実 装 で は 、 数
字 表 記 の 中 に
空 白 を 含 め る
こ と が 許 さ れ
ま す 。 例 え ば
、 "x=1 3" は 変 数 x
に 値 13 を 代 入 し
ま す 。 こ の バ
ー ジ ョ ン の bc
で は 、 先 の 文
は 文 法 エ ラ ー
に な り ま す 。
エ ラ ー と 実 行
こ の バ ー ジ ョ
ン の bc は 、 プ ロ
グ ラ ム に 文 法
上 の エ ラ ー や
他 の エ ラ ー が
見 つ か っ た 場
合 に ど う い う
コ ー ド が 実 行
さ れ る か 、 と
い う 点 で 、 他
の 実 装 と 異 な
っ て い ま す 。
あ る 関 数 定 義
中 で 文 法 エ ラ
ー が 見 つ か る
と 、 エ ラ ー 回
復 機 構 は 文 の
先 頭 を 見 つ け
て 関 数 の パ ー
ズ を 続 け よ う
と 努 力 し ま す
。 ひ と た び 関
数 の 中 で 文 法
エ ラ ー が 見 つ
か る と 、 そ の
関 数 は 呼 び 出
せ な く な り 、
未 定 義 状 態 と
な り ま す 。 対
話 的 実 行 コ ー
ド で 文 法 エ ラ
ー が あ る と 、
現 在 の 実 行 ブ
ロ ッ ク が 無 効
に な り ま す 。
実 行 ブ ロ ッ ク
と は 、 ひ と 続
き の 完 全 な 文
の あ と の 行 末
ま で の こ と で
す 。 例 え ば 、
次 の コ ー ド BC_BASE_MAX 現 在
の と こ ろ 、 出
力 の 基 数 の 最
大 値 は 999 に 設 定
さ れ て い ま す
。 入 力 側 の 基
数 の 最 大 値 は 16
で す 。
|