Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Nim macro parameters

here' a code I want to compile:

macro defineSomething(amount:expr):stmt=
   var amountInt = intVal(amount).int
   # Boring staff

defineSomething(42);

It works perfectly. I have all I want inside my macro I can operate staff in my own way.

But then I think, that, It would be better to remove magic number to some const settings:

const MAGIC_AMOUNT:int = 42

# Whole lot of strings
defineSomething(MAGIC_AMOUNT)

This code fails. Because MAGIC_AMOUNT literally is not integer value unlike 42 magic number.

So, how to get my variable value inside the macros in nim?

like image 221
Vasiliy Stavenko Avatar asked Apr 22 '26 20:04

Vasiliy Stavenko


2 Answers

By default, macros will receive AST expressions and not values. If your macro needs to work with concrete values, you need to use static parameters:

macro defineSomething(amount: static[int]): stmt=
  echo "int value: ", amount + 100

const MAGIC_AMOUNT = 42

defineSomething(43)
defineSomething(MAGIC_AMOUNT)

This will print at compile-time:

int value: 143
int value: 142
like image 196
zah Avatar answered Apr 24 '26 11:04

zah


Expressions are untyped. Since you really want to get integers you can specify the parameter to be typed and then this should compile:

import macros

macro defineSomething(amount: typed):stmt=
  echo getType(amount)
  var amountInt = intVal(amount).int
  echo "Hey ", amount_int

const MAGIC_AMOUNT = 42
defineSomething(43)
defineSomething(MAGIC_AMOUNT)

Or just use a normal int as the parameter type unless you want to be passed other types as well to case on the parameter's kind inside your macro.

like image 35
Grzegorz Adam Hankiewicz Avatar answered Apr 24 '26 09:04

Grzegorz Adam Hankiewicz



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!