(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