rabbit-slide-aycabta-rubykaigi-2018 2018.6.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rabbit +1 -0
- data/README.rd +6 -0
- data/Rakefile +16 -0
- data/asakusarb.jpg +0 -0
- data/asakusarb.png +0 -0
- data/bonfire.jpg +0 -0
- data/config.yaml +15 -0
- data/gorge_0.jpg +0 -0
- data/gorge_1.jpg +0 -0
- data/irb-reboot.rab +739 -0
- data/locmap.gif +0 -0
- data/locmap_venue.png +0 -0
- data/pdf/rubykaigi-2018-irb-reboot.pdf +0 -0
- data/rabbit-slide-kou-rubykaigi-2018-2018.6.1.3/images/bindings-by-gobject-introspection.svg +499 -0
- data/rabbit-slide-kou-rubykaigi-2018-2018.6.1.3/images/bindings-by-swig.svg +273 -0
- data/rabbit-slide-kou-rubykaigi-2018-2018.6.1.3/images/cairo-gc-trigger.pdf +0 -0
- data/rabbit-slide-kou-rubykaigi-2018-2018.6.1.3/images/cairo-no-gc-trigger.pdf +0 -0
- data/rabbit-slide-kou-rubykaigi-2018-2018.6.1.3/images/clear-code-rubykaigi-2018-silver-sponsor.png +0 -0
- data/rabbit-slide-kou-rubykaigi-2018-2018.6.1.3/images/code-party.png +0 -0
- data/rabbit-slide-kou-rubykaigi-2018-2018.6.1.3/images/csv-arrow-parquet.pdf +0 -0
- data/rabbit-slide-kou-rubykaigi-2018-2018.6.1.3/images/csv-arrow.pdf +0 -0
- data/rabbit-slide-kou-rubykaigi-2018-2018.6.1.3/images/jekyll-task-i18n-red-data-tools.gif +0 -0
- data/rabbit-slide-kou-rubykaigi-2018-2018.6.1.3/images/pdf-clickable.png +0 -0
- data/rabbit-slide-kou-rubykaigi-2018-2018.6.1.3/images/rabbit-slide-show.png +0 -0
- data/rabbit-slide-kou-rubykaigi-2018-2018.6.1.3/images/ruby-gtk3-with-ruby-gi.svg +411 -0
- data/rabbit-slide-kou-rubykaigi-2018-2018.6.1.3/images/ruby-gtk3-without-ruby-gi.svg +313 -0
- data/rabbit-slide-kou-rubykaigi-2018-2018.6.1.3/images/rubykaigi-2017-extension-by-cpp-title.pdf +1853 -4
- data/rabbit-slide-kou-rubykaigi-2018-2018.6.1.3/images/rurema-search.png +0 -0
- data/rabbit-slide-kou-rubykaigi-2018-2018.6.1.3/images/shocker.jpeg +0 -0
- data/rabbit-slide-kou-rubykaigi-2018-2018.6.1.3/images/the-tortoise-and-the-hare-fast.png +0 -0
- data/rabbit-slide-kou-rubykaigi-2018-2018.6.1.3/images/the-tortoise-and-the-hare-good.png +0 -0
- data/rabbit-slide-kou-rubykaigi-2018-2018.6.1.3/images/the-tortoise-and-the-hare-hare.png +0 -0
- data/rabbit-slide-kou-rubykaigi-2018-2018.6.1.3/images/the-tortoise-and-the-hare-raw.png +0 -0
- data/rabbit-slide-kou-rubykaigi-2018-2018.6.1.3/images/the-tortoise-and-the-hare-slow.png +0 -0
- data/rabbit-slide-kou-rubykaigi-2018-2018.6.1.3/images/the-tortoise-and-the-hare-tortoise.png +0 -0
- data/rabbit-slide-kou-rubykaigi-2018-2018.6.1.3/images/the-tortoise-and-the-hare.gif +0 -0
- data/rabbit-slide-kou-rubykaigi-2018-2018.6.1.3/images/the-tortoise-and-the-hare.png +0 -0
- data/rabbit-slide-kou-rubykaigi-2018-2018.6.1.3/pdf/rubykaigi-2018-my-way-with-ruby.pdf +0 -0
- data/space-pirates-logo.svg +51 -0
- data/theme.rb +77 -0
- data/usa1.png +0 -0
- data/waterfall_0.jpg +0 -0
- data/waterfall_1.jpg +0 -0
- metadata +101 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 5228b727f9e4e25a11e83df75ed476eb9d2cc5687538a71574577e42c72bc931
|
4
|
+
data.tar.gz: 5321d8bee33e4e3a78370a9edd118301c38b2291fd07d3da031a1fa78b75a2b5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 613eeb0b65cce0c5ddacd51c2f553b97d2ea278b57893c4f8ecb29c3e22ac28394fc88de570c6dc7addee9934f81f9cb82211f6ae7bc3e3afa4ac254d903b2d8
|
7
|
+
data.tar.gz: d94553ed44ff44830cb15d76e3f9ea5db40ca576f1a61194413eb922340bd43ab0f07cd584866914158d184f637e158a9a29695ab2cfb2654f841125ee5a515b
|
data/.rabbit
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
irb-reboot.rab
|
data/README.rd
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require "rabbit/task/slide"
|
2
|
+
|
3
|
+
# Edit ./config.yaml to customize meta data
|
4
|
+
|
5
|
+
spec = nil
|
6
|
+
Rabbit::Task::Slide.new do |task|
|
7
|
+
spec = task.spec
|
8
|
+
# spec.files += Dir.glob("doc/**/*.*")
|
9
|
+
# spec.files -= Dir.glob("private/**/*.*")
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "Tag #{spec.version}"
|
13
|
+
task :tag do
|
14
|
+
sh("git", "tag", "-a", spec.version.to_s, "-m", "Publish #{spec.version}")
|
15
|
+
sh("git", "push", "--tags")
|
16
|
+
end
|
data/asakusarb.jpg
ADDED
Binary file
|
data/asakusarb.png
ADDED
Binary file
|
data/bonfire.jpg
ADDED
Binary file
|
data/config.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
id: rubykaigi-2018
|
3
|
+
base_name: irb-reboot
|
4
|
+
tags:
|
5
|
+
- rabbit
|
6
|
+
- rubykaigi
|
7
|
+
presentation_date: 2018-06-02
|
8
|
+
version: 2018.6.2.0
|
9
|
+
licenses:
|
10
|
+
- CC-BY-SA-4.0
|
11
|
+
author:
|
12
|
+
markup_language: :rd
|
13
|
+
name: ITOYANAGI Sakura
|
14
|
+
email: aycabta@gmail.com
|
15
|
+
rubygems_user: aycabta
|
data/gorge_0.jpg
ADDED
Binary file
|
data/gorge_1.jpg
ADDED
Binary file
|
data/irb-reboot.rab
ADDED
@@ -0,0 +1,739 @@
|
|
1
|
+
= IRB Reboot:\nModernize Implementation and Features
|
2
|
+
|
3
|
+
:author
|
4
|
+
ITOYANAGI Sakura
|
5
|
+
:theme
|
6
|
+
.
|
7
|
+
:allotted-time
|
8
|
+
38m
|
9
|
+
: content-source
|
10
|
+
RubyKaigi 2018
|
11
|
+
|
12
|
+
= Greeting
|
13
|
+
|
14
|
+
1st day's morning,
|
15
|
+
|
16
|
+
it was cloudy.
|
17
|
+
|
18
|
+
= Greeting
|
19
|
+
|
20
|
+
2nd day's morning,
|
21
|
+
|
22
|
+
it was rainy.
|
23
|
+
|
24
|
+
= Greeting
|
25
|
+
|
26
|
+
But today...
|
27
|
+
|
28
|
+
= Greeting
|
29
|
+
|
30
|
+
It's a beautiful day outside.
|
31
|
+
|
32
|
+
= Greeting
|
33
|
+
|
34
|
+
Birds are singing, flowers are blooming...
|
35
|
+
|
36
|
+
= Greeting
|
37
|
+
|
38
|
+
On days like these...
|
39
|
+
|
40
|
+
= IRB Reboot:\nModernize Implementation and Features
|
41
|
+
|
42
|
+
= Let me introduce myself
|
43
|
+
|
44
|
+
:name
|
45
|
+
ITOYANAGI Sakura
|
46
|
+
:GitHub
|
47
|
+
aycabta
|
48
|
+
:maintainer
|
49
|
+
RDoc
|
50
|
+
|
51
|
+
= Community: Asakusa.rb
|
52
|
+
|
53
|
+
# image
|
54
|
+
# src = asakusarb.jpg
|
55
|
+
# relative-height = 80
|
56
|
+
# caption = Asakusa.rb every Ruby Tuesday
|
57
|
+
# relative-padding-top = 0
|
58
|
+
# relative-padding-bottom = 0
|
59
|
+
# relative-padding-right = 0
|
60
|
+
# relative-padding-left = 0
|
61
|
+
|
62
|
+
= Company:\nSpace Pirates, LLC.
|
63
|
+
|
64
|
+
# image
|
65
|
+
# src = space-pirates-logo.svg
|
66
|
+
# relative-height = 80
|
67
|
+
# caption = Space Pirates, LLC.
|
68
|
+
# relative-padding-top = 0
|
69
|
+
# relative-padding-bottom = 0
|
70
|
+
# relative-padding-right = 0
|
71
|
+
# relative-padding-left = 0
|
72
|
+
|
73
|
+
= Hobby: Climbing
|
74
|
+
|
75
|
+
I planed to climb Mt. Zao, it's the highest mountain in Miyagi. The highest mountain is the nearest place to space. It fits for Space Pirates.
|
76
|
+
|
77
|
+
= Hobby: Climbing
|
78
|
+
|
79
|
+
But it's so far from this venue, so I went to ((*gorge*)) near here.
|
80
|
+
|
81
|
+
= Hobby: Climbing
|
82
|
+
|
83
|
+
The ((*gorge*)) means narrow river between escarpments.
|
84
|
+
|
85
|
+
= Hobby: Climbing
|
86
|
+
|
87
|
+
The Tohoku University official web site provides digging points map for fossils.
|
88
|
+
|
89
|
+
= Hobby: Climbing
|
90
|
+
|
91
|
+
# image
|
92
|
+
# src = locmap.gif
|
93
|
+
# relative-height = 75
|
94
|
+
# caption = http://www.museum.tohoku.ac.jp/exhibition_info/mini/fosss/locality/locmap.html
|
95
|
+
# relative-padding-top = 0
|
96
|
+
# relative-padding-bottom = 0
|
97
|
+
# relative-padding-right = 0
|
98
|
+
# relative-padding-left = 0
|
99
|
+
|
100
|
+
= Hobby: Climbing
|
101
|
+
|
102
|
+
# image
|
103
|
+
# src = locmap.gif
|
104
|
+
# relative-height = 75
|
105
|
+
# caption = A dozen pink points are fossils digging points.
|
106
|
+
# relative-padding-top = 0
|
107
|
+
# relative-padding-bottom = 0
|
108
|
+
# relative-padding-right = 0
|
109
|
+
# relative-padding-left = 0
|
110
|
+
|
111
|
+
= Hobby: Climbing
|
112
|
+
|
113
|
+
# image
|
114
|
+
# src = locmap_venue.png
|
115
|
+
# relative-height = 75
|
116
|
+
# caption = This venue is hemmed in by many fossils digging points.
|
117
|
+
# relative-padding-top = 0
|
118
|
+
# relative-padding-bottom = 0
|
119
|
+
# relative-padding-right = 0
|
120
|
+
# relative-padding-left = 0
|
121
|
+
|
122
|
+
= Hobby: Climbing
|
123
|
+
|
124
|
+
I went to some digging points.
|
125
|
+
|
126
|
+
= Hobby: Climbing
|
127
|
+
|
128
|
+
# image
|
129
|
+
# src = waterfall_0.jpg
|
130
|
+
# relative-height = 90
|
131
|
+
# caption = Waterfall
|
132
|
+
# relative-padding-top = 0
|
133
|
+
# relative-padding-bottom = 0
|
134
|
+
# relative-padding-right = 0
|
135
|
+
# relative-padding-left = 0
|
136
|
+
|
137
|
+
= Hobby: Climbing
|
138
|
+
|
139
|
+
# image
|
140
|
+
# src = waterfall_1.jpg
|
141
|
+
# relative-height = 90
|
142
|
+
# caption = Waterfall
|
143
|
+
# relative-padding-top = 0
|
144
|
+
# relative-padding-bottom = 0
|
145
|
+
# relative-padding-right = 0
|
146
|
+
# relative-padding-left = 0
|
147
|
+
|
148
|
+
= Hobby: Climbing
|
149
|
+
|
150
|
+
# image
|
151
|
+
# src = gorge_0.jpg
|
152
|
+
# relative-height = 90
|
153
|
+
# caption = Gorge
|
154
|
+
# relative-padding-top = 0
|
155
|
+
# relative-padding-bottom = 0
|
156
|
+
# relative-padding-right = 0
|
157
|
+
# relative-padding-left = 0
|
158
|
+
|
159
|
+
= Hobby: Climbing
|
160
|
+
|
161
|
+
# image
|
162
|
+
# src = gorge_1.jpg
|
163
|
+
# relative-height = 90
|
164
|
+
# caption = Gorge
|
165
|
+
# relative-padding-top = 0
|
166
|
+
# relative-padding-bottom = 0
|
167
|
+
# relative-padding-right = 0
|
168
|
+
# relative-padding-left = 0
|
169
|
+
|
170
|
+
= Hobby: Climbing
|
171
|
+
|
172
|
+
I burst through from 4m to 10m many waterfalls into several kilometers gorge.
|
173
|
+
|
174
|
+
= Hobby: Climbing
|
175
|
+
|
176
|
+
# image
|
177
|
+
# src = bonfire.jpg
|
178
|
+
# relative-height = 60
|
179
|
+
# caption = I bivouacked in the gorge with a bonfire for cooking rice and miso soup.
|
180
|
+
# relative-padding-top = 0
|
181
|
+
# relative-padding-bottom = 0
|
182
|
+
# relative-padding-right = 0
|
183
|
+
# relative-padding-left = 0
|
184
|
+
|
185
|
+
= Hobby: Climbing
|
186
|
+
|
187
|
+
When I was cooking rice and miso soup early morning by bonfire I was given notice "Today, we have Asakusa.rb" so I escaped the gorge quickly and went to Asakusa.rb by bullet train and joined it and went back to Sendai by midnight highway bus,
|
188
|
+
|
189
|
+
= Hobby: Climbing
|
190
|
+
|
191
|
+
in a 24 hours period.
|
192
|
+
|
193
|
+
And joined pre-party of RubyKaigi.
|
194
|
+
|
195
|
+
= Hobby: Climbing
|
196
|
+
|
197
|
+
It was the hardest experience of this RubyKaigi.
|
198
|
+
|
199
|
+
= Hobby: Climbing
|
200
|
+
|
201
|
+
In gorge, I didn't find a fossil of the aimed whale, but found so many ((*shell beds(dense shell fossils)*)) and leaf's fossils.
|
202
|
+
|
203
|
+
= Hobby: Climbing
|
204
|
+
|
205
|
+
Shell...?
|
206
|
+
|
207
|
+
= Today's topic
|
208
|
+
|
209
|
+
IRB Reboot:\nModernize Implementation and Features
|
210
|
+
|
211
|
+
= Recent years keiju-san's
|
212
|
+
|
213
|
+
In the several past RubyKaigis, keiju-san who is godfather of Ruby and the author of IRB talked about old Ruby.
|
214
|
+
|
215
|
+
= Recent years keiju-san's
|
216
|
+
|
217
|
+
He said
|
218
|
+
|
219
|
+
((*"The first language design of Ruby was like shell."*))
|
220
|
+
|
221
|
+
in "Ruby Archaeology"\nat RubyKaigi 2013.
|
222
|
+
|
223
|
+
= Recent years keiju-san's
|
224
|
+
|
225
|
+
After that, keiju-san carries on talking about Ruby and shell.
|
226
|
+
|
227
|
+
= Recent years keiju-san's
|
228
|
+
|
229
|
+
* 2014: Reish, an unix shell for rubyist.
|
230
|
+
* 2015: Usage and implementation of Reish which is an Unix shell for Rubyist
|
231
|
+
* 2017: Irb 20th anniversary memorial session: Reish and Irb2
|
232
|
+
|
233
|
+
= Recent years keiju-san's
|
234
|
+
|
235
|
+
Next session of Hagi(#rubykaigiC) is keiju-san's one, don't miss it.
|
236
|
+
|
237
|
+
= Today's topic
|
238
|
+
|
239
|
+
Let's back up a minute.
|
240
|
+
|
241
|
+
= Today's topic
|
242
|
+
|
243
|
+
I sent 2 patches to IRB.
|
244
|
+
|
245
|
+
* #14683 IRB with Ripper
|
246
|
+
* #14787 Show documents when completion
|
247
|
+
|
248
|
+
= #14683 IRB with Ripper\n...How use RDoc use Ripper
|
249
|
+
|
250
|
+
I talked about RDoc with Ripper,
|
251
|
+
|
252
|
+
"Ruby Parser\n
|
253
|
+
In IRB 20th Anniversary...\n
|
254
|
+
Now Let Time Resume"
|
255
|
+
|
256
|
+
at RubyKaigi 2017.
|
257
|
+
|
258
|
+
= #14683 IRB with Ripper\n...How use RDoc use Ripper
|
259
|
+
|
260
|
+
Ruby syntax is very complex.
|
261
|
+
|
262
|
+
= #14683 IRB with Ripper\n...How use RDoc use Ripper
|
263
|
+
|
264
|
+
Ruby's parser is spaghetti.
|
265
|
+
|
266
|
+
* (('wait'))Lexical analyzer is tightly coupled with parser
|
267
|
+
* (('wait'))parse.y has over 11,000 lines
|
268
|
+
* (('wait'))The overwhelming weight of ((*syntax*)) to come and the uncertainty of (({((*lex_state*))})) hung over us.
|
269
|
+
|
270
|
+
= #14683 IRB with Ripper\n...How use RDoc use Ripper
|
271
|
+
|
272
|
+
Ruby's syntax is\nvery dirty.
|
273
|
+
|
274
|
+
= #14683 IRB with Ripper\n...How use RDoc use Ripper
|
275
|
+
|
276
|
+
Ruby's syntax is\nvery 🙅(('del:dirty'))🙅.
|
277
|
+
|
278
|
+
= #14683 IRB with Ripper\n...How use RDoc use Ripper
|
279
|
+
|
280
|
+
Ruby's syntax is\nvery 🙆complex🙆.
|
281
|
+
|
282
|
+
= #14683 IRB with Ripper\n...How use RDoc use Ripper
|
283
|
+
|
284
|
+
Ruby's syntax\n😉abrades😉 parser developer.
|
285
|
+
|
286
|
+
= #14683 IRB with Ripper\n...How use RDoc use Ripper
|
287
|
+
|
288
|
+
But, the abradable syntax for parser developer\n((*is gentle for Ruby users*))\nby matz.
|
289
|
+
|
290
|
+
It's great point of Ruby.
|
291
|
+
|
292
|
+
= #14683 IRB with Ripper\n...How use RDoc use Ripper
|
293
|
+
|
294
|
+
So RDoc had very many bugs in parsing Ruby code.
|
295
|
+
|
296
|
+
= #14683 IRB with Ripper\n...How use RDoc use Ripper
|
297
|
+
|
298
|
+
I fixed so many bugs of RDoc, and replaced it fixed RDoc with Ripper version.
|
299
|
+
|
300
|
+
= #14683 IRB with Ripper\n...How use RDoc use Ripper
|
301
|
+
|
302
|
+
Ripper is one of Ruby's standard libraries of lexical analysis by parse.y.
|
303
|
+
|
304
|
+
= #14683 IRB with Ripper\n...How use RDoc use Ripper
|
305
|
+
|
306
|
+
I think that Ripper is best way for parsing Ruby code, for following latest Ruby syntax.
|
307
|
+
|
308
|
+
= #14683 IRB with Ripper
|
309
|
+
|
310
|
+
But IRB implement pure Ruby parser. It's hard to support Ruby's new syntax.
|
311
|
+
|
312
|
+
= #14683 IRB with Ripper
|
313
|
+
|
314
|
+
I thought that Ripper makes IRB's source code parsing better.
|
315
|
+
|
316
|
+
= #14683 IRB with Ripper
|
317
|
+
|
318
|
+
I discussed Ruby's REPL with matz, and matz said "I implemented mruby's REPL(mirb), learning from IRB's history".
|
319
|
+
|
320
|
+
= #14683 IRB with Ripper
|
321
|
+
|
322
|
+
REPL needs when code block will end(close) because REPL evaluates it at the timing.
|
323
|
+
|
324
|
+
= #14683 IRB with Ripper
|
325
|
+
|
326
|
+
The mirb uses
|
327
|
+
|
328
|
+
* token's (({lex_state}))
|
329
|
+
* (({parser->lstate}))
|
330
|
+
* syntax error messages
|
331
|
+
* (({parser->error_buffer[0].message}))
|
332
|
+
|
333
|
+
(The (({parser})) is a\n(({struct mrb_parser_state})))
|
334
|
+
|
335
|
+
= #14683 IRB with Ripper
|
336
|
+
|
337
|
+
In CRuby,
|
338
|
+
|
339
|
+
* token's (({lex_state}))
|
340
|
+
* (({Ripper}))
|
341
|
+
* syntax error messages
|
342
|
+
* (({RubyVM::InstructionSequence}))
|
343
|
+
|
344
|
+
= #14683 IRB with Ripper
|
345
|
+
|
346
|
+
I ported mirb's implementation to IRB.
|
347
|
+
|
348
|
+
= #14683 IRB with Ripper
|
349
|
+
|
350
|
+
IRB has some prompt features, (({PROMPT_N})), (({PROMPT_S})), and (({%NNi})).
|
351
|
+
|
352
|
+
= #14683 IRB with Ripper
|
353
|
+
|
354
|
+
* (({PROMPT_N}))
|
355
|
+
* (('wait'))Prompt when\nthe code line is continued
|
356
|
+
* (({PROMPT_S}))
|
357
|
+
* (('wait'))Prompt when\nthe code block is in literal
|
358
|
+
* (({%NNi}))
|
359
|
+
* (('wait'))Nesting level of\nthe code block
|
360
|
+
|
361
|
+
= #14683 IRB with Ripper
|
362
|
+
|
363
|
+
* (({PROMPT_N}))
|
364
|
+
* ((*Ripper*))\n
|
365
|
+
* (({PROMPT_S}))
|
366
|
+
* ((*Ripper*))\n
|
367
|
+
* (({%NNi}))
|
368
|
+
* ((*Ripper*))\n
|
369
|
+
|
370
|
+
= #14683 IRB with Ripper
|
371
|
+
|
372
|
+
In CRuby, I could resolve the parameters of prompt by Ripper.
|
373
|
+
|
374
|
+
= #14683 IRB with Ripper
|
375
|
+
|
376
|
+
The (({PROMPT_N})) is a part of "when the code block is ended" logic.
|
377
|
+
|
378
|
+
= #14683 IRB with Ripper
|
379
|
+
|
380
|
+
Inside "splitted sentence", IRB uses (({PROMPT_N})) prompt.
|
381
|
+
|
382
|
+
Like:
|
383
|
+
|
384
|
+
# enscript ruby
|
385
|
+
method(a,
|
386
|
+
b,
|
387
|
+
c)
|
388
|
+
|
389
|
+
= #14683 IRB with Ripper
|
390
|
+
|
391
|
+
The (({PROMPT_S})) is implemented by checking corresponding open and close tokens of literals.
|
392
|
+
|
393
|
+
= #14683 IRB with Ripper
|
394
|
+
|
395
|
+
Literal tokens:
|
396
|
+
|
397
|
+
* (({"}))
|
398
|
+
* (({'}))
|
399
|
+
* percent literals
|
400
|
+
* (({%q{})) and (({}}))
|
401
|
+
* (({%w{})) and (({}}))
|
402
|
+
* blah blah blah
|
403
|
+
* here-document
|
404
|
+
|
405
|
+
= #14683 IRB with Ripper
|
406
|
+
|
407
|
+
Example:
|
408
|
+
|
409
|
+
# enscript ruby
|
410
|
+
"This
|
411
|
+
is
|
412
|
+
multiline
|
413
|
+
string"
|
414
|
+
|
415
|
+
= #14683 IRB with Ripper
|
416
|
+
|
417
|
+
Example:
|
418
|
+
|
419
|
+
# enscript ruby
|
420
|
+
%w{
|
421
|
+
array
|
422
|
+
of
|
423
|
+
strings
|
424
|
+
}
|
425
|
+
|
426
|
+
= #14683 IRB with Ripper
|
427
|
+
|
428
|
+
Inside String or other literal, IRB uses (({PROMPT_S})) prompt.
|
429
|
+
|
430
|
+
= #14683 IRB with Ripper
|
431
|
+
|
432
|
+
The (({%NNi})) is implemented by count corresponding name space open and close tokens.
|
433
|
+
|
434
|
+
= #14683 IRB with Ripper
|
435
|
+
|
436
|
+
* Increase nesting level when takes open token
|
437
|
+
* (({if})), (({unless})), (({while})), (({until})), (({rescue}))
|
438
|
+
* skip post-fix version (it doesn't need (({end})))
|
439
|
+
* (({def})), (({do})), (({case})), (({for})), (({begin})), (({class})), (({module}))
|
440
|
+
* (({[})), (({{})), (({(}))
|
441
|
+
|
442
|
+
= #14683 IRB with Ripper
|
443
|
+
|
444
|
+
* Decrease down nesting level when takes open token
|
445
|
+
* (({end}))
|
446
|
+
* (({]})), (({}})), (({)}))
|
447
|
+
|
448
|
+
= #14683 IRB with Ripper
|
449
|
+
|
450
|
+
# enscript ruby
|
451
|
+
# nesting level is 0
|
452
|
+
class C # increase nesting level to 1
|
453
|
+
def m # increase nesting level to 2
|
454
|
+
if true # increase nesting level to 3
|
455
|
+
1 if true # skip (post-fix if)
|
456
|
+
end # decrease nesting level to 2
|
457
|
+
end # decrease nesting level to 1
|
458
|
+
end # decrease nesting level to 0
|
459
|
+
# <=== evaluation!
|
460
|
+
|
461
|
+
= #14683 IRB with Ripper
|
462
|
+
|
463
|
+
Actual example by default:
|
464
|
+
|
465
|
+
# enscript ruby
|
466
|
+
↓ %NNi (nesting level)
|
467
|
+
irb(main):001:0> def foo(a,
|
468
|
+
irb(main):002:2* b) # PROMPT_N
|
469
|
+
irb(main):003:1> <<-EOM
|
470
|
+
irb(main):004:1" Hello, # PROMPT_S
|
471
|
+
irb(main):005:1" World! # PROMPT_S
|
472
|
+
irb(main):006:1" EOM # PROMPT_S
|
473
|
+
irb(main):007:1> end
|
474
|
+
=> :foo
|
475
|
+
irb(main):008:0>
|
476
|
+
|
477
|
+
= ((*#14683*)) IRB with Ripper
|
478
|
+
|
479
|
+
https://bugs.ruby-lang.org/issues/14683
|
480
|
+
|
481
|
+
= ((*#14683*)) IRB with Ripper
|
482
|
+
|
483
|
+
This removes
|
484
|
+
|
485
|
+
* lib/irb/slex.rb (283 lines)
|
486
|
+
* lib/irb/ruby-token.rb (268 lines)
|
487
|
+
|
488
|
+
= ((*#14683*)) IRB with Ripper
|
489
|
+
|
490
|
+
This simplifies
|
491
|
+
|
492
|
+
* lib/irb/ruby-lex.rb (1181 to 287 lines)
|
493
|
+
|
494
|
+
= ((*#14683*)) IRB with Ripper
|
495
|
+
|
496
|
+
Ruby parser of IRB was shrunk from total 1732 lines to 287 lines.
|
497
|
+
|
498
|
+
= ((*#14683*)) IRB with Ripper
|
499
|
+
|
500
|
+
The simple implementation is best, because Ruby syntax is complex.
|
501
|
+
|
502
|
+
The simple implementation is easy to support and keep the gentleness of Ruby.
|
503
|
+
|
504
|
+
= #14787 Show documents when completion
|
505
|
+
|
506
|
+
This is second patch for IRB.
|
507
|
+
|
508
|
+
= #14787 Show documents when completion
|
509
|
+
|
510
|
+
I talked about this Q&A time at RubyKaigi 2017.
|
511
|
+
|
512
|
+
= #14787 Show documents when completion
|
513
|
+
|
514
|
+
First, RDoc's RI binary files are installed to Ruby's directory.
|
515
|
+
|
516
|
+
= #14787 Show documents when completion
|
517
|
+
|
518
|
+
CRuby:
|
519
|
+
|
520
|
+
$ tar xvzf ruby-2.5.1.tar.gz
|
521
|
+
$ cd ruby-2.5.1
|
522
|
+
$ autoconf
|
523
|
+
$ ./configure
|
524
|
+
$ make
|
525
|
+
$ make install # <=== RDoc runs inside
|
526
|
+
|
527
|
+
= #14787 Show documents when completion
|
528
|
+
|
529
|
+
CRuby:
|
530
|
+
|
531
|
+
$ rbenv install 2.5.1 # <=== RDoc runs inside
|
532
|
+
|
533
|
+
= #14787 Show documents when completion
|
534
|
+
|
535
|
+
RubyGems:
|
536
|
+
|
537
|
+
$ gem install rails # <=== RDoc runs inside
|
538
|
+
|
539
|
+
= #14787 Show documents when completion
|
540
|
+
|
541
|
+
But many users set:
|
542
|
+
|
543
|
+
$ gem install rails --no-document
|
544
|
+
|
545
|
+
= #14787 Show documents when completion
|
546
|
+
|
547
|
+
Many blogs recommend:
|
548
|
+
|
549
|
+
$ cat ~/.gemrc
|
550
|
+
install: --no-document
|
551
|
+
update: --no-document
|
552
|
+
|
553
|
+
= #14787 Show documents when completion
|
554
|
+
|
555
|
+
Unfortunately many users don't need documents data, but I understand it.
|
556
|
+
|
557
|
+
= #14787 Show documents when completion
|
558
|
+
|
559
|
+
Because it's ((*just*)) for RI((({ri})) command).
|
560
|
+
|
561
|
+
= #14787 Show documents when completion
|
562
|
+
|
563
|
+
Usage of class:
|
564
|
+
|
565
|
+
$ ri 'String'
|
566
|
+
|
567
|
+
= #14787 Show documents when completion
|
568
|
+
|
569
|
+
Usage of instance method:
|
570
|
+
|
571
|
+
$ ri 'String#gsub'
|
572
|
+
|
573
|
+
= #14787 Show documents when completion
|
574
|
+
|
575
|
+
Usage of class method:
|
576
|
+
|
577
|
+
$ ri 'String.new'
|
578
|
+
|
579
|
+
= #14787 Show documents when completion
|
580
|
+
|
581
|
+
Bothersome.
|
582
|
+
|
583
|
+
= #14787 Show documents when completion
|
584
|
+
|
585
|
+
I wrote on the ticket:
|
586
|
+
|
587
|
+
# blockquote
|
588
|
+
# title = #14787
|
589
|
+
RDoc installs all documents to Ruby's directory by default.
|
590
|
+
|
591
|
+
= #14787 Show documents when completion
|
592
|
+
|
593
|
+
# blockquote
|
594
|
+
# title = #14787
|
595
|
+
Many users never use it because it's just for RI("ri" command).
|
596
|
+
|
597
|
+
= #14787 Show documents when completion
|
598
|
+
|
599
|
+
# blockquote
|
600
|
+
# title = #14787
|
601
|
+
I think that it is a reason of that many users don't attach importance to documentation.
|
602
|
+
|
603
|
+
= #14787 Show documents when completion
|
604
|
+
|
605
|
+
I want to improve the importance of RDoc's data.
|
606
|
+
|
607
|
+
= #14787 Show documents when completion
|
608
|
+
|
609
|
+
shevegen (Robert A. Heiler) replied to the ticket:
|
610
|
+
|
611
|
+
# blockquote
|
612
|
+
# title = #14787 shevegen
|
613
|
+
I also do not use "ri" on the commandline.
|
614
|
+
|
615
|
+
= #14787 Show documents when completion
|
616
|
+
|
617
|
+
# blockquote
|
618
|
+
# title = #14787 shevegen
|
619
|
+
I would not know why, because I myself simply do not use local look-up ways for documentation normally.
|
620
|
+
|
621
|
+
= #14787 Show documents when completion
|
622
|
+
|
623
|
+
It's the same opinion of me.
|
624
|
+
|
625
|
+
= #14787 Show documents when completion
|
626
|
+
|
627
|
+
And the continuation of shevegen's comment:
|
628
|
+
|
629
|
+
= #14787 Show documents when completion
|
630
|
+
|
631
|
+
# blockquote
|
632
|
+
# title = #14787 shevegen
|
633
|
+
I really "just google".
|
634
|
+
|
635
|
+
= #14787 Show documents when completion
|
636
|
+
|
637
|
+
# blockquote
|
638
|
+
# title = #14787 shevegen
|
639
|
+
And using the browser is about 100x more convenient for me as well.
|
640
|
+
|
641
|
+
= #14787 Show documents when completion
|
642
|
+
|
643
|
+
It's the exact same opinion of me.
|
644
|
+
|
645
|
+
= #14787 Show documents when completion
|
646
|
+
|
647
|
+
Perfect.
|
648
|
+
|
649
|
+
= #14787 Show documents when completion
|
650
|
+
|
651
|
+
I'm actually sad.
|
652
|
+
|
653
|
+
= #14787 Show documents when completion
|
654
|
+
|
655
|
+
I want to improve the importance of RDoc's data(2).
|
656
|
+
|
657
|
+
= #14787 Show documents when completion
|
658
|
+
|
659
|
+
IRB(with Readline) completes namespace such as classes, modules, methods and so on when it caught TAB key.
|
660
|
+
|
661
|
+
= #14787 Show documents when completion
|
662
|
+
|
663
|
+
In the patch of this ticket, I use RDoc as a library.
|
664
|
+
|
665
|
+
= #14787 Show documents when completion
|
666
|
+
|
667
|
+
When you press TAB key one more just after that namespace is exact matched, RI document is shown.
|
668
|
+
|
669
|
+
= #14787 Show documents when completion
|
670
|
+
|
671
|
+
Demonstration
|
672
|
+
|
673
|
+
= #14787 Show documents when completion
|
674
|
+
|
675
|
+
This is just an aside, I want Ruby's documentation ((*design*)).
|
676
|
+
|
677
|
+
= #14787 Show documents when completion
|
678
|
+
|
679
|
+
In the ticket, I talked about language documentation design.
|
680
|
+
|
681
|
+
= #14787 Show documents when completion
|
682
|
+
|
683
|
+
# blockquote
|
684
|
+
# title = #14787
|
685
|
+
Perl has "perldoc" feature and users easily access documents of modules by "perldoc" command.
|
686
|
+
|
687
|
+
= #14787 Show documents when completion
|
688
|
+
|
689
|
+
# blockquote
|
690
|
+
# title = #14787
|
691
|
+
Python has "docstring" feature and users can access it on REPL.
|
692
|
+
|
693
|
+
= #14787 Show documents when completion
|
694
|
+
|
695
|
+
# blockquote
|
696
|
+
# title = #14787
|
697
|
+
Those are each language's design of importance.
|
698
|
+
|
699
|
+
= #14787 Show documents when completion
|
700
|
+
|
701
|
+
# blockquote
|
702
|
+
# title = #14787
|
703
|
+
Users use the language on the documentation design, so library developers write documents on the documentation design.
|
704
|
+
|
705
|
+
= #14787 Show documents when completion
|
706
|
+
|
707
|
+
# blockquote
|
708
|
+
# title = #14787
|
709
|
+
Ruby doesn't have documentation design like Perl and Python.
|
710
|
+
|
711
|
+
= #14787 Show documents when completion
|
712
|
+
|
713
|
+
# blockquote
|
714
|
+
# title = #14787
|
715
|
+
Ruby just has RDoc, IRB, and any other supports, but these are just fragmented features, these are not a documentation design.
|
716
|
+
|
717
|
+
= Documentation design
|
718
|
+
|
719
|
+
I want to improve Ruby's documentation design.
|
720
|
+
|
721
|
+
= Documentation design
|
722
|
+
|
723
|
+
This ticket is a slice of my documentation design.
|
724
|
+
|
725
|
+
= Documentation design
|
726
|
+
|
727
|
+
I want to improve\n((*the gentleness*))\nof Ruby's documentation design.
|
728
|
+
|
729
|
+
= Documentation design
|
730
|
+
|
731
|
+
I think that\n((*the gentleness for users*))\nis very important in Ruby.
|
732
|
+
|
733
|
+
= Documentation design
|
734
|
+
|
735
|
+
Please remove\n(({--no-document}))\nfor\nimprovement documentation at Ruby 2.6 or later.
|
736
|
+
|
737
|
+
= Thank you for your attention
|
738
|
+
|
739
|
+
Please write documents!
|