From: se8.and@... Date: 2017-08-26T01:34:25+00:00 Subject: [ruby-core:82473] [Ruby trunk Feature#13839] String Interpolation Statements Issue #13839 has been updated by se8 (S��bastien Durand). Thanks for your feedback Jeremy. :) (I have much gratitude for all your work in Ruby!) Yes, I didn't think of this as a replacement for a full featured template engine (with cache, helpers and so), but more as a quick and powerful way to embed Ruby in various documents. I was listening a talk by Rasmus Lerdorf, the creator of PHP. He said that one of the most appealing feature he added to PHP was to include trivial templating out of the box. And it's true, in Ruby or Python, it's harder to get started, you have to require an external library and you are overwhelmed by all these competing choices: Haml ? ERB (which variant?) But I don't know really how you guys feel about that, I am not a language designer. :) By the way Nao submitted a patch for improving string interpolation performance: https://bugs.ruby-lang.org/issues/13587 Good idea on replacing += with <<, it really improved the code speed for large strings: ~~~ Warming up -------------------------------------- Template-small 8.929k i/100ms Erubi-small 3.866k i/100ms Calculating ------------------------------------- Template-small 91.792k (�� 0.9%) i/s - 464.308k in 5.058681s Erubi-small 39.139k (�� 2.4%) i/s - 197.166k in 5.040678s Comparison: Template-small: 91792.2 i/s Erubi-small: 39139.1 i/s - 2.35x slower Warming up -------------------------------------- Template-small-cache 9.166k i/100ms Erubi-small-cache 8.856k i/100ms Calculating ------------------------------------- Template-small-cache 94.974k (�� 1.6%) i/s - 476.632k in 5.019886s Erubi-small-cache 91.008k (�� 0.7%) i/s - 460.512k in 5.060385s Comparison: Template-small-cache: 94973.6 i/s Erubi-small-cache: 91008.5 i/s - 1.04x slower Warming up -------------------------------------- Template-large 1.000 i/100ms Erubi-large 1.000 i/100ms Calculating ------------------------------------- Template-large 19.171 (�� 5.2%) i/s - 96.000 in 5.023298s Erubi-large 2.366 (�� 0.0%) i/s - 12.000 in 5.075102s Comparison: Template-large: 19.2 i/s Erubi-large: 2.4 i/s - 8.10x slower Warming up -------------------------------------- Template-large-cache 1.000 i/100ms Erubi-large-cache 1.000 i/100ms Calculating ------------------------------------- Template-large-cache 19.560 (��10.2%) i/s - 97.000 in 5.014184s Erubi-large-cache 16.434 (��12.2%) i/s - 81.000 in 5.040727s Comparison: Template-large-cache: 19.6 i/s Erubi-large-cache: 16.4 i/s - same-ish: difference falls within error ~~~ ---------------------------------------- Feature #13839: String Interpolation Statements https://bugs.ruby-lang.org/issues/13839#change-66284 * Author: se8 (S��bastien Durand) * Status: Open * Priority: Normal * Assignee: * Target version: ---------------------------------------- Hello! Here is a KISS implementation of a template engine in Ruby: ~~~ ruby class Template attr_reader :input def initialize(input) @input = input end def output "output = %\0" + @input.gsub("{%", "\0\n").gsub("%}", "\noutput += %\0") + "\0" end def render(binding) eval(output, binding) end end ~~~ Usage: ~~~ text {% if true %} Hello #{'World'} {% end %} Template.new('...').render(binding) ~~~ It's kind of a hack on top of Ruby string interpolation, so it's hell fast (~4 times faster than ERB). Could it be a good idea to implement this kind of statements directly in Ruby string interpolation? Maybe a syntax like that: ~~~ text "%{3.times do}Hello #{'World'}%{end}" ~~~ So Ruby would have a fast minimal native template engine, with #{expressions} and %{statements}: ~~~ text eval(File.read("..."), binding) ~~~ -- https://bugs.ruby-lang.org/ Unsubscribe: