翻蚳è
ããã®ã¡ã¢æåã®éšåã¯ã
ãNimãã¥ãŒããªã¢ã«ïŒéš1ïŒãã§ãã翻蚳ã¯èªåã®ããã«ãã€ãŸãäžåšçšã«ãããŠæ¥ãã§è¡ãããŸããã ããã€ãã®ãã¬ãŒãºã®èšèé£ãã¯ã²ã©ãèŠçãçãå¿
èŠããã£ãããããã·ã¢èªã«å°ãã§ã䌌ãŠããŸããã ããè¯ãæžãæ¹ãç¥ã£ãŠãã人-åäººã§æžããŠãç§ã¯ç·šéããŸãã
ã¯ããã«
ãç¹°ãè¿ãã¯äžæ¡çãæ
éã«èŠãããã-ããŒãã³ã»ã¯ã€ã«ãããŒã¬ãŒ
ïŒåæïŒãç¹°ãè¿ãã¯ã°ãããããšãåççã«ãããã-ããŒãã³ã»ã¯ã€ã«ãããŒã¬ãŒïŒãã®ããã¥ã¡ã³ãã¯è€éãª
Nimèšèªæ§æç©ã«é¢ãããã¥ãŒããªã¢ã«
ã§ãã ãã®ããã¥ã¡ã³ãã¯ããæä»£é
ãã§ãããããã¥ã¢ã«ã«ã¯èšèªã®è€éãªæ©èœã«é¢ããããå€ãã®é¢é£ããäŸãããããšã«æ³šæããŠãã ããããã©ã°ã
ãã©ã°ãã¯ãæ°ããããŒã¯ãŒããå
¥åããã«ã³ã³ãã€ã©ã«è¿œå æ
å ±ãŸãã¯ã³ãã³ããäŒããNimã®åãå
¥ããããæ¹æ³ã§ãã ãã©ã°ãã¯ãããã
{. and .}
ç¹å¥ãªäžæ¬åŒ§ã§å²ãŸããŠããŸã
{. and .}
{. and .}
ã ãããã¯ãã®ãã¥ãŒããªã¢ã«ã§ã¯ã«ããŒãããŠããŸããã å©çšå¯èœãªãã©ã°ãã®ãªã¹ãã«ã€ããŠã¯ã
ããã¥ã¢ã«ãŸãã¯
ãŠãŒã¶ãŒããã¥ã¢ã«ãåç
§ããŠãã ããã
ãªããžã§ã¯ãæåããã°ã©ãã³ã°
Nimã§ã®ãªããžã§ã¯ãæåããã°ã©ãã³ã°ïŒOOPïŒã®ãµããŒãã¯æå°éã§ããã匷åãªOOPãã¯ããã¯ã䜿çšã§ããŸãã OOPã¯
ãããã°ã©ã ãéçºããæ¹æ³ã®
1ã€ãšèŠãªãããŸã
ãããã
ã ãã§ã¯ãããŸããã æç¶ãåã¢ãããŒãã¯ã³ãŒããåçŽåããå¹çãåäžãããããšããããŸãã ããšãã°ãç¶æ¿ã®ä»£ããã«æ§æã䜿çšãããšãå€ãã®å Žåãã¢ãŒããã¯ãã£ãåäžããŸãã
ãªããžã§ã¯ã
ã¿ãã«ãªã©ã®ãªããžã§ã¯ãã¯ãããŸããŸãªå€ãåäžã®æ§é ã«ããã¯ããããã«èšèšãããŠããŸãã ãããããªããžã§ã¯ãã«ã¯ã¿ãã«ã«ã¯ãªãããã€ãã®æ©èœããããŸãïŒç¶æ¿ãšé èœæ
å ±ã ãªããžã§ã¯ãã¯ããŒã¿ãã«ãã»ã«åããããã
T()
ãªããžã§ã¯ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯éåžžãå
éšéçºã§ã®ã¿äœ¿çšãããåæåã®ããã«ãããã°ã©ããŒã¯ç¹å¥ãªæé ïŒ
ã³ã³ã¹ãã©ã¯ã¿ãŒãšåŒã°ããŸãïŒãæäŸããå¿
èŠããããŸã
ããªããžã§ã¯ãã¯ãå®è¡æã«ãã®åã«ã¢ã¯ã»ã¹ã§ããŸãã ã®æŒç®åã
of
ãããã䜿çšããŠãªããžã§ã¯ãã®ã¿ã€ãã確èªã§ããŸãã
type Person = ref object of RootObj name*: string
å®çŸ©ãããŠããã¢ãžã¥ãŒã«ã®å€éšã§è¡šç€ºããããªããžã§ã¯ãã®ãã£ãŒã«ãã«ã¯ãã¢ã¹ã¿ãªã¹ã¯ïŒ
*
ïŒãä»ããŠããŸãã ã¿ãã«ãšã¯ç°ãªããããŸããŸãªãªããžã§ã¯ãã¿ã€ãã
åçã«ãªãããšã¯ãããŸãã
ã æ°ãããªããžã§ã¯ãã¿ã€ãã¯ãã¿ã€ãã»ã¯ã·ã§ã³ã§ã®ã¿å®çŸ©ã§ããŸãã
ç¶æ¿ã¯
object of
æ§æã®
object of
䜿çšããŠè¡ãããŸãã çŸåšãå€éç¶æ¿ã¯ãµããŒããããŠããŸããã ãªããžã§ã¯ãã¿ã€ãã«é©ããç¥å
ããªãå Žåã¯ã
RootObj
ç¥å
ã«ããããšãã§ããŸãããããã¯åãªãæ
£ç¿ã§ãã ç¥å
ãæããªããªããžã§ã¯ãã¯ãæé»çã«
final
ãšããŠå®£èšãããŸãã
system.RootObj
ããç¶æ¿ãããªãæ°ãããªããžã§ã¯ããå°å
¥ããã«ã¯ã
inheritable
ãã©ã°ãã䜿çšã§ããŸãïŒããã¯ãããšãã°GTKã©ãããŒã§äœ¿çšãããŸãïŒã
åç
§ãªããžã§ã¯ãã¯ãç¶æ¿ã«é¢ä¿ãªã䜿çšã§ããŸãã ããã¯å¿
ãããå¿
èŠã§ã¯ãããŸããããããšãã°ã
let person: Person = Student(id: 123)
éåç
§ãªããžã§ã¯ããå²ãåœãŠãããŠããå Žåãåã¯ã©ã¹ã®ãã£ãŒã«ãã¯åãæšãŠãããŸãã
泚ïŒåçŽãªã³ãŒãã®åå©çšã®å Žåãæ§æïŒ ãå«ãŸãããé¢ä¿ïŒã¯ç¶æ¿ïŒ ããããé¢ä¿ïŒãããæãŸããå ŽåããããŸãã ã Nimã®ãªããžã§ã¯ãã¯å€åã§ãããããæ§æã¯ç¶æ¿ãšåããããå¹ççã§ãã
çžäºååž°å
ãªããžã§ã¯ããã¿ãã«ãããã³ãªã³ã¯ã䜿çšããŠã
çžäºã«äŸåãã
çžäºã«ååž°çãªããªãè€éãªããŒã¿æ§é ãã¢ãã«åã§ããŸã
ã Nimã§ã¯ããã®ãããªåã¯åäžã®åã»ã¯ã·ã§ã³å
ã§ã®ã¿å®£èšã§ããŸãã ïŒä»ã®ãœãªã¥ãŒã·ã§ã³ã§ã¯ã远å ã®æåæ€çŽ¢ãå¿
èŠã«ãªããããã³ã³ãã€ã«ãé
ããªããŸããïŒ
äŸïŒ
type Node = ref NodeObj
å倿
Nimã¯ãåãã£ã¹ããšå倿ãåºå¥ããŸãã ãã£ã¹ãã¯
cast
æŒç®åã䜿çšããŠè¡ãããã³ã³ãã€ã©ã«åŒ·å¶çã«ãã€ããªããŒã¿ãæå®ãããåãšããŠè§£éãããŸãã
å倿ã¯ãããåãå¥ã®åã«å€æãããããšã¬ã¬ã³ããªæ¹æ³ã§ããåã倿ã§ãããã©ããããã§ãã¯ããŸãã å倿ãäžå¯èœãªå Žåãã³ã³ãã€ã©ã¯ãããå ±åããããäŸå€ãã¹ããŒãããŸãã
åå€æã®æ§æã¯æ¬¡ã®ãšããã§ãïŒ
destination_type(expression_to_convert)
ïŒéåžžã®åŒã³åºãã«äŒŒãŠããŸãïŒã
proc getID(x: Person): int = Student(x).id
x
Student
ã€ã³ã¹ã¿ã³ã¹ã§
x
ãªãå Žåã
InvalidObjectConversionError
äŸå€ãã¹ããŒãããŸãã
ããªã¢ã³ããªããžã§ã¯ã
ãªããžã§ã¯ãéå±€ãéå°ãªå ŽåããããåçŽãªããªã¢ã³ãåã§ãã¹ãŠã解決ã§ããŸãã
äŸïŒ
ãã®äŸãããããããã«ããªããžã§ã¯ãéå±€ãšã¯å¯Ÿç
§çã«ãç°ãªããªããžã§ã¯ãã¿ã€ãéã§å€æãè¡ãå¿
èŠã¯ãããŸããã ãã ãããªããžã§ã¯ãã®ééã£ããã£ãŒã«ãã«ã¢ã¯ã»ã¹ãããšäŸå€ãçºçããŸãã
æ¹æ³
éåžžã®ãªããžã§ã¯ãæåèšèªã§ã¯ãããã·ãŒãžã£ïŒ
ã¡ãœãããšãåŒã°ã
ãŸãïŒã¯ã¯ã©ã¹ã«ãã€ã³ããããŸãã ãã®ã¢ãããŒãã«ã¯ãæ¬¡ã®æ¬ ç¹ããããŸãã
- ã¯ã©ã¹ã«ã¡ãœããã远å ãããšãããã°ã©ããŒã¯ãã®ã¡ãœããã®å¶åŸ¡ã倱ãããã¯ã©ã¹ãšã¯å¥ã«ã¡ãœãããæäœããå¿
èŠãããå Žåã¯äžåšçšãªåé¿çãè¬ããŸãã
- å€ãã®å Žåãã¡ãœãããäœã«é¢é£ããã®ããäžæç¢ºã§ã
join
ã¯æååãŸãã¯é
åã¡ãœããã§ããïŒ
Nimã¯ãã¡ãœãããã¯ã©ã¹ã«ãã€ã³ãããªãããšã«ããããããã®åé¡ãåé¿ããŸãã Nimã®ãã¹ãŠã®ã¡ãœããã¯ãã«ãã¡ãœããã§ãã åŸã§èŠãããã«ããã«ãã¡ãœããã¯åçãã€ã³ãã£ã³ã°ã®æé ãšã®ã¿ç°ãªããŸãã
ã¡ãœããåŒã³åºãã®æ§æ
Nimã§ãµãã«ãŒãã³ãåŒã³åºãããã®ç¹å¥ãªæ§æç³è¡£ããããŸãïŒ
obj.method(args)
ã³ã³ã¹ãã©ã¯ãã¯
method(obj, args)
ãšåãæå³ã§ãã åŒæ°ããªãå Žåã¯ããã©ã±ãããã¹ãããã§ããŸãïŒ
len(obj)
代ããã«
obj.len
ã
ãã®ã¡ãœããåŒã³åºãæ§æã¯ãªããžã§ã¯ãã«éå®ããããããããã¿ã€ãã«äœ¿çšã§ããŸãã
echo("abc".len)
ïŒã¡ãœããåŒã³åºãã®æ§æã«é¢ããå¥ã®èгç¹ã¯ãæ¬ èœããŠããæ¥å°ŸèŸè¡šèšæ³ãå®è£
ããããšã§ããïŒ
ããã«ããããã¯ãªãŒã³ãªãªããžã§ã¯ãæåã³ãŒãããç°¡åã«äœæã§ããŸãã
import strutils, sequtils stdout.writeLine("Give a list of numbers (separated by spaces): ") stdout.write(stdin.readLine.split.map(parseInt).max.`$`) stdout.writeLine(" is the maximum!")
ããããã£
äžèšã®äŸãããããããã«ãNimã¯
get-propertiesãå¿
èŠãšããŸãã
ããããã¯
ãã¡ãœããåŒã³åºãæ§æã䜿çšã
ãŠåŒã³åºãããéåžžã®get-proceduresã«çœ®ãæããã
ãŸãã ãã ããå€ã®å²ãåœãŠã¯å¥ã®åé¡ã§ãããã®ããã«ã¯ãç¹å¥ãªæ§æãå¿
èŠã§ãã
type Socket* = ref object of RootObj host: int
ïŒãã®äŸã¯
inline
æé ã瀺ããŠããŸããïŒ
é
åããããã£ãå®è£
ããã«ã¯ãé
åã¢ã¯ã»ã¹æŒç®å
[]
ãªãŒããŒããŒãã§ããŸãã
type Vector* = object x, y, z: float proc `[]=`* (v: var Vector, i: int, value: float) =
ãã®äŸã¯äžåšçšã§ããv
v[]
æ¢ã«ã¢ã¯ã»ã¹ã§ããã¿ãã«ã§ãã¯ãã«ãã¢ãã«åããæ¹ãè¯ãããã§ãã
åçãã€ã³ãã£ã³ã°
ããã·ãŒãžã£ã¯åžžã«éçãã€ã³ãã£ã³ã°ã䜿çšããŸãã åçãã€ã³ãã£ã³ã°ã®å Žåã
proc
ããŒã¯ãŒãã
method
眮ãæããŸãã
type PExpr = ref object of RootObj
ãã®äŸã§ã¯ã
newLit
ããã³
newPlus
ã¯ããã·ãŒãžã£ã§ããããšã«æ³šæããŠãã ãããéçãã€ã³ãã£ã³ã°ã䜿çšããæ¹ãé©åã§ãããåçãã€ã³ãã£ã³ã°ãå¿
èŠãšãã
eval
ãã§ã«ã¡ãœããã§ãã
ãã«ãã¡ãœããã§ã¯ããªããžã§ã¯ãã¿ã€ããæã€ãã¹ãŠã®ãã©ã¡ãŒã¿ãŒããã€ã³ãã«äœ¿çšãããŸãã
type Thing = ref object of RootObj Unit = ref object of Thing x: int method collide(a, b: Thing) {.inline.} = quit "to override!" method collide(a: Thing, b: Unit) {.inline.} = echo "1" method collide(a: Unit, b: Thing) {.inline.} = echo "2" var a, b: Unit new a new b collide(a, b)
ãã®äŸãããããããã«ããã«ãã¡ãœããã®åŒã³åºãã¯ææ§ã«
collide
ããšã¯ã§ããŸãããè§£å床ãå·Šããå³ã«æ©èœ
collide
ããã
collide
1ãã
collide
2ã®æ¹ãæãŸããã§ãã ãããã£ãŠã
Unit
ã
Thing
ã
Thing
ã
Unit
ãã
Thing
åªå
ãããŸãã
ããã©ãŒãã³ã¹ã«é¢ããæ³šæ ïŒNimã¯ä»®æ³ã¡ãœããã®ããŒãã«ãäœæããŸãããããã£ã¹ãããããªãŒãçæããŸãã ããã«ãããã³ã¹ãã®ãããã¡ãœããåŒã³åºãã®éæ¥åå²ãåé¿ãããåã蟌ã¿ãå¯èœã«ãªããŸãã ãã ããã³ã³ãã€ã«æ®µéã§ã®èšç®ããããã³ãŒãã®åé€ãªã©ãä»ã®æé©åã¯ã¡ãœããã§ã¯æ©èœããŸããã
äŸå€
Nimã§ã¯ãäŸå€ã¯ãªããžã§ã¯ãã§ãã æ
£äŸã«ãããäŸå€ã¿ã€ãã¯ããšã©ãŒãã§çµãããŸãã
system
ã¢ãžã¥ãŒã«ã¯ããã€ã³ãã§ããäŸå€éå±€ãå®çŸ©ããŸãã äŸå€ã¯ãå
±éã€ã³ã¿ãŒãã§ãŒã¹ãæäŸãã
system.Exception
ããçºçããŸãã
äŸå€ã¯ããã®åç¶æéãäžæã§ãããããããŒãã«ã¹ããŒããå¿
èŠããããŸãã ã³ã³ãã€ã©ãŒã¯ãã¹ã¿ãã¯ã«çœ®ãããäŸå€ãã¹ããŒããããšãèš±å¯ããŸããã ã¹ããŒããããã¹ãŠã®äŸå€ã¯ãå°ãªããšã
msg
ãã£ãŒã«ãã«åºçŸããçç±ã瀺ãå¿
èŠããããŸãã
äŸå€ã¯
äŸå€çãªå Žåã«ã¹ããŒãããããšã«ãªã£ãŠããŸããããšãã°ããã¡ã€ã«ãéãããšãã§ããªãå ŽåãäŸå€ã¯ã¹ããŒãããŸããïŒãã¡ã€ã«ãååšããªãå ŽåããããŸãïŒã
ã³ãã³ããraise
raise
ã³ãã³ãã䜿çšããŠäŸå€ãã¹ããŒãããŸãã
var e: ref OSError new(e) e.msg = "the request to the OS failed" raise e
åŒã
raise
ããŒã¯ãŒãã®åŸã«ââç¶ããªãå ŽåãæåŸã®äŸå€ã
åã³ã¹ããŒ
ãããŸãã äžèšã®ã³ãŒããèšè¿°ããªãããã«ã
system
ã¢ãžã¥ãŒã«ãã
newException
ãã³ãã¬ãŒãã䜿çšã§ããŸãã
raise newException(OSError, "the request to the OS failed")
ã³ãã³ããtry
try
ã³ãã³ãã¯äŸå€ãåŠçããŸãã
try
åŸã®ã³ãã³ãã¯ãäŸå€ãã¹ããŒããããŸã§å®è¡ãããŸãã ãã®å Žåã察å¿ãã
except
ãã©ã³ããå®è¡ãããŸãã
çºçããäŸå€ãæç€ºçã«ãªã¹ããããŠããªãå Žåã空ã®
except
ãããã¯ãå®è¡ãããŸãã ããã¯ã
if
ã³ãã³ãã®
else
ãã©ã³ãã«äŒŒãŠã
else
ã
finally
ãã©ã³ããååšããå ŽåãäŸå€ãã³ãã©ãå®è¡ãããåŸã«åžžã«å®è¡ãããŸãã
except
ãã©ã³ãã§äŸå€ã
ã¹ããŒãããŸãã äŸå€ãåŠçãããªãå ŽåãåŒã³åºãã¹ã¿ãã¯ã«æ²¿ã£ãŠäŒæããŸãã ããã¯ãäŸå€ãçºçããå Žåã
finally
ãããã¯å
ã«ãªãæ®ãã®ããã·ãŒãžã£ã¯å®è¡ãããªãããšãæå³ããŸãã
except
ãã©ã³ãå
ã§çŸåšã®äŸå€ãªããžã§ã¯ããŸãã¯ãã®ã¡ãã»ãŒãžãååŸããå¿
èŠãããå Žåã¯ã
system
ã¢ãžã¥ãŒã«ãã
getCurrentException()
ããã³
getCurrentExceptionMsg()
ããã·ãŒãžã£ã䜿çšã§ããŸãã äŸïŒ
try: doSomethingHere() except: let e = getCurrentException() msg = getCurrentExceptionMsg() echo "Got exception ", repr(e), " with message ", msg
é€å€ãããäŸå€ãå«ãããã·ãŒãžã£ã«æ³šéãä»ãã
ãªãã·ã§ã³ã®ãã©ã°ã
{.raises.}
ã䜿çšããŠãããã·ãŒãžã£ãç¹å®ã®äŸå€ãçºçããããããŸã£ããçºçãããªãããã«æå®ã§ããŸãã ãã©ã°ã
{.raises.}
䜿çšãããŠããå Žåãã³ã³ãã€ã©ã¯ãããæ£ããããšã確èªããŸãã ããšãã°ãããã·ãŒãžã£
IOError
ããæç¹ã§ããïŒãŸãã¯åŒã³åºãããããã·ãŒãžã£ã®1ã€ïŒãå¥ã®äŸå€ãã¹ããŒããããšã瀺ãå Žåãã³ã³ãã€ã©ã¯ã³ã³ãã€ã«ãæåŠããŸãã 䜿çšäŸïŒ
proc complexProc() {.raises: [IOError, ArithmeticError].} = ... proc simpleProc() {.raises: [].} = ...
åæ§ã®ã³ãŒããäœæããåŸãã¹ããŒãããäŸå€ã®ãªã¹ãã倿Žããããšãã³ã³ãã€ã©ã¯ããã©ã°ãã®æ€èšŒã忢ããããã·ãŒãžã£å
ã®è¡ãšãªã¹ãã«ãªãäŸå€ãæããšã©ãŒã§åæ¢ããŸãã ããã«ããã®äŸå€ãçºçãããã¡ã€ã«ãšè¡ã瀺ãããŸããããã«ãããçãããã³ãŒããèŠã€ãããããªãã倿Žãåå ãšãªã£ãŠããŸãã
ãã©ã°ã
{.raises.}
ãæ¢åã®ã³ãŒãã«è¿œå ããå Žåã¯ãã³ã³ãã€ã©ãŒã圹ç«ã¡ãŸãã ãã©ã°ã
{.effects.}
ãããã·ãŒãžã£ã«è¿œå ãããšãã³ã³ãã€ã©ã¯ãã®æç¹ã§è¡šç€ºããããã¹ãŠã®å¹æãåºåããŸãïŒäŸå€è¿œè·¡ã¯Nim广ã·ã¹ãã ã®äžéšã§ãïŒã ããã·ãŒãžã£ã«ãã£ãŠã¹ããŒãããäŸå€ã®ãªã¹ããååŸããå¥ã®åé¿çã¯ãNim
doc2
ã䜿çšããããšã§ãããã®
doc2
ãã¢ãžã¥ãŒã«å
šäœã®ããã¥ã¡ã³ããçæããã¹ããŒãããäŸå€ã®ãªã¹ãã§ãã¹ãŠã®ããã·ãŒãžã£ãè£
食ããŸãã
ãšãã§ã¯ãã·ã¹ãã ãšé¢é£ãããã©ã°ãã®è©³çްã«ã€ããŠ
ã¯ãããã¥ã¢ã«ãåç
§ããŠãã ãã ã
æ±å
æ±åã¯ãNimãåãã©ã¡ãŒã¿ãŒã䜿çšããŠããã·ãŒãžã£ãã€ãã¬ãŒã¿ãŒããŸãã¯åããã©ã¡ãŒã¿ãŒåã§ããããã«ãããã®ã§ãã ãããã¯ã髿§èœã®ã¿ã€ãã»ãŒãã³ã³ãããäœæããã®ã«æã䟿å©ã§ãã
type BinaryTreeObj[T] = object
ãã®äŸã¯ãäžè¬åããããã€ããªããªãŒã瀺ããŠããŸãã ã³ã³ããã¹ãã«å¿ããŠãåãã©ã¡ãŒã¿ãŒã®å
¥åããŸãã¯äžè¬åãããããã·ãŒãžã£ãå埩åããŸãã¯åã®ã€ã³ã¹ã¿ã³ã¹åã«è§æ¬åŒ§ã䜿çšãããŸãã äŸãããããããã«ãäžè¬åã¯ãªãŒããŒããŒãã§
add
ãŸããæé©ãªäžèŽã¯
add
ã§ãã ã·ãŒã±ã³ã¹ã®çµã¿èŸŒã¿
add
ããã·ãŒãžã£ã¯é衚瀺ã§ã¯ãªãã
preorder
å埩åã§äœ¿çšãããŸãã
ãã¿ãŒã³
ãã³ãã¬ãŒãã¯ãNimæœè±¡æ§æããªãŒïŒASTïŒã§åäœããåçŽãªçœ®æã¡ã«ããºã ã§ãã ãã³ãã¬ãŒãã¯ãã»ãã³ãã£ãã¯ã³ã³ãã€ã«ãã¹ã§åŠçãããŸãã ãããã¯ä»ã®èšèªãšããŸãçµ±åãããŠãããCã·ã£ã€ããªããã»ããµãã¯ãã®éåžžã®æ¬ ç¹ã¯ãããŸããã
ãã³ãã¬ãŒããåŒã³åºãã«ã¯ãããã·ãŒãžã£ãšããŠåŒã³åºããŸãã
äŸïŒ
template `!=` (a, b: expr): expr =
æŒç®å
!=
ã
>
ã
>=
ã
in
ã
isnot
ã
isnot
ã¯å®éã«ã¯ãã³ãã¬ãŒãã§ãïŒçµæãšããŠã
==
æŒç®åããªãŒããŒããŒããããšã
!=
æŒç®åã¯èªåçã«äœ¿çšå¯èœã«ãªããæ£ããåäœããŸãïŒIEEEæµ®åå°æ°ç¹æ°ãé€ã
NaN
ã¯å³å¯ãªããŒã«å€ãç ŽããŸãïŒããžãã¯ïŒã
a > b
ã¯
b < a
a > b
ãªããŸãã
a in b
contains(b, a)
倿ãã
contains(b, a)
ã
isnot
ãš
isnot
ã¯æãããªæå³ãæã¡ãŸããã
ãã³ãã¬ãŒãã¯ãã¬ã€ãžãŒã³ã³ãã¥ãŒãã£ã³ã°ã«é¢ããŠç¹ã«æçšã§ãã ãã®ã³ã°ã®ç°¡åãªæé ãæ€èšããŠãã ããã
const debug = true proc log(msg: string) {.inline.} = if debug: stdout.writeLine(msg) var x = 4 log("x has the value: " & $x)
ãã®ã³ãŒãã«ã¯æ¬ é¥ããããŸãïŒ
debug
äžåºŠ
false
ã«èšå®ããããšãããªãã³ã¹ãã®ãããæäœ
$
ãš
&
ãå®è¡ãããŸãïŒ ïŒããã·ãŒãžã£ã®åŒæ°ã®èšç®ã¯ã貪欲ãã«è¡ãããŸããïŒ
log
æé ããã³ãã¬ãŒãã«å€ãããšããã®åé¡ã解決ããŸãã
const debug = true template log(msg: string) = if debug: stdout.writeLine(msg) var x = 4 log("x has the value: " & $x)
ãã©ã¡ãŒã¿ã¿ã€ãã¯ãéåžžã®ã¿ã€ããŸãã¯ã¡ã¿ã¿ã€ã
expr
ïŒ
åŒã®å ŽåïŒã stmt
ïŒ
ã³ãã³ãã®å ŽåïŒããŸãã¯
typedesc
ïŒ
ã¿ã€ãã®èª¬æã®å ŽåïŒã§ãã æ»ãå€ã®åããã³ãã¬ãŒãã§æç€ºçã«æå®ãããŠããªãå Žåã
stmt
ããã·ãŒãžã£ããã³ã¡ãœãããšã®äºææ§ã®ããã«äœ¿çšãããŸãã
stmt
ãã©ã¡ãŒã¿ãŒãããå Žåãããã¯ãã³ãã¬ãŒã宣èšã®æåŸã§ãªããã°ãªããŸããã çç±ã¯ãã³ãã³ããç¹å¥ãªã³ãã³æ§æïŒ
:
ã䜿çšããŠãã³ãã¬ãŒãã«æž¡ãããããã§ãïŒ
template withFile(f: expr, filename: string, mode: FileMode, body: stmt): stmt {.immediate.} = let fn = filename var f: File if open(f, fn, mode): try: body finally: close(f) else: quit("cannot open: " & fn) withFile(txt, "ttempl3.txt", fmWrite): txt.writeLine("line 1") txt.writeLine("line 2")
ãã®äŸã§ã¯ã2ã€ã®
writeLine
ã³ãã³ã
writeLine
body
ãã©ã¡ãŒã¿ãŒã«ãã€ã³ããããŠããŸãã
withFile
ãã³ãã¬ãŒãã«ã¯ãŠãŒãã£ãªãã£ã³ãŒããå«ãŸããŠããããã¡ã€ã«ãéããããšãå¿ããªããšããäžè¬çãªåé¡ãåé¿ããã®ã«åœ¹ç«ã¡ãŸãã
let fn = filename
ã¯ã
filename
ãäžåºŠã ãè©äŸ¡ãããããšãä¿èšŒããããšã«æ³šæããŠãã ããã
ãã¯ã
ãã¯ãã䜿çšãããšãã³ã³ãã€ã«æ®µéã§ã³ãŒããéäžçã«å€æã§ããŸãããNimã®æ§æã倿Žããããšã¯ã§ããŸããã ãã ããNimæ§æã¯éåžžã«æè»ã§ãããããããã¯ããã»ã©æ·±å»ãªå¶éã§ã¯ãããŸããã ãã¯ãã¯çŽç²ãªNimã«å®è£
ããå¿
èŠããã
ãŸããå€éšé¢æ°ã€ã³ã¿ãŒãã§ã€ã¹ïŒFFIïŒãã³ã³ãã€ã©ã§èš±å¯ãããŠããªãããã§ãã
ãã¯ããèšè¿°ããæ¹æ³ã¯2ã€ãããŸããNimãœãŒã¹ã³ãŒããçæããè§£æã®ããã«ã³ã³ãã€ã©ã«æž¡ãããã³ã³ãã€ã©ã«ãã£ãŒããããæœè±¡æ§æããªãŒïŒASTïŒãæåã§äœæããŸããASTãæ§ç¯ããã«ã¯ãç¹å®ã®Nimæ§æãæœè±¡æ§æããªãŒã«ã©ã®ããã«å€æãããããç¥ãå¿
èŠããããŸããASTã¯ã¢ãžã¥ãŒã«ã«ææžåãããŠããŸãmacros
ããã¯ãã®æºåãã§ããããåŒã³åºãæ¹æ³ã2ã€ãããŸãã- ãã¯ããããã·ãŒãžã£ãšããŠåŒã³åºãïŒåŒãã¯ãïŒ
- ç¹å¥ãªæ§æã䜿çšããŠãã¯ããåŒã³åºã
macrostmt
ïŒãã¯ãã³ãã³ãïŒ
åŒãã¯ã
次ã®äŸã¯ãdebug
ä»»æã®æ°ã®åŒæ°ãåã匷åãªã³ãã³ããå®è£
ããŠããŸãã
ãã¯ãåŒã³åºãã¯æ¬¡ã®ããã«å±éãããŸãã write(stdout, "a[0]") write(stdout, ": ") writeLine(stdout, a[0]) write(stdout, "a[1]") write(stdout, ": ") writeLine(stdout, a[1]) write(stdout, "x") write(stdout, ": ") writeLine(stdout, x)
ã³ãã³ããã¯ã
ã³ãã³ããã¯ãã¯ãåŒãã¯ããšåãæ¹æ³ã§å®çŸ©ãããŸãããã ããã³ãã³ã§çµããåŒãä»ããŠåŒã³åºãããŸããæ¬¡ã®äŸã¯ãæ£èŠè¡šçŸã®åå¥è§£æããŒã«ãçæãããã¯ãã瀺ããŠããŸãã macro case_token(n: stmt): stmt =
æåã®ãã¯ããäœæãã
ãã¯ãã®äœæãã¬ã€ãããããã«ãå
žåçãªåçã³ãŒããéçã«ã³ã³ãã€ã«ã§ãããã®ã«å€ããæ¹æ³ã瀺ããŸããããšãã°ã次ã®ã³ãŒããã©ã°ã¡ã³ããéå§ç¹ãšããŠäœ¿çšããŸãã import strutils, tables proc readCfgAtRuntime(cfgFilename: string): Table[string, string] = let inputString = readFile(cfgFilename) var source = "" result = initTable[string, string]() for line in inputString.splitLines:
ããããããã®ã³ãŒããã©ã°ã¡ã³ããåçšããã°ã©ã ã§äœ¿çšããŠãæ§æãã¡ã€ã«ãèªã¿åããããã°ã©ã ã®è³Œå
¥è
ã«é¢ããæ
å ±ã衚瀺ã§ããŸãããã®å€éšãã¡ã€ã«ã¯ãã©ã€ã»ã³ã¹æ
å ±ãããã°ã©ã ã«å«ããããã«è³Œå
¥æã«çæã§ããŸãã version,1.1 licenseOwner,Hyori Lee licenseKey,M1Tl3PjBWO2CC48m
ããã·ãŒãžã£readCfgAtRuntime
ã¯ãæå®ããããã¡ã€ã«åãéãTable
ãã¢ãžã¥ãŒã«ããæ»ããŸãtables
ãsplitLines
ã¢ãžã¥ãŒã«ããã®æé ã䜿çšããŠããã¡ã€ã«è§£æãè¡ãããŸãïŒãšã©ãŒåŠçãŸãã¯å¢çã±ãŒã¹ãªãïŒstrutils
ãããŸããããªãããšããããããããŸããããã¯ã³ã³ãã€ã«æã«ã³ãŒããå®è¡ããæ¹æ³ã説æãããã®ã§ãããã³ããŒé²æ¢ãé©åã«å®è£
ããæ¹æ³ã説æãããã®ã§ã¯ãªãããšã«æ³šæããŠãã ããããã®ã³ãŒããã³ã³ãã€ã«æé ã®æé ãšããŠå®è£
ãããšããã¡ã€ã«ãåãé€ãããšãã§ããŸãdata.cfg
ãããã§ãªããã°ããã€ããªãšãšãã«é
åžããå¿
èŠããããŸããããã«ãæ
å ±ãæ¬åœã«äžå®ã§ããå Žåãããžãã¯ã®èгç¹ããã¯ãæ
å ±ãå¯å€ã«ä¿ã€ããšã¯æå³ããããŸããã°ããŒãã«å€æ°ãããã宿°ã§ããã°ããè¯ãã§ããæåŸã«ãæã䟡å€ã®ããæ©èœã®1ã€ã¯ãã³ã³ãã€ã«æ®µéã§ããã€ãã®ãã§ãã¯ãå®è£
ã§ããããšã§ããããã¯æ¹åãããåäœãã¹ããšããŠèªèã§ããŸããããã«ãããäœããæ©èœããªããã€ããªãååŸããããšã¯ã§ããŸãããããã«ããã1ã€ã®å°ããªéèŠãªãã¡ã€ã«ã®é害ã®ããã«èµ·åããªãå£ããããã°ã©ã ã®ãŠãŒã¶ãŒãžã®é
ä¿¡ã鲿¢ãããŸãããœãŒã¹ã³ãŒãçæ
ããã°ã©ã ã倿ŽããŠãã³ã³ãã€ã«æ®µéã§çæããããœãŒã¹ã³ãŒããå«ãè¡ãäœæparseStmt
ããmoduleããprocedureã«æž¡ãããã«ããŸãmacros
ã以äžã¯ããã¯ããå®è£
ãã倿ŽããããœãŒã¹ã³ãŒãã§ãã 1 import macros, strutils 2 3 macro readCfgAndBuildSource(cfgFilename: string): stmt = 4 let 5 inputString = slurp(cfgFilename.strVal) 6 var 7 source = "" 8 9 for line in inputString.splitLines: 10
è¯ãããšã¯ãã»ãšãã©äœãå€ãã£ãŠããªãããšã§ãïŒãŸããå
¥åãã©ã¡ãŒã¿ãŒã®åŠçã倿ŽãããŸããïŒ3è¡ç®ïŒãåçããŒãžã§ã³ã§ã¯ãããã·ãŒãžã£readCfgAtRuntime
ã¯æååãã©ã¡ãŒã¿ãåãåããŸãããã ãããã¯ãããŒãžã§ã³ã§ã¯ãæååãšããŠå®£èšãããŠããŸããããã¯ãã®å€éšã€ã³ã¿ãŒãã§ã€ã¹ã®ã¿ã§ãããã¯ããå®è¡ããããšãå®éã«ã¯PNimNode
æååã§ã¯ãªããªããžã§ã¯ããååŸããããã¯ãã«æž¡ãããæååãååŸããããã«strVal
ã¢ãžã¥ãŒã«ããããã·ãŒãžã£ãåŒã³åºãå¿
èŠããããŸãmacros
ïŒ5è¡ç®ïŒã第äºã«ãreadFile
ã¢ãžã¥ãŒã«ããããã·ãŒãžã£ã䜿çšããããšã¯ã§ããŸããsystem
- FFI . ( , FFI), , , , . ,
slurp
system
, (
gorge
, ).
,
Table
ã代ããã«ããœãŒã¹å€æ°ã«NimãœãŒã¹ã³ãŒããçæããŸããæ§æãã¡ã€ã«ã®åè¡ã«å¯ŸããŠã宿°å€æ°ãçæãããŸãïŒ15è¡ç®ïŒãç«¶åãé¿ããããã«ããããã®å€æ°ã®ãã¬ãã£ãã¯ã¹ãä»ããŸããcfg
ãäžè¬ã«ãã³ã³ãã€ã©ã¯ããã¯ãåŒã³åºãè¡ã次ã®ã³ãŒããã©ã°ã¡ã³ãã«çœ®ãæããã ãã§ãã const cfgversion= "1.1" const cfglicenseOwner= "Hyori Lee" const cfglicenseKey= "M1Tl3PjBWO2CC48m"
ããã確èªããã«ã¯ããœãŒã¹ã³ãŒãã®åºåãå«ãè¡ããã¯ãã®æåŸã®ç»é¢ã«è¿œå ããããã°ã©ã ãã³ã³ãã€ã«ããŸãããã1ã€ã®éãã¯ãéåžžã®ããã·ãŒãžã£quit
ãåŒã³åºããŠçµäºããïŒåŒã³åºãããšãã§ããïŒä»£ããã«ããã®ããŒãžã§ã³ãããã·ãŒãžã£ãåŒã³åºãããšã§ãerror
ïŒ14è¡ç®ïŒãæé error
ã¯åãã§ãquit
ããããã«ããšã©ãŒãçºçãããã¡ã€ã«ã®ãœãŒã¹ã³ãŒããšè¡çªå·ã衚瀺ããŸããããã¯ãããã°ã©ããã³ã³ãã€ã«äžã«ãšã©ãŒãèŠã€ããã®ã«åœ¹ç«ã¡ãŸãããã®ç¶æ³ã§ã¯ãåŠçäžã®è¡ã§ã¯ãªãããã¯ããåŒã³åºãè¡ãæãdata.cfg
ããšã«ãªããŸãããããèªåã§å¶åŸ¡ããå¿
èŠããããŸããæåASTçæ
ASTãçæããã«ã¯ãçè«äžãNimã³ã³ãã€ã©ã䜿çšããæ§é ãå®å
šã«ç¥ãå¿
èŠããããŸãmacros
ããããã®æ§é ã¯moduleã«ç€ºãããŠããŸããäžèŠãããã¯å°é£ãªäœæ¥ã®ããã«èŠããŸãããã ãdumpTree
ãåŒã®ãã¯ãã§ã¯ãªããã³ãã³ãã®ãã¯ããšããŠäœ¿çšããããšã«ããããã¯ãã䜿çšã§ããŸããæåã®äžéšãçæãããããšãããã£ãŠããã®ã§const
ãæ¬¡ã®ãœãŒã¹ãã¡ã€ã«ãäœæããŠã³ã³ãã€ã«ããã³ã³ãã€ã©ãæåŸ
ãããã®ã確èªã§ããŸãã import macros dumpTree: const cfgversion: string = "1.1" const cfglicenseOwner= "Hyori Lee" const cfglicenseKey= "M1Tl3PjBWO2CC48m"
ãœãŒã¹ã³ãŒãã®ã³ã³ãã€ã«ããã»ã¹ã§ã¯ã次ã®è¡ã®åºåã衚瀺ãããŸãïŒããã¯ãã¯ããªã®ã§ãã³ã³ãã€ã«ã§ååãªã®ã§ããã€ããªãå®è¡ããå¿
èŠã¯ãããŸããïŒã StmtList ConstSection ConstDef Ident !"cfgversion" Ident !"string" StrLit 1.1 ConstSection ConstDef Ident !"cfglicenseOwner" Empty StrLit Hyori Lee ConstSection ConstDef Ident !"cfglicenseKey" Empty StrLit M1Tl3PjBWO2CC48m
ãã®æ
å ±ã«ãããã³ã³ãã€ã©ãå¿
èŠãšããããŒã¿ããã§ã«ããããçè§£ã§ããŸããã³ãã³ãã®ãªã¹ããçæããå¿
èŠããããŸããåãœãŒã¹ã³ãŒã宿°ã«ã€ããŠãConstSection
ããã³ãçæããConstDef
ãŸããããããã¹ãŠã®å®æ°ãåäžã®ãããã¯ã«è»¢éããå Žåã3ã€ã®åå«ãæã€const
1ã€ã ãã衚瀺ããConstSection
ãŸããæ°ä»ããŠããªããããããŸããããdumpTree
æåã®å®æ°ã䜿çšããäŸã§ã¯ã宿°ã®ã¿ã€ããæç€ºçã«æ±ºå®ããŠããŸããããããæåŸã®2ã€ã®å®æ°ã«åºåããªãŒã«2çªç®ã®åãEmpty
ãããæåã®å®æ°ã«æååèå¥åãããçç±ã§ãããããã£ãŠãäžè¬ã«ãå®çŸ©const
ã¯èå¥åããªãã·ã§ã³ã®ã¿ã€ãïŒç©ºã®ããŒãã®å ŽåããããŸãïŒãããã³å€ã§æ§æãããŸãããã®ç¥èãæŠåšã«ãASTãã«ããã¯ãã®å®æããŒãžã§ã³ãèŠãŠã¿ãŸãããã 1 import macros, strutils 2 3 macro readCfgAndBuildAST(cfgFilename: string): stmt = 4 let 5 inputString = slurp(cfgFilename.strVal) 6 7 result = newNimNode(nnkStmtList) 8 for line in inputString.splitLines: 9
ãœãŒã¹ã³ãŒãçæã®åã®äŸããå§ããã®ã§ããããšã®éãã®ã¿ã«æ³šç®ããŸããäžæçãªå倿°ãäœæããæåã§string
èšè¿°ãããããã«ãœãŒã¹ã³ãŒããæžã蟌ã代ããã«ã倿°ãçŽæ¥äœ¿çšããŠãåå«ãå«ãã³ãã³ããªã¹ãããŒãïŒïŒãäœæããŸãïŒè¡7ïŒãå
¥åè¡ããšã«ã宿°å®çŸ©ïŒïŒãäœæãã宿°ã»ã¯ã·ã§ã³ã§ã©ããããŸãïŒresult
nnkStmtList
nnkConstDef
nnkConstSection
ïŒãããã®å€æ°ãäœæããããšãåã®ASTããªãŒãã³ãã«ç€ºãããŠããããã«ãéå±€çã«ããããåããŸãïŒ17è¡ç®ïŒïŒå®æ°å®çŸ©ã¯ã»ã¯ã·ã§ã³å®çŸ©ã®åå«ã§ãããèå¥åããŒãã空ã®ããŒãïŒã³ã³ãã€ã©ãŒãããã«ããåãæšæž¬ã§ããããã«ããïŒããã³æååãªãã©ã«ãå«ã¿ãŸãå€ããã¯ãäœæã®æåŸã®ãã³ãïŒäœæããASTãæ£åžžã«èŠãããã©ããããããªãå Žåã¯ããã¯ãã䜿çšããŠã¿ãŠãã ããdumpTree
ããã ããäœæãŸãã¯ãããã°ãããã¯ãå
ã§ã¯äœ¿çšã§ããŸããã代ããã«ãçæãããè¡ã衚瀺ããŸãtreeRepr
ããã®äŸã®æåŸã«è¿œå ãããšecho treeRepr(result)
ããã¯ãã䜿çšãããšããšåãåºåã衚瀺ãããŸãdumpTree
ãæåŸã«åŒã³åºããŸã ãªãã·ã§ã³ã§ãåé¡ãçºçããŠãããã¯ãå
ã®ä»»æã®æç¹ã§åŒã³åºãããšãã§ããŸãã