やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

C#ソースコード雛形作成スクリプトの汎用化1

 他の言語でも使えるように。

成果物

前回まで

 前回、C#のHelloWorldソースコードを生成するシェルスクリプトを書いた。

# C# HelloWorld
#   1. ソースコードを生成する
#   2. ビルドする
#   3. 実行する
Define() {
    class_name=${1:-Hello}
    CreateSourceCodeFile() {
        code=$(cat <<- EOS
          using System;

          class $class_name
          {
              static void Main()
              {
                  string? message = "Hello, World";
                  Console.WriteLine(message);
                  string x = null;
                  Console.WriteLine(x);
              }
          }
     EOS
       )
        echo "$code" > "$class_name.cs"
    }
    Build() { csc $class_name.cs '/nullable:enable' '/langversion:8'; }
    Chmod() { chmod 755 $class_name.exe; }
    Execute() { ./$class_name.exe; }
}
Runable() {
    CreateSourceCodeFile 
    Build
    Chmod
    Execute
}
Run() {
    Define "$@"
    Runable
}
Run "$@"

汎用化

 今回は上記スクリプト汎用化したい。たとえば他の要素を追加したり、他言語でも使えるように。そのためのアイデアを考えてみた。

自動化すること

  • インデント
    • ツリー構造

 {,}内に含まれた要素を子とする。XMLと同様のツリー構造である。ただ、ツリー構造の解析や追加・削除をするのは相当面倒と思われる。まずはツリー構造のモデル化は避けて簡単に実装したい。

インデントする

echo "${TARGET}" | sed "s/^/\t/g" # ^ にマッチしたら "\t" に置き換える
echo "${RESULT}" | sed "s/^/  /g" # ^ にマッチしたら "  " に置き換える

 これを関数化・シェルスクリプト化すると以下。

indent.sh

# stdin: インデントしたいテキスト  $1: インデント用文字列(任意。省略時はタブ)
indent() { echo "$(cat -)" | sed "s/^/${1:-\t}/g";}

 スクリプトを読み込んで使ってみる。

. indent.sh
echo -e "int i;\ni = 5;" | indent
echo -e "int i;\ni = 5;" | indent "    "

 出力結果は以下。1回目がタブでインデントされ、2回目がスペース4つでインデントされる。(このブログではタブがスペースに自動置換されてしまうようだが……)

   int i;
    i = 5;
    int i;
    i = 5;

参考

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux