sigmaSd / IRust

Cross Platform Rust Repl
https://crates.io/crates/irust
MIT License
605 stars 33 forks source link

[Feature Request]: Support for `proc_macro` APIs #85

Open AZMCode opened 3 years ago

AZMCode commented 3 years ago

Recently I've been trying to test some ideas for a proc_macro crate I'm building, and despite being able to load the proc_macro crate through the extern crate proc_macro, access to proc_macro APIs is followed by this error:

Out: thread 'main' panicked at 'procedural macro API is used outside of a procedural macro'

Perhaps there could be a command to enable or disable these APIs?

sigmaSd commented 3 years ago

Good idea! I'm definitely interested in this, I'll try implementing this

sigmaSd commented 3 years ago

I implemented the idea, but after testing it, it feels underwhelming since proc-macro are compile-time you can't really interact with them in the repl. You can test the code here https://github.com/sigmaSd/IRust/commit/0617d14b507e4ee102d58de919604ebc672f2ecd . The idea was to enable proc macros with :proc_macro and to switch between writing to main.rs and lib.rs using :file {file}

Like I said trying it out in practice its doesn't feel really interesting, on the other hand I want to mention you can already interact with proc macros crate using irust in a different way:

Any change made to the crate will be immediately reflected, which I think has some of the advantages of supporting procmacros

Here is a demo

https://user-images.githubusercontent.com/22427111/128920846-d916f550-a226-4ab6-9954-46cb68391f06.mp4

One thing I noticed, is dbg! in proc-macros only appears if the compilation is not successful, I think that something that can be improved on.

AZMCode commented 3 years ago

Wait wait, I think we might be talking about different things here. What I at least intended to suggest in this specific issue was the ability to use the proc_macro API in irust (TokenStream, TokenTree, etc) to test out code for later use within a proc_macro crate. At least I tested the new version and had no luck getting it to work.

In any case, I'm not sure I fully understand the changes you've done. I tried doing the process enabling the proc_macro flag first, and no dice.

Here's an asciinema clip to show what i mean. In case you wonder what ./new_irust is, it's just a symlink to the compiled version of the commit you sent. In any case, very much thanks for the lightning fast response and enthusiasm!

sigmaSd commented 3 years ago

Here is how you can use the new commit

https://user-images.githubusercontent.com/22427111/128981841-7d69e1d6-5d40-4390-96af-c83efbfb1b0d.mp4

(note: to be able to write #[proc_macro]fn ... -> after writing #[proc_macro] you can use alt+enter to add a new line instead of evaluating the input)

But I see what you're trying to do, It would be nice if there was an ergonomic way to call proc_macros apis

sigmaSd commented 3 years ago

Think this is a way to achieve what you want https://github.com/sigmaSd/procmacro/blob/master/src/main.rs

https://user-images.githubusercontent.com/22427111/128991190-dd99dbae-20be-441e-8cf0-3189b20a651b.mp4

AZMCode commented 3 years ago

Cool! Do I close the issue or do you wish to keep improving the feature?

sigmaSd commented 3 years ago

I prefer to keep the issue open till I figure it out, thanks!