Project

General

Profile

Feature #19015

Updated by ko1 (Koichi Sasada) over 1 year ago

This propose new heredoc extension with `<<!LANG` like 

 ```ruby 
 doc = <<!LANG 
   # description written in lang LANG 
   foo bar 
 LANG 
 ``` 

 and it is translated to: 

 ```ruby 
 doc = heredoc_extension_LANG(heredoc_text, binding) 
 ``` 

 ## Example 

 ```ruby 
 require 'erb' 

 def heredoc_extension_erb str, b 
   ERB.new(str).run(b) 
 end 

 name = 'ko1' 

 html = <<!erb 
 <div>Hello <%= name %></div> 
 erb 

 puts html #=> <div>Hello ko1</div> 
 ``` 

 ## Background / considerations 

 * Sometimes we write Ruby syntax string with `<<RUBY` and this proposal inspired by it. 
 * it is similar to shebang (`#!LANG` in shell) 
 * [Elixir's custom sigil](https://elixir-lang.org/getting-started/sigils.html) translates `~u(...)` translates to `sigil_u(...)`. This is why it translated to `heredoc_extension_LANG(...)` private method call. 
 * JavaScript has JSX but I don't think it is fit to the Ruby language. 
 * Heredoc is Ruby's chaos part and already confusing a lot. Additional chaos doesn't matter. 
 * `<<!foo` is valid syntax but now I don't think it is not used. gem codesearch doesn't find the usage. 
 * Sorry I couldn't wait 1st/Apr. 

 ## Implementation 

 I attached the experimental implementation which only supports `erb` (because I couldn't find how to get delimiter to determine a method name :p). 

Back