vitus_wagner: My photo 2005 (Default)
[personal profile] vitus_wagner
В текущем проекте в качестве основного языка реализации серверной части был выбран Perl. Пописав для этого проекта, я понял, что любимые мои команды в perl это map и grep. Ну еще File::Find::find. В общем, сплошная функциональщина. Спроектировать что-ли следующий проект на Ocaml...

Date: 2005-03-15 09:27 am (UTC)

Date: 2005-03-15 09:55 am (UTC)
From: [identity profile] dottedmag.livejournal.com
Кстати, да. По ходу текущего проекта оказалось, что perl - это самый переносимый внутри всяких нужных нам юниксов язык с возможностями ФП. под переносимостью имеется в виду бинарная переносимость.

Date: 2005-03-15 11:22 am (UTC)
From: [identity profile] kouzdra.livejournal.com
O'Caml вроде не хуже. Если таскать байт-код, а не нативный.

Date: 2005-03-15 04:17 pm (UTC)
From: [identity profile] dottedmag.livejournal.com
Не для наших целей. На Cobalt RaQ2 или RH 7.3 обычно в системе не стоит OCaml.

Date: 2005-03-15 11:25 am (UTC)
From: [identity profile] kouzdra.livejournal.com
Я O'Caml именно как язык для не слишком больших проектов и пользую. Помимо околоперловых прелестей имею еще радости статического контроля типов и вполне native-кодной производительности. И еще такую странную радость, как расширяемый синтаксис (стреляет редко, но метко).

На самом деле в O'Caml есть еще пара кайфов, с которыми у перла плохо - pattern matching и егойные именованыее unionы. Но пользу этого объяснить "абстрактно" трудно - поскольку без этого вроде бы и легко обходится, но в реальности оно очень облегчает жизнь.

Date: 2005-03-16 06:38 am (UTC)
From: [identity profile] kouzdra.livejournal.com
Потому что в больших проектах обычно просто по постановке задачи обязательно использование mainstream языка. Все-таки, проект который будет жить минимум несколько лет лучше делать на чем-то более "устоявшемся". Как минимум - с несколькими независимыми поставщиками инструментальных средств.

Между прочим - это, а не качество софта, самая серезная причина не подвязываться в серьезных вещах на MS.

Date: 2005-03-16 01:29 pm (UTC)
From: [identity profile] kouzdra.livejournal.com
Я бы не стал делать долгоиграющий проект на Perl. Использовать его можно - но только там, где его выкидывание будет не слишком дорого стоить. Хотя Perl в достаточно большой степени mainstream язык.

То есть если серьезно - для большого проекта сейчас есть два более или менее надежных языка - C/C++ и Java. Причем для Java существенно то, что за ней стоит не только Sun, но и IBM. На только Sun я бы полагаться не стал.

Но у Perl его userbase все-таки более или менее гарантирует, что проект в случае чего подхватят. А вот с O'Caml я в этом не уверен. Сократят в Inria лабораторию - и запросто сдохнет.

Date: 2005-03-16 04:14 am (UTC)
From: [identity profile] ilya666.livejournal.com
Егойные именованые union'ы и pattern matching с легкостью заменяются наследованием и динамическим связыванием (виртуальными методами).

Меня капитально начинает раздражать все новое, что появилось в ocaml'e за последние 3 года, и началось все это с добавления label'ов. Чем дальше тем хуже. Ой, перепешу я свой единственный caml проект на Caml light или даже окончательно откажусь от статически типизированных языков.

Date: 2005-03-16 06:34 am (UTC)
From: [identity profile] kouzdra.livejournal.com
Union'ы "заменяются" наследованием с увеличением писанины примерно в 5 раз, а паттерны заменяются/заменяют вовсе не "наследованием", а банальными switch/if/и описаниями переменных - оно сосбтвенно и есть комбинация из них - только опять же - нанного более громозкдо и нечитабельно.

label'ы, кстати, хоть и наворот, но вещь удобная, если пользоваться правильно. А больше там ничего особенно и не появлялось.

Date: 2005-03-16 08:24 am (UTC)
From: [identity profile] ilya666.livejournal.com
Ну я думаю что лучше один раз увидеть, чем сто раз услышать... давай посмотрим где у нас в 5 раз больше ПИСАНИНЫ получится. Я взял пример из OCaml tutorial (http://merjis.com/developers/ocaml_tutorial/ch3).
type expr = Plus of expr * expr        (* means a + b *)
          | Minus of expr * expr       (* means a - b *)
          | Times of expr * expr       (* means a * b *)
	  | Divide of expr * expr      (* means a / b *)
          | Value of string            (* "x", "y", "n", etc. *)
	  ;;

let rec to_string e =
  match e with
    Plus (left, right)   -> "(" ^ (to_string left) ^ " + " ^ (to_string right) ^ ")"
  | Minus (left, right)  -> "(" ^ (to_string left) ^ " - " ^ (to_string right) ^ ")"
  | Times (left, right)  -> "(" ^ (to_string left) ^ " * " ^ (to_string right) ^ ")"
  | Divide (left, right) -> "(" ^ (to_string left) ^ " / " ^ (to_string right) ^ ")"
  | Value v -> v
  ;;

let print_expr e =
  print_endline (to_string e);;

Теперь все то же самое для Smalltalk, правда, там понятие файла с сорсами отсутсвует, поэтому исходника в чистом виде не будет, а будет описание того что я делал. Моноширинным текстом выделена ПИСАНИНА:

создал класс Expr, создал подкласс BinaryExpr c полями left и right, создал подклассы Plus, Minus, Times, Divide

определил методы в Expr:
toString
	^ ''
print
	Transcript show: self toString; cr

определил методы в подклассах:
toString
	^ '(', self left toString, ' + ', self right toString, ')'

toString
	^ '(', self left toString, ' - ', self right toString, ')'

toString
	^ '(', self left toString, ' * ', self right toString, ')'

toString
	^ '(', self left toString, ' / ', self right toString, ')'

создал класс UnaryExpr c полем v, подкласс Value и его метод:
toString
	^ self v

Вот и все! Считать по байтам я не стану, но разница в количестве писанины тут явно не 5 раз. И что самое главное -- нет ни одного switch/if. Причем это тупое решение в лоб, без рефакторинга. По уму 4 метода toString в подклассах заменяются на один в базовом классе BinaryExpr:
toString

	^ '(', self left toString, ' ', self opString, ' ', self right toString, ')'


и добавляется четыре метода в подклассах:

opString
	^'+'

opString
	^'-'

opString
	^'*'

opString
	^'/'

что явно меняет объем писанины не в пользу OCaml

Date: 2005-03-16 08:27 am (UTC)
From: [identity profile] mauhuur.livejournal.com
А вот таких делов есть GADT в Хаскелле (http://www.haskell.org/ghc/docs/6.4/html/users_guide/gadt.html).

Date: 2005-03-16 01:16 pm (UTC)
From: [identity profile] kouzdra.livejournal.com
За бортом остались:
1) конструкторы (увы - Plus (Value "1", Value "2")
писать хочется
2) Всякие вещи вроде:


match e with
| Plus (Value a, Value b) -> Value(string_of_int (int_of_string a, int_of_string b))
| Plus (Value "0", a)
| Plus (a, Value "0")
| Minus (a, Value "0")
| Times (a, Value "1")
| Divide (a, Value "1") -> a
| Times (a, Value "1")
| Divide (a, Value "1") -> a
...

3) Банальности наподобие
let f a b c = ...; (x, y)

let (x, y) = f 1 2 3

Profile

vitus_wagner: My photo 2005 (Default)
vitus_wagner

January 2026

S M T W T F S
     1 2 3
4 56789 10
11 121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 12th, 2026 10:50 am
Powered by Dreamwidth Studios