ruby pearls
Dec. 7th, 2016 02:20 pm2.2.0 :004 > ':xyz'.split(/:/)[0] => "" 2.2.0 :005 > ''.split(/:/)[0] => nil 2.2.0 :006 > 'xyz'.split(/:/)[0] => "xyz"
2.2.0 :001 > weak_key = lambda {|c| c.split(/:/, 2)[0]}
2.2.0 :002 > weak_key('xyz:1986')
NoMethodError: undefined method `weak_key' for main:Object2.2.0 :003 > def weak_key(x)
2.2.0 :004?> puts "blah"
2.2.0 :005?> end
=> :weak_key
2.2.0 :006 > def xyz(x)
2.2.0 :007?> def weak_key(y)
2.2.0 :008?> puts x+y
2.2.0 :009?> end
2.2.0 :010?> puts "yo"
2.2.0 :011?> end
=> :xyz
2.2.0 :012 > weak_key('b')
blah
=> nil
2.2.0 :013 > xyz('b')
yo
=> nil
2.2.0 :014 > weak_key('c')
NameError: undefined local variable or method `x' for main:Object
from (irb):8:in `weak_key'
from (irb):14
from /Users/alex/.rvm/rubies/ruby-2.2.0/bin/irb:11:in `<main>'Idiots.
no subject
Date: 2016-12-07 03:47 pm (UTC)no subject
Date: 2016-12-07 03:56 pm (UTC)no subject
Date: 2016-12-07 04:04 pm (UTC)no subject
Date: 2016-12-07 04:07 pm (UTC)no subject
Date: 2016-12-07 04:08 pm (UTC)no subject
Date: 2016-12-07 04:38 pm (UTC)no subject
Date: 2016-12-07 05:08 pm (UTC)no subject
Date: 2016-12-07 06:43 pm (UTC)no subject
Date: 2016-12-07 06:56 pm (UTC)Только окромя эрланга, никакие из ОО и близко к этой теме (исчисление процессов в основе языка) не подходили.
Ну и не уверен, можно ли эрланг называть ОО ;-)
no subject
Date: 2016-12-07 07:14 pm (UTC)no subject
Date: 2016-12-07 07:24 pm (UTC)no subject
Date: 2016-12-07 07:29 pm (UTC)no subject
Date: 2016-12-08 01:06 am (UTC)Мне вот интересно, можно ли нарушить в Эрланге инварианты пи-исчисления. Думаю как два пальца.
Ну и интересно, есть ли industrial unsound provers :)
no subject
Date: 2016-12-08 07:31 am (UTC)2.3.0 :001 > ':xyz'.split /:/
=> ["", "xyz"]
2.3.0 :002 > 'xyz'.split /:/
=> ["xyz"]
2.3.0 :003 > ''.split /:/
=> []
2. тут фокус. помним, что в руби синтаксический диабет - и вот лямбды нельзя вызвать круглыми скобками. да и не надо в коде это обычно.
как можно:
2.3.0 :004 > f = lambda {|x| x+2 }
=> #<proc:0x007f95d7011ae8@(irb):4>
2.3.0 :005 > f[2]
=> 4
2.3.0 :006 > f.call 4
=> 6
(не буду писать, что этих лямбд несколько видов, и все под своё назначение. какие-то считают свои аргументы строго, каким-то пофиг. плюс есть разный синтаксис)
3. тут вообще не майндфак. руби - динамический язык, от слова совсем. даже не кложа.
важнее другое: руби никогда по своей философии и дизайну не страхует от засовывания пальцев в розетку, поливания себя кипятком (а что, больно же тоже), попытки воткнуть себе вилку в глаз, а потом в руку. (это кстати удобная фича именно данного языка как инструмента)
def внутри def'а не делают.
(теория там такая - есть три вида текущих контекстов - обычный self для переменных, и ещё два - точка ввинчивания методов и точка ввинчивания констант. деф внутри дефа это второй случай. статью могу нагуглить если надо. использовать второе знание обычному программисту, а не писателю хардкорных волшебных библиотек, не нужно)
no subject
Date: 2016-12-08 07:36 am (UTC)методы не являются замыканиями.
2.3.0 :007 > def a x
2.3.0 :008?> def b y
2.3.0 :009?> x+y
2.3.0 :010?> end
2.3.0 :011?> b 5
2.3.0 :012?> end
=> :a
2.3.0 :013 > a 3
NameError: undefined local variable or method `x' for main:Object
from (irb):9:in `b'
from (irb):11:in `a'
from (irb):13
from /Users/valt/.rvm/rubies/ruby-2.3.0/bin/irb:11:in `'
2.3.0 :014 >
лямбды, проки, блоки кода - да
no subject
Date: 2016-12-08 07:40 am (UTC)2. вот это полезно знать, хотя и wtf, как следствие из зоопарка функций, проков, блоков и лямбд.
3. конечно же, это wtf.
no subject
Date: 2016-12-08 07:42 am (UTC)no subject
Date: 2016-12-08 07:45 am (UTC)а константы лексические. плюс в рельсах (а это обычное применение руби) они сломаны под волшебную загрузку, поэтому рельсы это скорее диалект руби.
no subject
Date: 2016-12-08 07:45 am (UTC)=> ["1", "2", "", "4", "", "6", "", "", ""]
2.3.0 :023 > '1,2,,4,,6,,,'.split(',')
=> ["1", "2", "", "4", "", "6"]
вот это скорей уже кочка, про которую надо помнить.
no subject
Date: 2016-12-08 07:48 am (UTC)no subject
Date: 2016-12-08 07:56 am (UTC)(str.split(..).presence || ['']) # вроде, пофиксил.
2. ну ок, вот юскейсы которые можно прогуглить
stabby_syntax = ->(x) {x + 1} # новинка для фанатов
proc_syntax = identity_proc_for_tuples = proc {|(x, y)| [x,y] }
lambdas = lambda {|x, *y| p x; p y; [x,*y] } # example of grabbing rest of args in destructuring and splatting of arrays inside arrays
[1,2].map {|e| e*2}. # "blocks of code"
map do |e|
e + 1
end
кто-то из них совпадает, например колючая лямбда и обычная лямбда. не знаю, на практике это знание нахрен не нужно.
3. ну тогда константы это полный wtf. )
(долго исписывать как это работает, но вкратце
class A::B
class C::D
end
end
или что-то такое. тут можно добиться случая, когда вложенный класс не будет под вложенным неймспейсом. лучше даже не начинать эту тему. на практике, опять же, в рельсах это иногда мешает, но не сильно.
не в рельсах (в чистом руби) с такими программистами, которые юзают фишку №3 и херню с константами, стараются не работать.
no subject
Date: 2016-12-08 07:59 am (UTC)no subject
Date: 2016-12-08 08:01 am (UTC)подозреваю потому что руби старается не различать переменные и методы
no subject
Date: 2016-12-08 08:04 am (UTC)я думаю и в смолтолке можно переопределить гарбадж коллектор или поломать текущий колстек, поизмывавшись над ним.
no subject
Date: 2016-12-08 09:40 am (UTC)Нет совести и контроля? ;-)
Ну так без инструментов такое доказывать совсем тяжело.
Хоть можно проверить правильность доказательства, это как минимум.
На практике, я уверен, что при таких разработках, сейчас любой возьмёт себе какой-то инструмент в помощь.
http://ru.wikipedia.org/wiki/Эрланг
А я и не знал ;-)
Эрланг же не на пи построен. Нужно выбирать какой из вариантов акторов и проверять.
Палюбому, где-то что-то закралось и несоответствия куда более серьёзные, чем "хаскель не категория".
Но вроде, они же себе такой цели и не ставили, чтоб всё было чОтко согласно какой-то теории.
> industrial unsound provers :)
С вероятностью чтоб просчитывали, что ли?...
Это тестирование получается ;-)
Не совсем, но близко ;-)
Ну или чтоб prover содержал баальшой и хорошо документированный (иначе не industrial!) список исключений из правил. Ну и что, что вся теория вырождается от этих исключений, надо просто аккуратнее! ;-)
Исчисление процессов, это очень не всё, что нужно для распределёнщины.
Это только нижний уровень, база, "ассемблер".
Хотя и конечно, если он весь из себя чОткий, то это сильно упрощает дальнейшую с ним работу.
no subject
Date: 2016-12-08 04:56 pm (UTC)Unsound - это если доказательство, что код удовлетворяет спецификации, не означает, что код удовлетворяет спецификации.
Например, части доказательства, написанные в субботу вечером, используют технику доказательства "мамой клянусь".
no subject
Date: 2016-12-08 04:57 pm (UTC)Не совсем. Необходимо, чтобы в военное время синус мог достигать четырёх.