LINUX.ORG.RU

Почему в scheme не любят set! ?

 , ,


2

2

Может, кто-нибудь знает, почему в Scheme (и в Racket) не приянто использовать set!, особенно в списках

Например, если мне надо список разделить на два по «выполняется/не выполняется условие», то в CL это будет выглядеть как

(defun split (list pred)
  (let ((res1 nil) (res2 nil))
     (dolist (l list)
        (if (pred l)
            (push l res1)
            (push l res2)))
     (values (nreverse res1) (nreverse res2))))

На Scheme полный аналог

(define (split list pred)
  (let ([res1 null] [res2 null])
     (for-each (lambda (l)
                 (if (pred l)
                    (set! res1 (cons l res1))
                    (set! res2 (cons l res2))))
          list)
     (values (reverse res1) (reverse res2))))

Но в учебниках по Scheme пишут, что так писать очень плохо, а надо так:

(define (split list pred)
   (define (loop list res1 res2)
     (cond
       [(null? list) (values (reverse res1) (reverse res2))]
       [else
         (if (pred (car list))
             (loop (cdr list) (cons (car list) res1) res2)
             (loop (cdr list) res1 (cons (car list) res1)))]))
   (loop list null null))
,мол, это понятнее.

Помогите понять, в чём смысл?

★★★★★

Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от buddhist

Просто предпочитают функциональный стиль

Это я понял. Но не понял, почему.

Я понимаю, когда приходится предпочитать функциональный стиль в Haskell, SQL, XSLT. Но ведь Scheme полноценный лисп! Или это такая аскеза?

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

Но ведь Scheme полноценный лисп!

Смотря что считать полноценным. Если Common Lisp, то R7RS-small-Scheme вообще ущербен.

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

Если Common Lisp, то R7RS-small-Scheme

Можем сравнивать Common Lisp и Racket. Они одной весовой категории.

А вот традиции... В Racket неизменяемые списки, нелюбовь к set! и макросам (почти везде, где в CL макрос с body, в Racket функция с параметром-функцией). Пытаюсь понять, это чем-то обусловлено или как писали в одном учебнике «вариант без set! будет проще понять людям, которые не знают, что такое пременная»

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

Думаю, это тоже наследие Scheme. Батарейки батарейками, но дух Scheme (lambda — единственный инструмент абстракции) и общая wannabe-функциональщина остаётся.

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

А почему вообще чистую функциональность хаскеля выдают за фичу?

Изначально, насколько я помню, как фича для оптимизатора. То есть пишешь ты x = f(a), y = g(a), а оптимизатор может f и g посчитать в другом порядке, а то и вообще параллельно. А если вдруг a — константа, так и вообще сразу вычислить при компиляции.

Затем надо было объяснить, почему это удобно программисту :-) И начался пиар «отсутствие возможности менять переменные лучше, чем её наличие». :-)

monk ★★★★★
() автор топика
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от monk

И начался пиар «отсутствие возможности перейти в произвольное место в программе в любой момент времени лучше, чем её наличие».

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

А шо, схема тоже умеет такие оптимизации?

(Хотя вычислять аргументы в произвольном порядке, если можно, щас кто только не умеет)

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

И начался пиар «отсутствие возможности пейсать программы, наращивая при этом критическую массу быдла дрочащего на структурное программирование оптимизацию и факториалы, лучше, чем её наличие».

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

Кстати, не все в восторге. Вот что, например Товальдс пишет:

No, you've been brainwashed by CS people who thought that Niklaus Wirth

actually knew what he was talking about. He didn't. He doesn't have a frigging clue.

Полностью тут

Встречал я словечки и покрепче.

Так же эту точку зрения, ЕМНИП, не разделяли Кнут, Макконнел, и еще многие ученые.

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

Просто он никогда не имел дело с идеоматичным fortran кодом с обильными GOTO, COME FROM и ENTRY. Также нельзя не заметить, что единственный фактический аргумент Линуса был не отсутствие произвольного goto, а об отсутствии break'а в паскале.

Так-то частенько они хороши с точки зрения читаемости тривиальных алгоритмов. Раз в тысячелетие.

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

А шо, схема тоже умеет такие оптимизации?

Кто-то умеет, кто-то нет. Емнип, Gambit, Bigloo и Chicken умеют. Пруфов не будет, лениво искать сейчас.

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

Изучи хаскель - поймёшь. А в двух словах уже много раз объяснили, раз у тебя 5 звёзд наверняка видел (но, видно, не понял).

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