Автор Тема: Rust атакует.  (Прочитано 30162 раз)

DddIzer

  • Гость
Re: Rust атакует.
« Ответ #60 : Апрель 11, 2013, 03:54:42 pm »
одно но, в описание раста на сайте я такой х...ни не увидел.

DddIzer

  • Гость
Re: Rust атакует.
« Ответ #61 : Апрель 11, 2013, 04:00:42 pm »
Но увидел другое, что мне не очень понравилось...  у них операторы (управляющие алгоритмические инструкции) могут возвращать значения.. само по себе это не ново.. но у них поддерживается значение "андефинед" для любого типа (подобно NULL значению в SQL), причем отсутствие его определятся отсутствием ;

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Rust атакует.
« Ответ #62 : Апрель 11, 2013, 04:10:14 pm »
Тут обращать на другое нужно внимание.. - здесь как "вРуби" значение (число 100) является сложным обьектом...  , что для меня , например, достаточно непривычно...

Причем непонятно, чем это лучше "times(100)"... Похоже на очередное ООП головного мозга - должны быть объекты и их методы через точечку.

DddIzer

  • Гость
Re: Rust атакует.
« Ответ #63 : Апрель 11, 2013, 04:22:22 pm »
Тут обращать на другое нужно внимание.. - здесь как "вРуби" значение (число 100) является сложным обьектом...  , что для меня , например, достаточно непривычно...

Причем непонятно, чем это лучше "times(100)"... Похоже на очередное ООП головного мозга - должны быть объекты и их методы через точечку.
Ну на этот вопрос по старой памяти я могу наверное ответить. - преимущество  в возможности сцеплениий операций (формировании выражений из них) - этим говном руби славится... лично для меня это страшный геморр... , но скажем, так  - для оберонщегов гемором являются и правила по которым создаются выражения языка си ( куча операторов присваивания с возможностью вложения в ввыражениях, инкремента, 15 приоритетов операций, слабая типизация... - которые делают  возможным сотавление трудночитаемых выражений с многочисленными побочными эффектами... так, что грехопадение "рубивцев"  основано на весьма старых традициях...

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Rust атакует.
« Ответ #64 : Апрель 11, 2013, 04:47:25 pm »
Нет здесь никакой ошибки... ибо четко сказано "Here's some code that prints "Hello" 100 times:"... time - это время, а times - "раз" - так и переводится.. , для англоговорящего звучит естественно.
Ошибка не здесь, а в той статье, что привёл Jordan:
Сравнение D и Rust
http://versusit.ru/rust-vs-d

Цитировать
Посмотрим теперь, как будет выглядеть код, выводящий числа от 0 до 10. На Rust это будет так:

fn main() {
   for 100.times {
     io::println("Hello");
   }
}

На D аналогичный код бы выглядел следующим образом:
void main() {
  for (int i = 0; i < 10; i++) {
      writeln("Hello");
 }   
}

   for 100.times {
     io::println("Hello");
   }

Выводит Hello 10 раз, но из написанного это непонятно. Откуда взялось 100 и time?


Тут обращать на другое нужно внимание.. - здесь как "вРуби" значение (число 100) является сложным обьектом...  , что для меня , например, достаточно непривычно...
А я уже привык, хоть и не рубист...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Rust атакует.
« Ответ #65 : Апрель 11, 2013, 09:37:10 pm »
Тут обращать на другое нужно внимание.. - здесь как "вРуби" значение (число 100) является сложным обьектом...  , что для меня , например, достаточно непривычно...

Причем непонятно, чем это лучше "times(100)"... Похоже на очередное ООП головного мозга - должны быть объекты и их методы через точечку.

Я тоже раньше думал что ересь. Но поимев некоторый опыт на Lua понял таки в чем профит.

Такая запись позволяет писать цепочки функций самым естественным и прямолинейным образом. Это очень удобно.

form_module = BOM..assert(form_struct.read(3)):sub(2, -2):gsub('""', '"')

form_struct.read(3) - читаем некую строку
:sub(2, -2) - обрезаем по одному символу слева и справа
:gsub('""', '"') - заменяем удвоенные кавычки

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Rust атакует.
« Ответ #66 : Апрель 11, 2013, 09:45:22 pm »
И прошу обратить внимание на ассерт. Он возвращает значение, которое ему передали.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Rust атакует.
« Ответ #67 : Апрель 11, 2013, 09:50:46 pm »
Я тоже раньше думал что ересь. Но поимев некоторый опыт на Lua понял таки в чем профит.

Такая запись позволяет писать цепочки функций самым естественным и прямолинейным образом. Это очень удобно.

По поводу "естественности" можно поспорить.
Цитировать
a().b().c() vs c(b(a()))

Лично для меня ни одна из записей не имеет однозначных преимуществ, если не рассматривать конкретное применение.

P.S. Хотя в копилку "методы с точкой"  можно положить автокомплит ;)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Rust атакует.
« Ответ #68 : Апрель 11, 2013, 10:00:45 pm »
Все познается в сравнении:  ;)

