Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

> What if our macro read the source file?

> Like, actually went to the file system, opened a file, and read its content? We already have the file name conveniently stored in file, and luckily Clojure keeps sources around.

> So this is what I ended up with:

> (defn slurp-source [file key]

Looks like a function to me (which is good).



it can't be a function because the source is only guaranteed to be available at compile time, rather than at runtime.


It's reading code from a file, which you can make arrangements for to be there at any time you want.

Files are not directly relevant to macros.

The code that a macro invocation has access to by design is the datum which comprises that invocation itself. That may have come from an expression in a file, and may be annotated in some way with the location info. Other than that, macros do not necessarily have access to their textual source code. No such thing necessarily exists because macros can be invoked by code that was generated (possibly by other macros or in other ways) and so never existed as characters in a file.

I don't have a clear picture of the architecture of the system that the article refers to, but the author presents, as his end result, a defn form, which defines a function and not a macro.

If a macro is needed to get that function to be called at compile time, that would be a minor hooking detail, and not an instance of a macro being used to perpetrate a complex code transformation. The function just needs a file name and a string.

(It looks as if the author's system may be interactive; the code files are there all the time and can be changed, and he wants the view of the files to refresh?)


It could be a helper-function which gets called by a macro expansion at compile-time. One would define the feature as a function which is available at compile-time and the macro calls it during expansion.


A macro is a perfectly normal function. It's simply called at compile time, with its contents as its argument.


no you're misunderstanding me.

I'm saying that the macro's purpose is to read the source file and produce something at compile time. It's not a "normal" (read: runtime) function, as this feature cannot be implemented using a function that only executes at runtime.


Sure, but the macro function is a normal function - it has inputs, outputs, and (preferably) should be pure. There's nothing special about the macro function itself, really.

You can see it explicitly in Common Lisp, where you can easily access and replace a macro-function with a custom one that you DEFUN yourself, like this.

    CL-USER> (defun my-quote-fn (form env)
               (declare (ignore env))
               (destructuring-bind (operator &rest body) form
                 (assert (eq operator 'my-quote))
                 (list* 'quote body)))
    MY-QUOTE-FN
It's a perfectly normal function, I can call it right away:

    CL-USER> (my-quote-fn '(my-quote (+ 2 2)) nil)
    '(+ 2 2)
I can also tell the compiler that this perfectly normal function is a macro function...

    CL-USER> (setf (macro-function 'my-quote) #'my-quote-fn)
    #<FUNCTION MY-QUOTE-FN>
...and the compiler will start using it to expand macros:

    CL-USER> (macroexpand-1 '(my-quote (+ 2 2)))
    '(+ 2 2)
    T
What is special about macros, and what you describe as the "feature that cannot be implemented", is the language's ability to call that function at compilation time and feed its output back into the compiler. This is the link that is missing in most programming languages.


> call that function at compilation time

that's why it's called a macro and not a function. You're using the word function in the mathematical sense, and not in the lisp sense.


The irrefutable fact is that the author presents the core logic of the file-reading solution as a defn, not a defmacro. It may be driven by a macro, but evidently that part is not noteworthy enough to be presented.


I mean, sorta, but Lisp macro writers learn early on that macros are also functions, it's just they operate on a list of symbols, and are called in a different phase.

So saying "it can't be a function" doesn't ring true, either.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: