From: matz@... Date: 2020-04-19T14:18:41+00:00 Subject: [ruby-core:97969] [Ruby master Feature#16799] Add more functional features, make ruby more friendly. Issue #16799 has been updated by matz (Yukihiro Matsumoto). Status changed from Open to Rejected I'd love to enhance the language to be nice to functional programming but at the same time, we have to be nice to existing programs by keeping compatibility. Proposed new syntaxes are incompatible changes so that we cannot accept them. - Anonymous function definition syntax is too trivial. Yes, it's different from most languages, but you can be used to it. - The single namespace (method and variable), so-called lisp-1 semantics is too far away from Ruby's lisp-2 semantics. Changing this is too big incompatibility and unacceptable. Languages like Scala uses different syntax to accomplish functional programming without having lisp-1 semantics (`func _` instead of `func` in Scala). Matz. ---------------------------------------- Feature #16799: Add more functional features,make ruby more friendly. https://bugs.ruby-lang.org/issues/16799#change-85197 * Author: jackmaple (maple jack) * Status: Rejected * Priority: Normal ---------------------------------------- Classes are currently first-class citizens in Ruby, but functions are not. This leads to a situation where the function calls are not uniform, for example: ``` ruby def boo(x) return x end boo2 = -> x { x } a = boo 10 b = boo2.call(10) or b = boo2.(10) or b = boo2[10] ``` This is very confusing to people from other languages (JavaScript, Python, etc.), or people who are just starting to learn ruby. If the method calling format can be unified, and the method is also a first-class citizen, then a higher-order function can be realized, and the method name is just a variable,so maybe more things can be done,and it might be better if the lambda is changed to the following form,for example(suppose): ``` ruby method1 = (f,n) -> f(n) or method1 = (f,n) -> { return f(n) } or method1 = (f,n) -> do return f(n) end #call method result = method1(x -> x * 2,10) #result = 20 ``` The same can also be achieved as follows: ``` ruby def method1(f,n) return f(n) end def double(x) return x * 2 end # &double is reference double method. result = method1(&double,10) #result = 20 ``` We can also use closures in methods(suppose): ``` ruby def method1() param = [] def method2(x) param.push(x) return param end return method2 end f = method1 f(10) ``` Or you can implement decorators: ``` ruby def decorator(f) def child_method(*param) puts(param) return f(*param) end return child_method end def method1(x) return x end #Here will cover the implementation of method1,include method1 method internal recursive reference. #Because the method name is just a variable. method1 = decorator(&method1) method1(10) ``` Although the syntax change is not good, but it makes ruby easier to use. These are just some of my thoughts, thanks. -- https://bugs.ruby-lang.org/ Unsubscribe: