Dylan looks very interesting but it is not even among TIOBE's top 100 languages.
It's somewhat close to death :-(
In the mid to late 90s there were three major implementations:
1) Apple for MacOS. They went so far as announcing at WWDC that they were replacing C++ with Dylan throughout their code, and handing out CDs with a beta version of an IDE and compiler. Sadly, Dylan was one of the first things to get "Steve'd" when Apple was (for other reasons) losing billions of dollars per quarter and couldn't afford long term projects, no matter how promising.
2) CMU for Unix, specifically HP-UX. (PA-RISC "Snakes" was the best CPU around at the time)
3) Harlequin, a commercial vendor of Lisp, Smalltalk, Standard ML (and Haskell?), for Windows.
By 1998 the CMU people had graduated and moved on to other things. Fortunately they officially open-sourced (MIT license) what they had done, and I became part of a group (Dylan Hackers) that picked up and continued their work. Their compiler, "d2c", is as the name suggests a compiler that outputs very ASM-like C code. We very quickly ported it to work on x86 and PowerPC Linux, and to MacOS. It's very portable, I've used it myself on SPARC and MIPS and RISC-V.
d2c is still my favourite, because it is easy to interface to C (it generates C!), and its object representation doesn't steal any bits from machine pointers or integers, or float/double.
In 1999 Harlequin was bought by Global Graphics, who wanted them only for their PostScript interpreter. They shut down or spun off everything else. The Harlequin Dylan team managed to get the rights to the Windows IDE and compiler and libraries which, at the time, had something like 100 person-years of work in it (30 years in the "MPS" memory-manager / garbage collector alone). They formed a company, Functional Objects, and released Functional Developer (for Windows) in 2000. At first they were trying to sell it, and then later made it free and tried to make money with consulting and support. Eventually they simply turned all the code and rights over to the Dylan Hackers open source project, where it became the main focus of work.
Activity has trailed off, and I stopped being heavily involved when I switched my attention to RISC-V. But there continue to be releases with the most recent one being at the end of 2020. OpenDylan (nee Harlequin Dylan, nee Functional Developer) has gained an LLVM back end instead of x86 Windows native code generator, and from LLVM you can output webasm if you want.
You can actually play with Dylan in your web browser:
https://play.opendylan.org/Try the following:
define method fib (n :: <integer>)
if (n < 2) n else fib(n - 1) + fib(n - 2) end
end;
format-out("%d", fib(39));
For me that takes 1.47 seconds to compile and run and output 63245986. (I usually use fib(40) for benchmarks, but there seems to be a maximum CPU usage on the web server)
The equivalent Python takes 15.8 seconds on my M1 Mac. In C compile and run takes 0.53 with -O0 or 0.40 with -O2.
I don't actually know what server the Dylan playground is running on, but clearly it's closer to C than to Python.
You can make the Dylan code equivalent to Python by removing the type declaration on the function argument.
define method fib (n)
if (n < 2) n else fib(n - 1) + fib(n - 2) end
end;
This makes it run more slowly. Sadly, the Playground time limit makes me drop it to fib(37), which prints 24157817 in 1.3 seconds. Python on my M1 Mac uses 6.4 seconds for that, C 0.26 (compile AND run).
A local install of OpenDylan will of course run faster and not have the CPU time limit!
Dylan, alone of these languages (but like Common Lisp or Julia), lets you write this function in a completely different way:
define method fib (n == 0) 0 end;
define method fib (n == 1) 1 end;
define method fib (n)
fib(n - 1) + fib(n - 2)
end;
The online playground runs this for fib(37) in 1.3 seconds -- no detectable speed difference at all for the abstraction.
But now Dylan has another trick!
define open generic fib(n);
define method fib (n == 0) 0 end;
define method fib (n == 1) 1 end;
define method fib (n)
let res = fib(n - 1) + fib(n - 2);
add-method(fib, method(n == n) res end);
res
end;
format-out("%d", fib(37));
This still outputs fib(37) = 24157817 in 1.3 seconds.
BUT ... now we can do fib(89) = 1779979416004714189 in still 1.3 seconds.
Try that with the recursive C or Python code and you'll be there a very very long time. I've tried to estimate, and I think the C code (with -O2) would take about 350 years.