LINUX.ORG.RU

Ответ на: комментарий от anonymous

Во-первых там советовали руби, который совсем не $another_lisp. Во-вторых все что evm дает эрлангу можно использовать и в lfe, это вопрос функциональности платформы а не языка.

loz ★★★★★
()
Ответ на: комментарий от loz

Во-первых там советовали руби

Ну ты это загнул. elixir называть руби - это даже не сову на глобус.

anonymous
()
Ответ на: комментарий от anonymous

Ну можно конечно его назвать еще более плохими словами, но я чтобы полегче же.

Also http://www.shenlanguage.org/ - скрещивание ml и lisp.

loz ★★★★★
()
Ответ на: комментарий от Miguel

идеология параллельно выполняющихся процессов, концепция «let if fail».

чем это необычно? реализация параллельности на уровне языка есть много где

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

тот же вопрос

next_time ★★★★★
() автор топика
Ответ на: комментарий от anonymous

приняв даже за истину ваше утверждение, выходит, что хаскелл - это ООП под очень новым соусом, а этого уже достачно

next_time ★★★★★
() автор топика
Ответ на: комментарий от quickquest

ох, ёлки, это вообще-то было тупо просьбой не просто писать название языка, а раскрыть вкратце суть концепции, и наоборот, если уж писать о концепции, написать язык, в котором она применяется

кстати, тут уже понаписали:

Накидайте языков с необычными концепциями, альтернативам ООП. (комментарий)

buddhist

Накидайте языков с необычными концепциями, альтернативам ООП. (комментарий)

rikardoac

Накидайте языков с необычными концепциями, альтернативам ООП. (комментарий)

swwwfactory

next_time ★★★★★
() автор топика
Ответ на: комментарий от next_time

чем это необычно? реализация параллельности на уровне языка есть много где

Много где. Язык, целиком построенный вокруг параллельности — нигде. Тихий перезапуск упавшего потока вместо обработки исключений тоже не применяется нигде. Ну и зелёные треды, до кучи.

тот же вопрос

А где ещё есть первоклассные модули? К чёрту модули, где хотя бы функторы?

Miguel ★★★★★
()
Ответ на: комментарий от anonymous

нет, и вы ещё один из тех, кто пишет сюда язык не описывая его основную концепцию. напомню, вопрос именно про концепции.

next_time ★★★★★
() автор топика
Ответ на: комментарий от Miguel

А где ещё есть первоклассные модули? К чёрту модули, где хотя бы функторы?

откуда мне знать, я же его ещё не знаю, чтобы проводить аналогии, просто хочу, чтобы вы написали здесь, кратко, суть этих модулей, в чём их принципиальное отличие, допустим, чем они концептуально отличаются от тех же модулей в Java?

Язык, целиком построенный вокруг параллельности — нигде.

Go разве нет? Хотя, ок, язык — построенный вокруг параллельности — действительно, редкость, можно засчитать как отдельную концепцию.

Ну и зелёные треды, до кучи.

Go, Java

next_time ★★★★★
() автор топика
Ответ на: комментарий от ilammy

Почитай Kiczales, Paepcke, «Open Implementations and Metaobject Protocols». Очень хорошо разжёвано.

Miguel ★★★★★
()

Альтернативные ООП: Io (sort of прототипное), tcl/Snit и go (делегирование вместо наследования), lua (метатаблицы).

jtootf
Как раз у J самое обычное ООП: http://www.jsoftware.com/help/learning/25.htm. Он интересен другим: лаконичностью и массивным программированием.

quantum-troll ★★★★★
()
Ответ на: комментарий от next_time

в чём их принципиальное отличие, допустим, чем они концептуально отличаются от тех же модулей в Java?

Модули в Java почти ничего не стоят. Это, по сути, неймспейсы. Ну, плюс ещё кое-какой контроль видимости есть.

