Is it possible to use templates to implement something like the `@show` macro from the Julia programming langauge in D?
WraithGlade
anonymous at noreply.com
Sun Sep 8 22:01:10 UTC 2024
Hello everyone! This is my first post in these forums.
D is an interesting language (basically a saner C++, which is a
nice prospect because I've used C++ working in the game industry
in the past) and I've been considering using it and may still do
so.
However, there is a very basic debugging feature that I've always
thought all programming languages should have (because it is so
useful and yet also trivial to implement and inherently harmless)
but which a surprisingly large number of languages don't support:
Specifically, I want a way to create a print command that behaves
like `@show` from Julia lang or `dump` from (if my memory is
correct) Nim.
Basically, I want there to be a way to print both an expression
and its value but to only have to write the expression once
(which also aids refactoring). Such a feature is extremely useful
for faster print-based debugging.
Thus, instead of having to write something like this:
```
writeln("1 + 2 == ", 1 + 2);
```
I want to just be able to write this:
```
show!(1 + 2)
```
... and here is the closest I've been able to get in D, after
roughly a dozen attempts:
```
import std.stdio;
void show(alias expr)()
{
writeln(expr.stringof, " == ", expr);
//https://ddili.org/ders/d.en/templates_more.html
//says that `alias` allows "any expression" but in
//reality the expression gets evaluated and hence
//information about what it really was is lost.
}
void main()
{
show!(1 + 2);
//I want this to print "1 + 2 == 3",
//but instead it prints "3 == 3"
const x = 1 + 2;
show!(x);
//This at least prints "x == 3" though.
}
```
See the comments in the above code for info on what it does
versus what I want it to do.
Usually I prefer `assert` whenever I actually know what the
values of something are, but there are many cases where I don't
know what the values are and want to see easily.
**This feature is a great litmus test for how expressive a
language actually is.** Indeed, it is one of the best simple
litmus tests for programming language design that I've found. It
is trivial yet speaks volumes of the thought that has gone into
the design of any language.
Even $5 solar-powered desktop calculators often leave the
expression of what you write *still visible* after you've
computed it, yet many programming languages don't even provide a
way of eliminating this extremely common form of redundancy and
require duplicated typing in strings repeatedly.
One would think that more programming languages would account for
this when you consider that much of the *whole purpose* of
programming languages is enabling the user to get computed values
evaluated and displayed as easily and pragmatically as
possible... yet so many languages can't even do the above despite
it being one of the most obvious ergonomic factors one could ever
have for anything that is used for computation. That is why the
absence of it in any language annoys me so much. The lack of it
is an absurdity, essentially, if you think about it from first
principles and user experience.
On the other hand, I am aware that macros make control flow
harder to follow, but to counter that: String-generating macros
that aid debugging are an inherently harmless subset of macros.
They only make it easier to debug and display diagnostics.
There's nothing about the `show` macro (or similar
passive-information constructs) conceptually that harms
comprehensibility of code.
I've for years thought it would be nice to have a language that
lacks the more extreme macros but still has the ability to
implement things like the `show` macro.
Is D such a language? Is there any way to implement what I want
(as above)?
The frustration with trying to get this working makes me consider
just using Nim instead, which has extremely flexible macros and
can do this easily.
I personally believe that all languages should have this, even if
they have to make a one-time exception to allow just the `show`
macro but not other macros.
Why should merely displaying the correspondence between
expressions and their outputs be hard or impossible in so many
languages? Think about it. It is bizarre that it is so often
absent.
If D can't do this currently then I suggest that it be made to be
capable of it. This kind of macro is not like other macros.
Debugging and diagnostic pragmatism doesn't confound program
logic, unlike how esoteric macros often do.
Anyway, thank you for reading and sorry for my verbosity. This is
one of my biggest pet peeves regarding programming language
design.
More information about the Digitalmars-d-learn
mailing list