Open4
【V lang】go2v を試す
Go コードを V に翻訳する go2v を試してみるスレッド。
やってみたら記事にまとめる
ターゲット: 依存ライブラリなしのプログラム
とりあえず mattn さんの go-lsd を V のコードに変換してみる。
作業ログ
セットアップ
mkdir vlsd
cd vlsd
# V プロジェクトの初期化
v init
rm -rf src
# clone go2v
gh repo clone vlang/go2v
go2v 実行
cd go2v
# https://github.com/mattn/go-lsd/blob/master/lsd.go の内容を少し調整して書き込む
nvim lsd.go
# converte
v run . lsd.go -o ../
結果
module lsd
pub fn distance(lhs_1 []rune, rhs_1 []rune) int {
mut rl1, rl2 := lhs_1.len, rhs_1.len
mut costs := []int{len: rl1 + 1}
for j := 1; j <= rl1; j++ {
costs[j] = j
}
mut cost, last, prev := 0, 0, 0
for i := 1; i <= rl2; i++ {
costs[0] = i
last = i - 1
for j_1 := 1; j_1 <= rl1; j_1++ {
prev = costs[j_1]
cost = 0
if lhs_1[j_1 - 1] != rhs_1[i - 1] {
cost = 1
}
if costs[j_1] + 1 < costs[j_1 - 1] + 1 {
if costs[j_1] + 1 < last + cost {
costs[j_1] = costs[j_1] + 1
} else {
costs[j_1] = last + cost
}
} else {
if costs[j_1 - 1] + 1 < last + cost {
costs[j_1] = costs[j_1 - 1] + 1
} else {
costs[j_1] = last + cost
}
}
last = prev
}
}
return costs[rl1]
}
pub fn string_distance(lhs string, rhs string) int {
return distance(lhs.bytes(), rhs.bytes())
}
lsd_test.go の変換結果
module lsd
struct Go2VInlineStruct {
mut:
lhs string
rhs string
want int
}
pub fn test_distance(t &testing.T) {
mut tests := [
Go2VInlineStruct{'こんにちわ世界', 'こんにちわ世界', 0},
Go2VInlineStruct{'こんにちわ世界', 'こにゃちわ世界', 2},
Go2VInlineStruct{'こんにちわ世界', 'こにゃにゃちわ世界', 3},
Go2VInlineStruct{'こんにちわ世界', 'こんばんわ世界', 2},
Go2VInlineStruct{'こんにちわ世界', 'こんにちわ', 2},
Go2VInlineStruct{'こんにちわ世界', 'こんばんわ', 4},
Go2VInlineStruct{'こんにちわ世界', '世界', 5},
]
for _, test in tests {
mut got := string_distance(test.lhs, test.rhs)
if got != test.want {
t.fatalf('want %v but %v: %v vs %v', test.want, got, test.lhs, test.rhs)
}
}
}
go2v で生成したやつの LICENSE って好きなのつけて良いのかな?
とりあえず MIT で公開した