Модули в OCaml могут быть параметризованы другими модулями. Например: мы пишем большую библиотеку, работающую с итераторами. Мы можем соорудить дофигищи функций, основываясь всего лишь на 1) типе итераторов, и 2) двух-трёх базовых функциях. Проблема в том, что в разных случаях итераторы будут разными, типы у них будут разными, и базовые функции — тоже разные. Так вот, можно всё это абстрагировать в отдельный модуль (точнее, сигнатуру модуля), объявить его параметром, и писать всё остальное. Потом, там, где надо, мы используем этот функтор с конкретным модулем-параметром, и сможем использовать то, что получилось, как будто это обычный модуль. И получим всю нашу развитую функциональность для данного случая.

Первоклассные модули — способ перенести модули из компайл-тайма в рантайм. Можно весь модуль спрятать в переменную и потом развернуть его из этой переменной.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

Вот как... согласен, это удобно и необычно.

next_time ★★★★★
() автор топика
Ответ на: комментарий от Miguel

Модули в OCaml могут быть параметризованы другими модулями. Например: мы пишем большую библиотеку, работающую с итераторами. Мы можем соорудить дофигищи функций, основываясь всего лишь на 1) типе итераторов, и 2) двух-трёх базовых функциях. Проблема в том, что в разных случаях итераторы будут разными, типы у них будут разными, и базовые функции — тоже разные. Так вот, можно всё это абстрагировать в отдельный модуль (точнее, сигнатуру модуля), объявить его параметром, и писать всё остальное. Потом, там, где надо, мы используем этот функтор с конкретным модулем-параметром, и сможем использовать то, что получилось, как будто это обычный модуль. И получим всю нашу развитую функциональность для данного случая.

Не очень понятно, чем это отличается от обычного параметрического полиморфизма в любом другом языке, где он поддерживается.

Первоклассные модули — способ перенести модули из компайл-тайма в рантайм. Можно весь модуль спрятать в переменную и потом развернуть его из этой переменной.

Не очень понятно, чем это отличается от обычного динамического связывания через dlopen, обёрнутого в сахар.

anonymous
()
Ответ на: комментарий от anonymous

Не очень понятно, чем это отличается от обычного параметрического полиморфизма в любом другом языке, где он поддерживается.

Модуль может содержать объявления типов. Причём не одно объявление типа (тогда хватит ограниченного параметрического полиморфизма), а сколько угодно. Тут уже нужно что-то вроде type families из Хаскеля. Кроме того, модуль может содержать другие модули. И даже функторы.

Не очень понятно, чем это отличается от обычного динамического связывания через dlopen, обёрнутого в сахар.

Не очень понятно, при чём тут вообще dlopen, когда речь идёт о возможностях языка.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

Модуль может содержать объявления типов. Причём не одно объявление типа (тогда хватит ограниченного параметрического полиморфизма), а сколько угодно.

Без примера «на пальцах» не понятно...

anonymous
()

мне вот tcl глянуть посоветовали. «всё - строка». точнее, наверное, наоборот, «строка - это всё, что угодно»

MyTrooName ★★★★★
()
Ответ на: комментарий от anonymous

Ну, я не сварщик. Ну, допустим, так. Пишем поисковик. Ему нужен бэкенд — некая база строк, поддерживающая поиск по подстроке. База мутабельна, список результатов — нет. Сигнатура бэкенда будет примерно такой:

module type database =
  sig
    type db (* type of the database itself *)
    type results (* list of all results *)
    val empty : db (* initial state of the database *)
    val insert : db -> string -> () (* OCaml allows side effects *)
    val search : db -> string -> results
    val get_first : results -> (string * results) option (* None if empty, Some (head, tail) if not *)
  end
Обрати внимание, что типы db и results никак не определены.

Предполагая, что какая-то реализация потом будет, мы можем определить функции более высокого уровня. Ну, допустим, так:

module search_engine =
  functor (DB : database) ->
    struct
      let rec all_results (r : DB.results) : string list =
        match DB.get_first r with
        | None -> []
        | Some (str, r1) -> str :: all_results r1
      let is_present (d : DB.db) (substr : string) : bool =
        let r = DB.search d substr in
        match DB.get_first r with
        | None -> false
        | Some _ -> true
      (* some other stuff *)
    end
