LINUX.ORG.RU

В частности вот об этом:

Сразу уж #lang liskell

Begemoth ★★★★★
()

А так мне нравится: расстаться с тёмным императивным схемным прошлым (cond, match), заимствовать полезные черты из функциональных языков (match во всех точках связывания) и расстаться с тёмным неполиморфным лисповым прошлым. Не хватает сделать базовым языком Typed Racket, а Racket с динамической типизацией транслировать в него.

Begemoth ★★★★★
()
Последнее исправление: Begemoth (всего исправлений: 1)

В частности вот об этом:

Годнота, но мне больше нравится, как это в Shen сделано.

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

Я чего-то не знаю о cond?

Я не знаю, что ты знаешь о cond. Если ни одно из условий в cond не является истинным и отсутствует ветка else, то cond возвращает #<void>, а это полезно только если значимость cond-а - в побочных эффектах, т.е. как раз тёмное императивное схемное прошлое.

Begemoth ★★★★★
()

(length (cons x y)) := (+ 1 (len y))

Именно len? Какой-то маразм, почему не сделать единообразно?

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

Это опечатка скорее всего

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

ФП + статическая типизация в обострённой форме.

aedeph_ ★★
()

А чем этот вариант не угодил? Гораздо комактней и понятней (особенно, если веток больше двух, то не приходится перед каждой имя функции писать).

(define (length* x)
    (match x
      ['() 0]
      [(cons a b) (+1 (length* b))]))
monk ★★★★★
()
Ответ на: комментарий от dave

Добавить поддержку CL.

Тогда надо придумывать свой CL с продолжениями. И с какой-то семантикой их взаимодействия с unwind-protect.

+ defmacro и фазы Racket. Хотя если под «поддержкой» подразумевается компиляция CL -> Racket, то вроде как реализуемо (отдельные пространства макросов; имена символов транслируются как пакет:имя; unwind-protect = dynamic-wind; handler-bind == локальное переопределение функций error и warning, чтобы не раскручивать стек).

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

Если ни одно из условий в cond не является истинным и отсутствует ветка else, то cond возвращает #<void>

Если использовать cond исключительно функционально, то ничего и переделывать не надо. #<void> в параметре любой функции успешно вызовет error.

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

Вероятно, они просто хаскелем заразились.

А... Ну тогда надо ещё возможность определять функции через

(foo 0) := ...
(foo (+ n 1)) := ...

Хотя если очень-очень хочется, то написать что-то типа

(haskell-define
  (foo 0) := ...
  (foo (+ n 1)) := ...)

(haskell-define
  (len '()) := ...
  (len (cons a b)) := ...)

Можно и на нынешнем racket на макросах. Но зачем?

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

Если использовать cond исключительно функционально, то ничего и переделывать не надо. #<void> в параметре любой функции успешно вызовет error.

Это поздно, результат функции не обязательно сразу используется, он ещё может быть сначала сохранён в нескольких местах.

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

Не, заразу лучше на распространять на лисп. Как статически типизированный язык ML хаскель неплох, но как динамический гомоиконный лисп - фу нафиг. Нельзя быть всем сразу.

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