Skip to content

Instantly share code, notes, and snippets.

@wayneeseguin
Created July 20, 2011 18:51
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save wayneeseguin/1095634 to your computer and use it in GitHub Desktop.
Save wayneeseguin/1095634 to your computer and use it in GitHub Desktop.
My thought on improving Ruby construct end syntax.
# I have now programmed in a lot of languages, and one thing I can say for sure
# is that shell scripting does construct end styles very well.
#
# Example from http://redmine.ruby-lang.org/issues/5054
#
# This is indeed also one of my few personal issues with Ruby syntax, the end trail.
#
module MyModule
class MyClass
def my_method
10.times do
if rand < 0.5
p :small
end
end
end
end
end
# For longer codebases, this lets you more clearly know where you stand and
# what is being ended.
module MyModule
class MyClass
def my_method
10.times do
if rand < 0.5
p :small
fi
od
fed
ssalc
eludom
# And allow for shortened forms,
module MyModule
class MyClass
def my_method
10.times do
if rand < 0.5
p :small
fi
od
ed #'end def'
ec # 'end class'
em # 'end module'
# es => 'end case'
#
# I *am* ok with this also :)
#
module MyModule
class MyClass
def my_method
10.times do
if rand < 0.5
p :small
# Suggested by @elliottcable:
module MyModule {
class MyClass {
def my_method {
10.times { # This one already works ;)
if rand < 0.5 {
p :small
}
}
}
}
}
@ELLIOTTCABLE
Copy link

I disagree with the shortened forms outright, first of all. That’s a terrible idea. Instead of two-character ones, allow for slightly shortened forms of the really long ons. dom for module, perhaps.

In either case, I’m in a similar situation: I’ve been away from Ruby for a long time, and if there’s one thing I’ve learned, it’s that Brackets Work _Really, _Really* Well™. A much better improvement to Ruby’s syntax would be allowing brackets in place of every location where end is used. (I forked and threw out a fairly bad example: https://gist.github.com/1095649)

@eltiare
Copy link

eltiare commented Jul 20, 2011

+1 on the brackets. If only for the ease of code editors being able to highlight the beginning and ends without it being very ugly.

I wish backwards ending statements a short but painful death. Sadly this crime against the programmer community is being perpetuated by several languages, and so I have to look at it at times even though it tortures me to do so.

@wayneeseguin
Copy link
Author

Brackets do work nicely, especially with code folding... however they are no better than 'end' when wanting to know what the hell is being ended and aiding with keeping track of where you are in a construct nesting.

@wayneeseguin
Copy link
Author

Also, IMHO if you want to go the bracket route then we might as well adopt python style syntax indentation and not even need them :)

@wayneeseguin
Copy link
Author

Oh and btw @ELLIOTTCABLE, your solution is discredited due to using tabs instead of spaces :P ::grin::

@croaky
Copy link

croaky commented Jul 20, 2011

Gotta toss a whitespace-aware version in there! Python/Coffee/Haml-style.

@wayneeseguin
Copy link
Author

Added @croaky :)

@pointlessone
Copy link

@wayneeseguin get yourself The Editor. Like Vim. ;)

Also, this example is somewhat a greenhouse one.

class MyModule::MyClass
  def my_method
    10.times { p :small if rand < 0.5 }
  end
end

In other words, this is not a language problem.

@krainboltgreene
Copy link

I've been having this "problem" with dapper-dan, for instance:

html5 :root => true do
    head do
        title @title
        description @description
        keywords @keywords
        stylesheet 'application.css'  # Links to /asset/stylesheet/application.css
        javascript 'application.js'    # Links to /asset/javascript/application.js
    end

    body do
        header do
           render :partial => :header
        end

        # This is where Rails puts all the content from a view...
        article :id => 'content', :class => '3column' do
            yield
        end

        footer do
           render :partial => :footer
        end
    end
end

The first recourse is to partialize the code, but that only makes other problems more prominent. In my case, however, your solution does very little! I know I'm going to hate myself for suggesting it, but what if there was:

if true
  while true
    some_method do
      ...
    /some_method
  /while
/if

@rkh
Copy link

rkh commented Jul 20, 2011

You might want to bring those up here.

@wayneeseguin
Copy link
Author

@rkh you mean in the url I linked to at the top of the gist? :)

@wayneeseguin
Copy link
Author

@cheba the example is contrived yes, I nabbed it from the discussion is all. It is only meant to exhibit an 'end trail'

@rkh
Copy link

rkh commented Jul 21, 2011

@wayneeseguin You just put that there, right? :D

@wayneeseguin
Copy link
Author

@rkh I'd claim that was true however the git history would prove me wrong ;)

@trans
Copy link

trans commented Jul 21, 2011

Well shit, if this is going to go on like this:

module MyModule
  class MyClass
    def my_method
      10.times do
        if rand < 0.5
          p :small
        end:if
      end:do
    end:def
  end:class
end:module

Short-hand ?:

module MyModule
  class MyClass
    def my_method
      10.times do
        if rand < 0.5
          p :small
end:if:do:def:class:module

Very short-hand:

module MyModule
  class MyClass
    def my_method
      10.times do
        if rand < 0.5
          p :small
end:all

@trans
Copy link

trans commented Jul 21, 2011

And double hell with it. Let Ruby support Python style indention if : is used.

module MyModule:
  class MyClass:
    def my_method:
      10.times do:
        if rand < 0.5:
          p :small

@krainboltgreene
Copy link

Postfixing the name of the start does not solve the problem.

  1. You write twice as much in most cases, you're now writing XML plus an extra character.
  2. This only looks swell if you're writing a module, with a single class, with a single method, with a single block, with a single if condition.
  3. Still requires you to keep track of the other end, which is the bigger problem here.

@trans
Copy link

trans commented Jul 21, 2011

And while the joke continues here's a lovely one:

module MyModule
|  class MyClass
|  |  def my_method
|  |  |  10.times do
|  |  |  |  if rand < 0.5
|  |  |  |  |  p :small

@wayneeseguin
Copy link
Author

.i .ui!
how about,
module.MyModuleclass.MyClassdef.my_method10.times.doif(rand < 0.5)~p :small

@trans
Copy link

trans commented Jul 21, 2011

Had to see that all hi-litey

module.MyModule~class.MyClass~def.my_method~10.times.do~if(rand < 0.5)~p :small

Eek! It sucks :-D

@wayneeseguin
Copy link
Author

Perhaps we can strip out even more characters and go the minimalistic approach! ;)

@ELLIOTTCABLE
Copy link

Hah. Yes, we had a long discussion about using Unicode box-drawing characters to denote blocks early-on in the development of Paws; I think we’ll have at least one patois playing with things like that in the long run.

Er, what do you mean tabs? I haven’t used a hard-tab in a fuckin’ decade! In fact, despite the shitstorm it abused, my language downright doesn’t allow hardtabs instead. #ew

@ELLIOTTCABLE
Copy link

This gist provides quite a lot of food-for-thought as a developer of a nascent programming language.

Now, that said, PLEASE STOP STUFFING MY INBOX WITH NOTIFICATIONS ;_;

@wayneeseguin
Copy link
Author

@ELLIOTTCABLE I dont believe there is currently a way to 'unsubscribe' from a gist notification feed?

@ELLIOTTCABLE
Copy link

No, there’s not. And that’s the point of my all-caps request. ;D

@rkh
Copy link

rkh commented Aug 7, 2013

HELLO GUYS HOW ARE YOU?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment