crystal-libraries-needed
crystal-libraries-needed copied to clipboard
Pry for Crystal
ICR exists. There's obviously some differences since crystal is a compiled language. I don't think it lets you use vim inside of it like pry.
Honestly, I'd be happy with it if I could view source code or documentation for a class/module/method. Being able to "cd" into a construct (whether class or instantiated object) is incredibly helpful when debugging.
I actually started working on a way to do this in ICR. The libreadline library actually has a lot of really useful features that would help us to achieve this. Also, somehow integrating lldb would as well. The issue with the readline is that it's lacking in crystal. I made an issue for one part https://github.com/crystal-lang/crystal/issues/4067 which is macOS related, but that prevents me from moving forward.
I'd like to tackle this again if anyone wants to jump on board with me!
That would be cool. If I remember from the issue though they claim it's related to the library for ReadLine in C rather than Crystal
On May 19, 2017 5:43 PM, "Jeremy Woertink" [email protected] wrote:
I actually started working on a way to do this in ICR. The libreadline library actually has a lot of really useful features that would help us to achieve this. Also, somehow integrating lldb would as well. The issue with the readline is that it's lacking in crystal. I made an issue for one part crystal-lang/crystal#4067 https://github.com/crystal-lang/crystal/issues/4067 which is macOS related, but that prevents me from moving forward.
I'd like to tackle this again if anyone wants to jump on board with me!
— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/johnjansen/crystal-libraries-needed/issues/17#issuecomment-302834222, or mute the thread https://github.com/notifications/unsubscribe-auth/AAHmpFAivxUM9mGPBU1xQ2492DV4wy-Sks5r7ikkgaJpZM4NblLj .
Yeah, that's what they say; however, similar code runs in other languages. I don't think it's a readline issue, but I don't know the library well enough to be 100% sure.
@elorest For example Haskell is compiled too and there is really pretty interactive env for that. What is different from Crystal?
@schovi GHC for Haskell has two modes, compiled and interpreted. runghc
and ghci
use the latter.
@citizen428 thanks for explanation!
@jwoertink You could try using fancyline instead of libreadline.
AFAIK readline
(or fancyline
) allows you to only interrupt execution and read/evaluate an interactive command (aka repl). binding.pry
in ruby is much more than just readline
. Let's look at the example:
require 'pry'
class A
end
def ruby_method1
end
def ruby_method2(a, b)
binding.pry # <--- execution stopped here
end
ruby_method2 3, "a"
[1] pry(main)> a
=> 3
[2] pry(main)> b
=> "a"
[3] pry(main)> A.new
=> #<A:0x007f93e06910d8>
[4] pry(main)> ruby_method1
=> nil
[5] pry(main)> c
NameError: undefined local variable or method `c' for main:Object
from (pry):7:in `ruby_method2'
here pry
knows the execution context it is running in, so it can show you the values of method args, create an instance of available class A
and call a method. Also, it knows that there is no var c
, for example. This is achieved by the Binding
class in ruby:
Objects of class Binding encapsulate the execution context at some particular place in the code and retain this context for future use. The variables, methods, value of self, and possibly an iterator block that can be accessed in this context are all retained. Binding objects can be created using Kernel#binding, and are made available to the callback of Kernel#set_trace_func.
If we could have something similar in Crystal, it would be really easy to implement analog of binding.pry
. Take a look at the first pry's release in ruby: https://github.com/pry/pry/blob/4fcf81b97601945945f43311532c164a93b44d7c/lib/pry.rb
But creating Binding
may look like a challenge for Crystal...
I once built a proof of concept for C++ to make this possible: https://github.com/inspector-repl/inspector
I made a pure crystal library that doesn't rely on readline called Term::Reader if anyone would like to use that for something like this. Not sure about the rest of the pry
functionality though.
I made a pure crystal library that doesn't rely on readline called Term::Reader if anyone would like to use that for something like this. Not sure about the rest of the
pry
functionality though.
@watzon that's completely off-topic