Всё это отлично компилируется, тайпчекается, и так далее. Затем, в совершенно другом месте, мы можем определить реализацию. Скажем, так:
module list_database : database =
  struct
    type db = string list ref (* mutable list *)
    type results = string list (* immutable list *)
    let empty = ref []
    let insert db str =
      db := (str :: !db);
      ()
    let search db substr = List.filter (fun element -> ExtString.String.exists element substr) !db
    let get_first res =
      match res with
      | [] -> None
      | head :: tail -> Some (head, tail)
  end
После этого можно будет подключить этот бэкенд к нашей системе, просто объявив
module list_search_engine = search_engine(list_database)

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

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

То, что вытащили его на уровень синтаксиса языка, — прикольно, конечно. В крестах бы так, чтобы не делать восход солнца вручную.

anonymous
()
Ответ на: комментарий от quickquest

И никто за полдня про Оберон-то не вспомнил!

A2 (ранее Bluebottle)

О боже, оно не только еще живое, но уже и переименовалось во что-то.

A2 в настоящий момент реализована для:
x86, x86-64, ARM, Cell

И даже портирована на арм.

Удивительно.

anonymous
()
Ответ на: комментарий от quantum-troll

у J самое обычное ООП

ну я и не утверждал обратного. там же были альтернативы, а не альтернативные реализации

jtootf ★★★★★
()
Ответ на: комментарий от anonymous

Строго говоря, я в кишки ocamlc не лазил, но не вижу ничего, что помешало бы при линковке прописать везде, где надо, статические адреса.

Miguel ★★★★★
()
Ответ на: комментарий от next_time

elixir

немного читал, слежу за новостями, запускал консоль. Пока глубже не щупал.

Позиционируется как «эликсир» для веб-приложений, включающий в себя практически все возможности эрланга (можно писать вставки на эрланге) + расширения в сторону ООП (этим собственно интересен как слияние/синтез ФП и ООП)

Немного похож на Ruby, но это было на начальных этапах.

По сути транслирует код эликсира в код на эрланге, поэтому практически полностью совместим с эрлангом - можно подключать наработанные либы и прочее. Интересен в первую очередь тем, кто владеет эрлангом, но хочет больше ООП.

swwwfactory ★★
()

Вы бы лучше интересные концепции коллекционировали, их таки много меньше чем ЯП;-)

AIv ★★★★★
()

В свое время нравился PL-11.

Deleted
()
Ответ на: комментарий от Miguel

А где ещё есть первоклассные модули?

Традиционно - в лиспах. Да вообще в любой сильно рефлексивном языке. Окамл тут не первый далеко.

anonymous
()
Ответ на: комментарий от next_time

Golang это переносимый очередной ассемблер - поэтому

хоаровские сообщающиеся последовательные процессы прикручены ибо уже и на уровне железа всё чаще встречаются многоголовые исполнители в которых реально 2-3(как нимимум) одновременных исполнителя .

в отличии от эрланга где вроде как подпроцессы по умолчанию пускаются в паралель , а не в «стек ожидающих родителей»

qulinxao ★★☆
()
Ответ на: комментарий от Miguel

Если полиморфизм high-rank, то нельзя. Например в хаскеле именно из-за этого не прописывается, а делается через таблицу виртуальных методов.

anonymous
()
Ответ на: комментарий от qulinxao

По ссылке какое-то ЛОЛШТО. «Lisp, в нарядах от С». Если JS - лисп, то автор статьи - гуманоид с Сириуса.

Как гласит популярная городская легенда, JS был придуман и реализован что-то примерно за неделю. И я склонен этому верить. Такое говно можно только случайно по пьяни изобрести.

anonymous
()
Ответ на: комментарий от anonymous

Некоторые называют js диалектом лиспа. Плюсовое быдло не понимает его реальной мощности от свободы у хомячья всегда течет крыша. Я склонен считать что js мощней чем scheme. Хотя бы потому что он позволяет сделать:

function(arg){var a=1; eval(arg)} //--> 1
чего схема не позволяет

anonymous
()
Ответ на: комментарий от anonymous

Если полиморфизм high-rank, то нельзя.

Что значит «если»? Пример приведён, тут либо «да», либо «нет».

Miguel ★★★★★
()
Ответ на: комментарий от anonymous

т.е. после #define module class из крестов получается цельный окамл?

Нет, конечно.

Miguel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.