form_module = BOM..assert(form_struct.read(3)):sub(2, -2):gsub('""', '"')

form_module = BOM..gsub(sub(assert(form_struct.read(3)), 2, -2), '""', '"')

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Rust атакует.
« Ответ #69 : Апрель 11, 2013, 10:20:17 pm »
И прошу обратить внимание на ассерт. Он возвращает значение, которое ему передали.

Ага. Смотрится крайне неестественно ;)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Rust атакует.
« Ответ #70 : Апрель 11, 2013, 10:59:49 pm »
Глупости какие. Что мешает сделать инфиксный оператор который будет сцеплять выражения?

Ну, то есть точка нафиг не нужна, нужно чтобы просто функция times возвращала значение. См. тот же operator << для того же cout'а в плюсцах. Ну или там + какой-нибудь.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Rust атакует.
« Ответ #71 : Апрель 12, 2013, 05:26:08 am »
А как это должно выглядеть? Что-то не очень понимаю.
Хотя нафига в Rust for нужен я тоже не понял.

В Ruby то все просто:
count.times {print " hello! "}

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Rust атакует.
« Ответ #72 : Апрель 12, 2013, 05:31:22 am »
См. тот же operator << для того же cout'а в плюсцах.
И чем это лучше точки?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Rust атакует.
« Ответ #73 : Апрель 12, 2013, 07:20:18 am »
См. тот же operator << для того же cout'а в плюсцах.
И чем это лучше точки?
Тем, что это не в языке.

Ну и семантику связывания выражений можно сделать любую.
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Rust атакует.
« Ответ #74 : Апрель 12, 2013, 07:59:50 am »
Я частенько тоже в хацкеле так делаю, хоть это и не ООП-язык:
process fname = do
    putStrLn $ "Processing " ++ fname ++ " ..."
    dat <- readFile fname
    let dat2 = dat
            |> lines
            |> map     (map (\c -> [c]))
            |> map     (map (\s -> if s == "\t" then "\t0" else s))
            |> map     concat
            |> map     words
            |> filter  (\xs -> length xs > 6)

            |> map     (\(time: inorg:incompr:intransm:outorg:outcompr:outtransm:_) ->
                         (time,[inorg,incompr,intransm,outorg,outcompr,outtransm]))

            |> map     (\(time, xs) -> (take 2 (if length time == 5 then '0':time else time)
                                       ,map (read :: String -> Int) xs))

            |> groupBy (\(t1, _) (t2, _) -> t1 == t2) -- сгруппируем по часам
            |> map     (\xs -> (fst $ head xs, map snd xs))

            |> map     (\(time, xs) ->
                         (time, map (\[inorg,incompr,intransm,outorg,outcompr,outtransm] ->
                                      (inorg,incompr,intransm,outorg,outcompr,outtransm)) xs))

            |> map     (\(time, xs) -> (time, unzip6 xs))

            |> map     (\(time, (inorg,incompr,intransm,outorg,outcompr,outtransm)) ->
                         (time, [inorg,incompr,intransm,outorg,outcompr,outtransm]))

            |> map     (\(time, xs) -> (time, map sum xs))

            |> map     (\(time, xs) -> (time, map (\x -> trunc3 $ fromIntegral x / (1024*1024::Double)) xs))

            |> map     (\(time, xs) -> unwords' (time:(map show xs)))


    writeFile (fname ++ ".out") $ unlines dat2
Здесь оператор |> создаёт конвейер типа как pipe в юниксовой консоли. Его можно по сути считать в данном случае точкой, разделяющей объект и вызов его метода в том же Расте.

Проблема таких конвейерных обработок -- через какое-то время трудно понять что там задумывалось, даже более того -- стоит отвлечься на что-то во время написания этого кода -- и уже приходится соображать, что надо дальше в этом конвейере сделать.
Так что иногда всё же вставляю дополнительные переменные, указываю их тип, а то начинаю париться с этими типами ))
Ну, для одноразовых скриптиков можно и так наговнякать )))
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…