(Day 01) Nim memos
block
and Scopes
スコープと block
for
, while
のブロック内は外側と別スコープです。 内側から外側の変数を参照することはできますが、逆はできません。
# OK
var a = "a"
for c in 1..2:
echo a
# Error
for c in 1..2:
var d = "d"
echo d # Error!
for
やwhile
や関数を使わなくても、block
でもブロックを作ることができ、スコープを分離できます。 したがって、以下のコードは 3 行目のd
が未定義のためエラーになります。
block:
var d = "d"
echo d # Error!
block
内ではbreak
が使えます。 block に label をつけることもでき(break mylabel:
)、break mylabel
などとすることで特定の block から抜けることもできます。 while, for などと組み合わせることで複雑な制御フローも記述できそうですね(あまり複雑にはしないほうがいいと思いますが)。
block large:
for i in 1..10:
for j in 1..10:
echo(i, j)
if j==3:
break # 内側のforルールからしか抜けない
# 11, 12, 13, 21, 22, 23, ..., 103 と出力
block large:
for i in 1..10:
for j in 1..10:
echo(i, j)
if j==3:
break large # largeブロックを抜ける
# 11, 12, 13 だけ出力
参考: 公式チュートリアル: Scopes and the block statement
Execute external commands
nimscript
std
import osproc
let (output, status) = execCmdEx("ls -a")
echo status
# 0
echo output