2021/09/01

TypeScript入門 第4回 コマンドライン引数

ここまで作成したソースコードを使えば計算はできるのですが, 式を変更する毎にソースコードの編集, コンパイル, 実行と手順が多いので使い易くありません. そこで, コマンドライン引数から数式を与えられるようにします. 

1)コマンドライン引数

process.argvを使えば, コマンドラインから引数を取得できます. index.tsに次のようなコードを記述して試してみます.

for (let arg of process.argv) {
    console.log('コマンドライン引数:'arg)
}

実行してみます.

PS C:\TSWork\RPN> .\node_modules\.bin\tsc
PS C:\TSWork\RPN> node .\dist\index.js 1 2 + 4 *
コマンドライン引数: C:\Program Files\nodejs\node.exe
コマンドライン引数: C:\TSWork\RPN\dist\index.js
コマンドライン引数: 1
コマンドライン引数: 2
コマンドライン引数: +
コマンドライン引数: 4
コマンドライン引数: *
PS C:\TSWork\RPN>

2)コマンドライン引数から式を取り出す

実行結果から, process.argvの3つ目以降の要素を配列として取り出せば, コマンドラインから数式を与えられます. つまり, process.argvの0番目と1番目の要素がジャマ, ということです. このような場合, sliceを使って配列をコピーします. index.tsファイルを次のように変更します.

let input = process.argv.slice(2process.argv.length)
for (let arg of input) {
    console.log('コマンドライン引数:'arg)
}

実行してみます.

PS C:\TSWork\RPN> node .\dist\index.js 1 2 + 4 *
コマンドライン引数: 1
コマンドライン引数: 2
コマンドライン引数: +
コマンドライン引数: 4
コマンドライン引数: *
PS C:\TSWork\RPN>

この結果から, inputをそのままcalc関数に渡せば計算してくれます. 最終的なindex.tsファイルの内容は次のようになります.

// 補助関数
function calcAux(stacknumber[], op: (anumberbnumber=> number) {
    let b = stack.pop()
    let a = stack.pop()
    if ('number' === typeof a && 'number' === typeof b) {
        stack.push(op(ab))
    } else {
        throw new Error('数字が入ってないよ')
    }
}

// 配列を逆ポーランド記法で記述した式として計算する.
function calc(inputstring[]) {
    let stacknumber[] = []
    for (let value of input) {
        if (value === '+') {
            calcAux(stack, (ab=> a + b)
        } else if (value === '-') {
            calcAux(stack, (ab=> a - b)
        } else if (value === '*') {
            calcAux(stack, (ab=> a * b)
        } else if (value === '/') {
            calcAux(stack, (ab=> a / b)
        } else {
            let a = parseInt(value)
            stack.push(a)
        }
    }

    if (1 === stack.length) {
        return stack.pop()
        
    } else {
        throw new Error('スタックの要素数が1ではありません. 式を間違えているかも?')
    }
}

let input = process.argv.slice(2process.argv.length)
// 計算してみる
console.log('計算結果'calc(input))

実行してみます.

PS C:\TSWork\RPN> .\node_modules\.bin\tsc
PS C:\TSWork\RPN> node .\dist\index.js 1 2 + 4 *
計算結果 12
PS C:\TSWork\RPN> node .\dist\index.js 1 2 + 4 * 5 -
計算結果 7
PS C:\TSWork\RPN>

コマンドライン引数の内容に応じて計算することを確認できました.

3)まとめ

この記事では, コマンドライン引数に記述した式を計算するようにプログラムを修正しました. プログラムに式を与える方法として, ファイルからの読み込みも考えられます. しかし, TypeScriptというよりもNode.jsでのファイルの読み込みは, 非同期プログラミングが前提となり, 挫折しそうなポイントですので, 記事を改めてじっくりと考えたいと思います. 

コマンドラインから式を与えられるようにしましたが, 誤った式を与えた場合, 例えば対応していない演算子や数値以外の文字列が与えられた時, エラーを返しません. 次回の記事では, 式として妥当かどうかをチェックする仕組みを入れます. 

最後に, この記事で使用したNode.jsとTypeScriptのバージョンは次の通りです.

PS C:\TSWork\RPN> node --version
v14.17.5
PS C:\TSWork\RPN> .\node_modules\.bin\tsc --version
Version 4.3.5
PS C:\TSWork\RPN>

0 件のコメント:

コメントを投稿

ヒューマン・リソース・マシーン 入社41年目−並べ替えよ

目次 1)課題 0を終端とした文字列がいくつか流れてきます。各文字列に対してソート(並べ替え)を行い、小さい順(昇順)に右側へ運んでください。 2)状況の確認 この問題では, 予めコードが入っています. このコードを実行して, 何をするコードなのか確かめます.  左のコンベアから...