UWSC,HSP,AHKそれぞれでコンソール風計算機を作ってみました。
一行に書いた式を計算するだけのプログラムです。
入力受け取って計算結果を出すって簡単だろって思ったら
結構ひどい目にあいました…

UWSC
http://www.uwsc.info/
hoge01.uws
Option Explicit
// 変数宣言
Dim p = "100 + 100 - 50 / 2 * 3"
Dim i = 0
Dim e = 0
Dim t = 0
// 無限ループ
while 1
// 入力表示
p = input("数値か式を入力<#CR>※半角数字で入れてね", p)
// キャンセルなら終了
if p = empty then break
i = strconv(p, SC_HALFWIDTH) // 全角→半角に
e = eval(i) // 計算実行
t = tax(e) // 消費税
// 表示
print "input: " + i
print "eval : " + e
print "tax : " + t
wend
// 関数の定義
function tax(p)
result = int(p * 1.08)
fend
Option Explicitて書いておくと宣言してない変数は怒られるようになる
宣言なんかいらないよって派閥もありますが、折角できるので一応しときます。
コメントは//で改行のとこに;(セミコロン)とかいらない
p = input("数値か式を入力<#CR>※半角数字で入れてね", p)
入力窓を出すのは
値 = input("メッセージ", "初期値")
簡単です。
i = strconv(p, SC_HALFWIDTH)
全角文字で入力された場合考えて、半角に変換 i
strconv()標準関数です便利です。
e = eval(i)
eval関数も標準なのでそのまま式として実行してくれる結果をeに
t = tax(e)
消費税計算の関数tax()は自前の関数、サブルーチンの作り方
// 関数の定義
function tax(p)
result = int(p * 1.08)
fend
return hoge
じゃなくて戻り値はresultに入れるのが独特
最後に結果を print
print "hoge" すると勝手に窓出て表示されます
この繰り返しなのでwhileで囲む
while 1
//処理
wend

AutoHotKey
http://ahkscript.org/
hoge01.ahk
; 変数宣言
p := "100 + 100 - 50 / 2 * 3"
i := 0
e := 0
t := 0
; ログ表示窓を作る
Gui, color, 000000, FFFFFF
Gui, margin,2,2
Gui, +resize +0x00800000
Gui, add, Edit, W400 H320 Vmymsgbox
Gui, show, Center
; 無限ループ
while(1){
; 入力表示
inputbox, p, AHK eval, 数値か式を入力`n※半角数字で入れてね, , 290, 140, , , , ,% p
; キャンセルなら終了
if(errorlevel <> 0){
ExitApp
}
i := z2h(p) ; 全角→半角に
e := eval(i) ; 計算実行
t := tax(e) ; 消費税
; 表示
GuiControlGet, v , , mymsgbox
GuiControl, , mymsgbox, %v%input : %i% `neval : %e%`ntax : %t% `n
; msgbox, input : %i% `neval : %p%`ntax : %t%
}
; 関数の定義
; 消費税 8%
tax(p){
return floor(p * 1.08)
}
; 全角→半角
z2h(s){
res := ""
s := regexreplace(s, " ", " ")
loop, parse, s
{
res .= regexmatch(a_loopfield, "[!-~]") ? chr(asc(a_loopfield) - 65248) : a_loopfield
}
return res
}
; eval風
eval(s){
cpy := s
ptn := "([\d\.]+)\s*([*/])\s*([\d\.]+)"
while(regexmatch(cpy, ptn, $)){
if($2 = "*")
cpy := regexreplace(cpy, ptn, $1 * $3, n, 1)
if($2 = "/")
cpy := regexreplace(cpy, ptn, $1 / $3, n, 1)
}
ptn := "([\d\.]+)\s*([+-])\s*([\d\.]+)"
while(regexmatch(cpy, ptn, $)){
if($2 = "+")
cpy := regexreplace(cpy, ptn, $1 + $3, n, 1)
if($2 = "-")
cpy := regexreplace(cpy, ptn, $1 - $3, n, 1)
}
cpy := regexreplace(cpy, "\.0+$", "")
return cpy
}
GuiSize:
GuiControl, Move, mymsgbox, % "w" . A_GuiWidth
GuiControl, Move, mymsgbox, % "h" . A_GuiHeight
return
こんな簡単な事なのに俄然面倒な感じになったAutoHotKeyです。
UWSCにあるstrconvとeval関数が無いので自前で実装したので長くなったけど
やってる事一緒です。
変数宣言とか無いみたいなんだけど一応使う変数をてっぺんに書いときます。
コメントは;(セミコロン)変数の代入を:=(コロンとイコール)にしないとた
代入する値を式として評価してくれない。AHKの代入は:=とするもんだと思った方が
たぶん混乱しないと思います。
UWSCのprintが無いので自前で窓を作ります。
; ログ表示窓を作る
Gui, color, 000000, FFFFFF ←窓background,font-color
Gui, margin,2,2
Gui, +resize +0x00800000 ←リサイズできる窓にする
Gui, add, Edit, W400 H320 Vmymsgbox ←Textarea V名前
Gui, show, Center ←よーし真ん中に表示セヨ
mymsgboxの値をとる vに値が入ります。
GuiControlGet, v , , mymsgbox
mymsgboxの書き換え なんじゃこりゃ~
GuiControl, , mymsgbox, %v%input : %i% `neval : %e%`ntax : %t% `n
変数の展開が%hoge%なのです。改行が`n(逆クォートとエヌ)
GuiControl, , mymsgbox, ほげほげ`nふがふが`n独特です
関数の作り方はfunctionとか無し、いきなりtax(){}です
; 消費税 8%
tax(p){
return floor(p * 1.08)
}
UWSCにあるstrconvとeval関数がなかったので
z2h(){}
eval(){} 風
かわりに作った関数です。正規表現で無理やり計算
GuiSize:は窓をリサイズした時にこのラベルが動きます。
窓サイズにテキストエリアmymsgboxが可変してフィット。
GuiSize:
GuiControl, Move, mymsgbox, % "w" . A_GuiWidth
GuiControl, Move, mymsgbox, % "h" . A_GuiHeight
return
またこれややこしいのだけど、AutoHotKeyは引数を
% ここから式
変数は%param%ですよ
と二通り書けるので% "w" . A_GuiWidth は w%A_GuiWidth% と同じです。
文字列は+でなくて . (ドット)で連結、.前後の空白も無いと怒られます。
HSPに続く…