LINUX.ORG.RU

DrRacket and elisp окончательно запутался

 ,


0

3

Не могу понять уже, что я тут писал, всего-то нужна функция которая режет лист на две части и возвращает левую часть то, что я написал на ракете, не работает и не пойму почему

#lang racket
(define *distance-lst* (list 1 2 3 4 5 6))

(define *A-distance* 3)
(define *left-A-lst* '())

(define d-lst (length *distance-lst*))
(define *output-lst* '())
(define (slice input-lst a output-lst)
  (if (< (first input-lst) a)
      (slice (cons (first input-lst) output-lst)
             a
             (set! input-lst (rest input-lst)))
      output-lst))
     
;;(define (split-lst lst-input a lst-output)
;  (if (< (first lst-input) a)
 ;     (split-lst (set! lst-input (rest lst-input))
  ;                     a
   ;                    (set! lst-output
    ;                         (cons
     ;                         (first lst-input) lst-output)))
 ; lst-output))

(slice *distance-lst* *A-distance* *left-A-lst*)

и вот на elisp и работает как надо, задолбало, что не так не могу понять эту ракету

(defun slice (input-lst a output-lst)
(if (< (car input-lst) a)
(slice (cdr input-lst) a (push (car input-lst) output-lst))
output-lst))

(nreverse (slice '(1 2 3 4 5 6) 5 '()))

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

в чем спор-то?

В том, что quote и т.д. не такие. Они не определяют структуру кода, а значки являются просто специальной аббревиатурой. Поэтому применять к ним те же рассуждения что и к begin/end нельзя.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 2)
Ответ на: комментарий от no-such-file

Мне даже интересно стало.

Чем занимается, по большому счету, составной оператор, как не выделением какого-либо блока кода?

В чем принципиальная разница между {/} и begin/end?

Почему нельзя сравнивать читаемость ' и quote с читаемостью {/} и begin/end?

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

В том же в чём принципиальная разница между тчк/. и гидроэлектростанция/ГРЭС. Знаки препинания не имеют сущности слова, они не несут смысла сами по себе, а только разделяют текст на осмысленные части. Поэтому нежелательно, чтобы они выглядели как слова. Слова же сами по себе имеют смысл и не разделяют текст на какие-то части. Поэтому нежелательно, чтобы они выглядели как знаки.

Почему нельзя сравнивать читаемость

Сравнивать можно. Нельзя мотивировать использование ’ вместо quote теми же основаниями что {/} вместо begin/end - тут разные мотивы.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 2)
Ответ на: комментарий от monk

В-третьих, возможна ситуация, что всё работает пока не включится gc. Типа такого:

А это разве не проблемы реализации (sbcl), вот в chez такого точно не случится.

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

Основная проблема begin/end не в том, что больше печатать, а в том, что это визуально неотличимо от «слов» языка и замусоривает собственно текст

Это было адекватное решение во времена, когда программа отождествлялась с письменной инструкцией: начать процедуру, сложить два и два, вернуть результат, закончить процедуру. Здесь всё на своем месте, а скобочкам-разделителям места нет. А вот лисп это новый уровень программирования, когда код есть структура вычислений, а не инструкция. Никто дальше лиспа в этом направлении не продвинулся, хотя современные ЯП это больше лисп, чем алгол.

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

И я не понимаю, что за (let ... или ,@forms? В лиспе даже типы не обязательно проставлять, откуда этот ужас? Запятая и @, «» перед круглой скобкой (кстати, я забыл, как называется «`», и яндекс мне выдал «Синтаксическая ошибка», лол; гугл справился) — это нормальный синтаксис для динамического ЯП? Закапывайте, не нужно.

Вы уже не первый раз цепляетесь к ‘цитированию’, если только не к нему. Здесь три варианта: либо не осилили, либо тролите, либо поясничаете. Интерполяцию строк в питончике ведь понимаете(?), на printfе метапрограммировали небось(?), да вроде как и в расте макросы пишете(?) - здесь почти тоже самое. Обратная кавычка означает, что если вложенное выражения экранированно запятой - оно вычисляется, а результат подставляется в несущее выражение. Собачка подразумевает, что результат вычисления выражения есть список, и если так, то его содержимое, включается в несущее выражение. Прямая кавычка - собственно цитирование. Всё! Но самое интересное это то, что в макросах раста тоже есть цитирование(и как Вам уже ответили - явное, те не как в скимном syntax-rules). И есть оно потому, что это логичное и очевидное решение, когда речь идёт о метапрограммировании. Цитирование присутствует и в макросах юлии, как примера языка с рекламой макросов. А теперь представьте, что я не писал: «у раста и у юлии синтаксис макросов - это наркомания», а попробуйте пописать макросы во всех трёх языка, и сравните, в каком из них Вы ощущаете себя наиболее упоротым в процессе непосредственно написания. А уж если речь идёт про имена операторов, посмотрите на хаскелл. Там всегда такая свобода в наименовании! А как красиво получается!

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

где их нет, этих замыканий?

А где они в полном объёме есть? В C++ замыкания ограниченные, в части языков требуют явного указания захватываемых переменных. И даже в скриптовых языках, где их вроде как реализовали, не сделали второй шаг и не реализовали динамические переменные.

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

вот в chez такого точно не случится.

Падения не будет, потому что нет строгого ограничения на используемую память. А резкий всплеск использования памяти будет. И если реальной памяти не много, то внезапное активное использование свопа будет очень некстати.

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

Любое обращение в память проходит через сложную аппаратно-программную систему трансляции адресов и кэширование, и про это никогда не надо забывать.

Это понятно. Но какая бы ни было эта аппаратно-программная система, она не может сделать чтение большего набора кусочков памяти быстрее, чем непрерывного куска этой же самой памяти. Тем более, что часть технологий этой самой системы рассчитаны именно на расположение читаемых элементов подряд (линии кэша, упреждающее чтение, …). И трата лишних 8 байт на каждый элемент списка — тоже на больших списках заметна.

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

А вот лисп это новый уровень программирования, когда код есть структура вычислений, а не инструкция. Никто дальше лиспа в этом направлении не продвинулся

Prolog, Haskell

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

Теперь добавь сюда случайный или псевдослучайный доступ, и вот уже окажется, что массив уже не самая быстрая структура. А префетчер только мешаться будет, т.к. за зря потребляет TLB и кэш.

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

А самом начале я всего лишь отметил, что не всё так очевидно с массивом и списком. Вот с отсутствием SSA в SBCL всё очевидно: современные компиляторы он без этого уже не догонит.

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

Теперь добавь сюда случайный или псевдослучайный доступ, и вот уже окажется, что массив уже не самая быстрая структура.

Мы же со списком сравниваем, забыл? Или будешь доказывать, что (aref a n) работает в среднем медленнее, чем (nth n a)?

Вот с отсутствием SSA в SBCL всё очевидно: современные компиляторы он без этого уже не догонит.

Можем сравнивать C++ std:vector против std:forward_list.

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

Давай сравнивать поиск свободной памяти через битмап аллокаций и LRU-список (least recently used). Второе будет O(1) и с наиболее гарантированной «горячестью» кэша.

Я в последний раз напоминаю, что скорость работы структуры данных зависит от её применения, что массив не всегда быстрее списка, даже если использовать в лоб. Для развлечения и самообразования сделай большой массив (больше dTLB страниц) с очень разреженными данными, чтобы тупо по индексу доступ был, алгоритмически O(1), и тот же объём данных в список и разные деревья. Замерь скорость доступа, будешь удивлён.

На этой ноте отчаливаю из треда.

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