(Day 01) Nim memos

#nim #programming

block and Scopes

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!

forwhileや関数を使わなくても、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

system


std

import osproc

let (output, status) = execCmdEx("ls -a")
echo status
# 0
echo output