Most active commenters

    ←back to thread

    Things Zig comptime won't do

    (matklad.github.io)
    458 points JadedBlueEyes | 12 comments | | HN request time: 0.549s | source | bottom
    Show context
    pron ◴[] No.43745438[source]
    Yes!

    To me, the uniqueness of Zig's comptime is a combination of two things:

    1. comtpime replaces many other features that would be specialised in other languages with or without rich compile-time (or runtime) metaprogramming, and

    2. comptime is referentially transparent [1], that makes it strictly "weaker" than AST macros, but simpler to understand; what's surprising is just how capable you can be with a comptime mechanism with access to introspection yet without the referentially opaque power of macros.

    These two give Zig a unique combination of simplicity and power. We're used to seeing things like that in Scheme and other Lisps, but the approach in Zig is very different. The outcome isn't as general as in Lisp, but it's powerful enough while keeping code easier to understand.

    You can like it or not, but it is very interesting and very novel (the novelty isn't in the feature itself, but in the place it has in the language). Languages with a novel design and approach that you can learn in a couple of days are quite rare.

    [1]: In short, this means that you get no access to names or expressions, only the values they yield.

    replies(7): >>43745704 #>>43745928 #>>43746682 #>>43747113 #>>43747250 #>>43749014 #>>43749546 #
    1. User23 ◴[] No.43745704[source]
    Has anyone grafted Zig style macros into Common Lisp?
    replies(4): >>43745832 #>>43745860 #>>43746089 #>>43753782 #
    2. toxik ◴[] No.43745832[source]
    Isn’t this kind of thing sort of the default thing in Lisp? Code is data so you can transform it.
    replies(2): >>43746555 #>>43747714 #
    3. Zambyte ◴[] No.43745860[source]
    There isn't really as clear of a distinction between "runtime" and "compile time" in Lisp. The comptime keyword is essentially just the opposite of quote in Lisp. Instead of using comptime to say what should be evaluated early, you use quote to say what should be evaluated later. Adding comptime to Lisp would be weird (though obviously not impossible, because it's Lisp), because that is essentially the default for expressions.
    replies(1): >>43746099 #
    4. Conscat ◴[] No.43746089[source]
    The Scopes language might be similar to what you're asking about. Its notion of "spices" which complement the "sugars" feature is a similar kind of constant evaluation. It's not a Common Lisp dialect, though, but it is sexp based.
    5. Conscat ◴[] No.43746099[source]
    The truth of this varies between Lisp based languages.
    6. fn-mote ◴[] No.43746555[source]
    There are no limitations on the transformations in lisp. That can make macros very hard to understand. And hard for later program transformers to deal with.

    The innovation in Zig is the restrictions that limit the power of macros.

    7. TinkersW ◴[] No.43747714[source]
    Lisp is so powerful, but without static types you can't even do basic stuff like overloading, and have to invent a way to even check the type(for custom types) so you can branch on type.
    replies(3): >>43747885 #>>43748318 #>>43749199 #
    8. dokyun ◴[] No.43747885{3}[source]
    > Lisp is so powerful, but <tired old shit from someone who's never used Lisp>.

    You use defmethod for overloading. Types check themselves.

    replies(1): >>43751628 #
    9. wild_egg ◴[] No.43748318{3}[source]
    > but without static types

    So add static types.

    https://github.com/coalton-lang/coalton

    10. pjmlp ◴[] No.43749199{3}[source]
    No need for overloading when you have CLOS and multi-method dispatch.
    11. User23 ◴[] No.43751628{4}[source]
    And a modern compiler will jmp past the type checks if the inferencer OKs it!
    12. pron ◴[] No.43753782[source]
    That wouldn't be very meaningful. The semantics of Zig's comptime is more like that of subroutines in a dynamic language - say, JavaScript functions - than that of macros. The point is that it's executed, and yields errors, at a different phase, i.e. compile time.