Open4

【V lang】go2v を試す

zztkmzztkm

ターゲット: 依存ライブラリなしのプログラム

とりあえず 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)
		}
	}
}
zztkmzztkm

go2v で生成したやつの LICENSE って好きなのつけて良いのかな?

とりあえず MIT で公開した