Log Simple Types

We compile the code in ./logger/logger.d, using the -unittest flag:

student@dss:~/.../lab-06/logger$ make
dmd -unittest logger.d
logger.d(24): Error: function `logger.log(string str, LogLevel level, string file)` is not callable using argument types `(string)`
logger.d(24):        too few arguments, expected `3`, got `1`
make: *** [Makefile:7: logger] Error 1

The error says the function call does not match the signature. Fix this by using the LogLevel enum so that the code compiles and the unittest passes. You can use a default value for the file parameter. In D, you can use the __FILE__ special variable to obtain the name of the file, just like in C.

Recap: UFCS

Remember UFCS from session 1. UFCS stands for Uniform Function Call Syntax and allows us to call function foo either as foo(a) or as a.foo(). This feature makes code far more expressive. To see the difference, compare:

to!string(value);

to

value.to!string;

Functionality-wise, the two snippets are equivalent. And yes, the parentheses are optional when calling a function without parameters.

Use UFCS when calling std.conv.to and the log functions you’re implementing.

Logger

Add log functions for:

  • bool
  • int
  • long
  • float
  • double

Hint: Use std.conv.to to convert numeric types to strings.

Write unittests for the new log functions.