This seemed to be a really cool feature
I’m not sure what you’re referring to? Do you mean the playground in your browser feature?
There was once the command parameter --browser
like in crystal foo.cr --browser
. I don’t know when it was removed, but in 0.5.0 for example it’s still in. And I think it’s really extremely cool (and probably useful, and something I haven’t seen before for any other language).
It showed your code in your browser, with coloured syntax, and you could hover over variables or methods and see their types or could kinda click through where your application would be going (actually, if you don’t know it, I really recommend you, to try it - no need to overwrite your current install, just use the precompiled stuff from github - it’s really nice!)
I think we removed it because it required an http server and we didn’t want to include that in the compiler. Of course then we added the playground anyway, so…
I still don’t know how useful it was. I think it was mainly nice, something to show off, but not very useful.
It definitely works to show off - I was immediately impressed.
I think it could be useful for debugging, or whenever one tries to understand foreign code.
Yes, I saw the introduction of this feature in this blog below written by @asterite
I am wonder why we move this, it should quite useful.
Is there any discuss about why remove this? anyway, web server never be a issue.
When and what would you use it for?
Is there a demo of what this flag did and looked like?
I’d probably use it to examine local shards downloaded in my myproj/lib
directory - I currently use vim for this, but having the typing info would be more helpful than the print-debugging I’m currently doing :)
From the blog post, it sounds like this browser feature would provide type information for everything in the file - could that be exported to another file / structure or something? I’m thinking of a static code analyzer for crystal that goes deeper than just ameba (statically generate control flow graphs, data flow graphs, etc.).
When and what would you use it for?
see the type of variables and navigate methods.
though i don’t know how to check the type of variable on Crystal 0.5.0.
@tsornson , probably --browser is what you want, following code example:
class Foo
def foo
1
end
end
class Bar < Foo
def foo
2
end
end
class Baz < Bar; end
class Qux < Bar; end
case rand
when .> 0.2
obj = Foo.new
when .> 0.4
obj = Bar.new
when .> 0.6
obj = Baz.new
end
Will expanded into this. (Test on Crystal 0.5.0)
you can see the case
statement get expanded, when you click on rand
, new
, will see the source code of them.
But i really don’t know how to print out the type of variable, @asterite , how to do that?
From my point of view, maybe no enough time to improve it, but i consider we don’t need remove it anyway.
Right, but that’s impossible to do with browser
. The way browser
works is:
- you give it an input file
- the tool will type that file and any required files
- the tool will let you navigate only the subset of code that was typed
So to explore a shard you’d have to call every method in the shard with every possible type allowed by the shard.
That’s why I think the tool is a bit useless. It’s much better to use the interpreter for that, as you can play around with the code at the same time.
puts typeof(var)
Yes, interpreter is better, though, maybe still not so stable?
But i really don’t know how to print out the type of variable, @asterite , how to do that?
What I’m asking is, how do I do this when with --browser, assume input file include two variable, x = 100, y = “hello”, if we can see types of both of them when run with --browser?
It probably can’t be done? The tool was removed from the compiler because it was incomplete and unused.
I think it’s better to spend time working on the interpreter instead of the browser.
Yes, interperter mode is more useful anyway. though, i consider the feature click on method name to see the method source code is still really useful when use --browser because we still can’t do it in interpreter mode, right? you know, as $
in Pry.
[1] pry(main)> help $
$ Alias for `show-source`
[2] pry(main)> require 'rbconfig'
false
[3] pry(main)> $ RbConfig.ruby
From: /home/common/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/x86_64-linux/rbconfig.rb:340:
Owner: #<Class:RbConfig>
Visibility: public
Signature: ruby()
Number of lines: 6
def RbConfig.ruby
File.join(
RbConfig::CONFIG["bindir"],
RbConfig::CONFIG["ruby_install_name"] + RbConfig::CONFIG["EXEEXT"]
)
end
[4] pry(main)>
Is it possible to implement this feature in interpreter mode in the future? @asterite
In my view,it partially worked as a language server, except it’s running respectively at a http window. Therefore, I think its functions a still useful, not for showing, but for directing , quering, and linting.
I’ve been writing crystal with few hints and completions. Often I open the docs in browser, peek the methods, and turn back to my editor,write a sentense, and turn again. There are some language servers for crystal(I tried scry and crystallinge), but they just didn’t work well, or misses something. Compilation needs to restart many times because I have to fix a typo or a type mismatch once for each run, before the real compiling starts.
It would be a good relief if I could code with hints, completions and checks. It would be better if these functions get implemented as a language server. After all,nobody knows more about the syntax and standard library than core developers.