> 1 <

Автор Сообщение

Paul Alkhimov

Members


Статус

11 сообщений

Где: Ukraine
Род занятий:
Возраст:

#996   2009-12-30 14:45 GMT+3 часа(ов)      
Я прошу прощения за то, что создана новая тема, а не продолжается предыдущая, но на это есть причины.

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

Вопрос в следующем: в чём недостатки реализации моих функций (линк на код в конце сообщения) через макросы?
И второй вопрос вдогонку: макросы использованы также для вызова кода внутри их, переданных как простые формы. Чем лучше было бы вызывать лямбда-функцию внутри обычной функции вместо предложенного решения?

Линк на исходный код: http://lisp-raytracer.blogspot.com/2009/12/obj-file-format.html

P.S. Если кто-то знает реализацию подобной функциональности в какой-то библиотеке, подскажите пожалуйста. Мне кажется, что я изобретаю велосипед с очередными восьмиугольными колёсами...

gihar

Moderators


Статус

249 сообщений

Где: --- да вот он я? приехал уже из Катманду
Род занятий: конкретный
Возраст: 0

#997   2009-12-30 15:59 GMT+3 часа(ов)      
Недостаток главный есть. Все это писано Лиспом - то есть
проблемы твои - в иллюзиях созданых тобою же.;=))

С виду функции нормальные и отражают сбалансированый темперамент
и высокий интеллектуальный потенциал их создателя.

Но исходя из того что можно придумать тысячу способов как это сделать то вывод такой-

Если ты испытываешь кайф от вида и употребления своих функций(макросов) то цель достигнута.

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

За велосипеды не беспокойся-они всегда актуальны.
По сути даже твоя жизнь это уже пройденый кем то велосипед. Тебе остается побольше
ошибок сделать , что бы она стала уникальной.(и кому то даже интересной)

И еще , если ты такие куски кода показываешь , то коментируй каждую строчку(тока не на англицком(форум русский)) и приведи пример использования.
Мы ж тут все студенты , учимся.

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


С Наступающим!!!

P.S.
(на грабли)

отредактировал(а) gihar: 2009-12-30 20:22 GMT+3 часа(ов)
Это было точно последнее редактирование

VH

Members


Статус

289 сообщений

Где: ---
Род занятий:
Возраст:

#998   2009-12-30 17:47 GMT+3 часа(ов)      
В LISPе 'строчка' не является единичным элементом.

gihar

Moderators


Статус

249 сообщений

Где: --- да вот он я? приехал уже из Катманду
Род занятий: конкретный
Возраст: 0

#999   2009-12-30 19:41 GMT+3 часа(ов)      

отредактировал(а) gihar: 2009-12-30 23:50 GMT+3 часа(ов)
Это было точно последнее редактирование

Paul Alkhimov

Members


Статус

11 сообщений

Где: Ukraine
Род занятий:
Возраст:

#1008   2009-12-31 21:30 GMT+3 часа(ов)      
Вот мой прокомментированный код:

 
; этот макрос перебирает все строки файла и для каждой строки вызывает форму "body", при этом внутри строки доступен символ "line", связанное значение которого - это текущая считанная строка. Хотелось иметь бы всю эту конструкцию в виде функтора, который бы можно было использовать в стиле (map #'(lambda (line) (bla-bla-bla...)) Однако я не могу себе представить простого способа это сделать (учитывая, что мне нужно как-то прозрачно открывать файл и закрывать его по окончании.
(defmacro for-each-line (file line body) ; определение макроса. параметры описаны в предыдущем абзаце.
"Takes all lines from the file one by one."
`(with-open-file (s ,file :direction :input) ; открываем файл "file" и получаем поток "s" из которого будем читать
(let ((r nil) (eof-reached nil)) ; два временных значения ("r" просто игнорируется, "eof-..." - признак завершения файла
(loop while (not eof-reached) do ; привычный цикл
(multiple-value-setq (,line eof-reached) (read-line s r)) ; возвращаемые значения (2 шт.) привязываются к символу, который передаётся как "line" и "eof-reached".
(if ,line ,body))))) ; так как это простой макрос, внутри тела "body" будет присутствовать символ, который передаётся в макрос как "line". В этом единственная причина присутствия второго параметра макроса: мы просто задаём имя символа для доступа к прочитанной из файла строке. Можно было бы обойтись и без этого параметра, но тогда имя символа макрос выбирал бы как-то сам и было бы возможно пересечение имён в дальнейшем.
 
 
; Этот душераздирающий макрос просто читает три значения типа double-float из предоставленной ему строки v-line. Читает он эти значения в вектор vertexes, начиная с индекса index. После завершения значение, связанное с index, увеличивается на три. Кроме того, у макроса есть опциональный параметр count-only, который, если не равен nil, запрещает изменение вектора vertexes, т.е. просто ведёт подсчёт значений, которые следует прочесть из строки. Это нужно для того, чтобы сначала можно было бы оценить размер массива данных, который необходимо создать, а потом уже (вторым проходом) этот массив можно заполнять. Цена этому решению - двойной проход по данным, т.е. на время, потраченное на чтение данных из файла. На данной задаче я считаю, что этим временем можно пренебречь. Кроме того, в нормальных операционках файлы должны кэшироваться (а я читаю файл два раза подряд без паузы), так что потерь не должно быть практически вообще.
(defmacro read-vertex-data (v-line vertexes index &key count-only)
"Reads three floats from the given line to the vertexes array starting with index.
Index is increased and returned as a result afterwards."

`(let* ((trimmed-line (string-trim '(#\Space #\Tab #\Newline) ,v-line))) ; отгрызаем пробелы и табы (и CRLF зачем-то тоже) в строку trimmed-line
(if (and (> (string-size-in-octets trimmed-line) 2) ; если символов больше двух
(char= #\v (char trimmed-line 0)) ; и при этом первый символ - это v
(or (char= #\Space (char trimmed-line 1)) ; а второй - это пробел
(char= #\Tab (char trimmed-line 1)))) ; или таб, то...
(let* ((trash1 t) (trash2 t) ; задаются четыре временных значения: два (trash1 и trash2) временных и два
(val 0d0) ; значение, которое считывается
(start-from 2)) ; а также индекс символа, начиная с которого мы читаем значения
(progn ; далее три раза:
(multiple-value-setq (val start-from) (read-from-string trimmed-line trash1 trash2 :start start-from)) ; читаем флоат
(if ,vertexes (setf (aref ,vertexes ,index) (coerce val 'double-float))) ; если есть массив (не равен nil), кладём значение в него
(incf ,index) ; увеличиваем индекс в массиве
(multiple-value-setq (val start-from) (read-from-string trimmed-line trash1 trash2 :start start-from))
(if ,vertexes (setf (aref ,vertexes ,index) (coerce val 'double-float)))
(incf ,index)
(multiple-value-setq (val start-from) (read-from-string trimmed-line trash1 trash2 :start start-from))
(if ,vertexes (setf (aref ,vertexes ,index) (coerce val 'double-float)))
(incf ,index)
,index))))) ; возвращаем индекс, на котором остановились. в этом нет необходимости в данном случае, так как значение, связанное с index увеличивается по ходу макроса
 
; эта функция (я не вижу причин делать её макросом) берёт на вход имя файла и возвращает созданный массив вещественных значений после своей работа
(defun take-vertexes (file)
"Takes all found vertexes from the given file to the given array.
Returns the number of the read floats, not vertexes!"

(let* ((count ; первый раз я просто вычисляю количество значений, которые будут считаны и кладу это значение в count
(let ((i 0)) (for-each-line file line (read-vertex-data line nil i)) i)) ; only count, no store
(temporar-vertexes (make-array count :element-type 'double-float)) ; далее я создаю массив под названием temporar-vertexes
(actually-read-floats 0)) ; и ставлю счётчик на начало массива
(for-each-line file line (read-vertex-data line temporar-vertexes actually-read-floats)) ; далее я просто заполняю массив
temporar-vertexes)) ; и возвращаю его как результат. я искренне надеюсь при этом, что копируется только символ, а не значение всего массива. этот вопрос я ещё не прояснял, поэтому буду благодарен за объяснение
 


Комментарии искренне приветствуются!

P.S. Скопируйте текст в любой текстовый редактор, так как форум не в состоянии сам переносить строки в коде.

Alex

Members


Статус

54 сообщений

Где: Belarus Александранск
Род занятий:
Возраст: 28

#1010   2010-01-01 00:00 GMT+3 часа(ов)      
> Вот мой прокомментированный код:
О мой бог!

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#1012   2010-01-01 14:48 GMT+3 часа(ов)      
>P.S. Скопируйте текст в любой текстовый редактор, так как форум не в состоянии сам переносить строки в коде.
А так нельзя было
; этот макрос перебирает все строки файла и для каждой строки 
; вызывает форму "body", при этом внутри строки доступен символ "line",
; связанное значение которого - это текущая считанная строка.
; Хотелось иметь бы всю эту конструкцию в виде функтора, который бы можно
; было использовать в стиле (map #'(lambda (line) (bla-bla-bla...))
; Однако я не могу себе представить простого способа это сделать
; (учитывая, что мне нужно как-то прозрачно открывать файл и закрывать
; его по окончании.

Paul Alkhimov

Members


Статус

11 сообщений

Где: Ukraine
Род занятий:
Возраст:

#1014   2010-01-01 16:29 GMT+3 часа(ов)      
Цитата
misha :
>P.S. Скопируйте текст в любой текстовый редактор, так как форум не в состоянии сам переносить строки в коде.
А так нельзя было

Можно было.
Претензия принята.

Paul Alkhimov

Members


Статус

11 сообщений

Где: Ukraine
Род занятий:
Возраст:

#1016   2010-01-01 16:51 GMT+3 часа(ов)      
Вообще-то это показательно, по делу сказал только VH и gihar "обнадёжил", что есть готовые прокомментировать лисперы.

Fallen_s4e

Members


Статус

114 сообщений
http://lisper.ru
Где: Zimbabwe lisper.ru
Род занятий: fallen_s4e
Возраст: 5

#1017   2010-01-01 19:41 GMT+3 часа(ов)      
Кое-что прокомментирую:
Цитата
(let* ((trash1 t) (trash2 t) ; задаются четыре временных значения: два (trash1 и trash2) временных и два

(val 0d0) ; значение, которое считывается

(start-from 2)) ; а также индекс символа, начиная с которого мы читаем значения

(progn ; далее три раза:

(multiple-value-setq (val start-from) (read-from-string trimmed-line trash1 trash2 :start start-from)) ; читаем флоат

(if ,vertexes (setf (aref ,vertexes ,index) (coerce val 'double-float))) ; если есть массив (не равен nil), кладём значение в него

(incf ,index) ; увеличиваем индекс в массиве

(multiple-value-setq (val start-from) (read-from-string trimmed-line trash1 trash2 :start start-from))

(if ,vertexes (setf (aref ,vertexes ,index) (coerce val 'double-float)))

(incf ,index)

(multiple-value-setq (val start-from) (read-from-string trimmed-line trash1 trash2 :start start-from))

(if ,vertexes (setf (aref ,vertexes ,index) (coerce val 'double-float)))

(incf ,index)

,index))

Не обязательно(вроде) использовать progn.
И почему нельзя циклом, если последние строчки - полный копипаст?

отредактировал(а) Fallen_s4e: 2010-01-01 19:46 GMT+3 часа(ов)

Paul Alkhimov

Members


Статус

11 сообщений

Где: Ukraine
Род занятий:
Возраст:

#1020   2010-01-02 01:01 GMT+3 часа(ов)      
Цитата
Fallen_s4e :
Кое-что прокомментирую:
Не обязательно(вроде) использовать progn.
И почему нельзя циклом, если последние строчки - полный копипаст?


Спасибо за комментарий!
Действительно, можно было использовать цикл из трёх итераций, потому что это полный копипаст, однако я писал код постепенно и этот развёрнутый цикл - результат пошаговой разработки. Верно, нужно будет сократить.
Что касается явного progn внутри неявного progn'а - это точно так же результат пошаговой разработки, я забыл подчистить. Видимо, лежало это изначально внутри if'а, а там, как понимаете, без явного или неявного progn'а не обойтись.

Paul Alkhimov

Members


Статус

11 сообщений

Где: Ukraine
Род занятий:
Возраст:

#1026   2010-01-02 02:17 GMT+3 часа(ов)      
Вариант причёсанный:
(defmacro read-vertex-data (v-line vertexes index &key count-only)
"Reads three floats from the given line to the vertexes array starting with index.
Index is increased and returned as a result afterwards."

`(let* ((line (string-trim '(#\Space #\Tab #\Newline) ,v-line)))
(if (and (> (string-size-in-octets line) 2)
(char= #\v (char line 0))
(or (char= #\Space (char line 1)) (char= #\Tab (char line 1))))
(let* ((t1 t) (t2 t) (val 0d0) (start-from 2))
(dotimes (ii 3)
(multiple-value-setq
(val start-from)
(read-from-string line t1 t2 :start start-from))
(if ,vertexes (setf (aref ,vertexes ,index) (coerce val 'double-float)))
(incf ,index))
,index))))

gihar

Moderators


Статус

249 сообщений

Где: --- да вот он я? приехал уже из Катманду
Род занятий: конкретный
Возраст: 0

#1031   2010-01-02 17:24 GMT+3 часа(ов)      
Paul Alkhimov:

Где твоя проблема? В упор не видно?

Не знаешь что возращает твоя функция - проверь.
Не знаешь как функтор ввернуть в макрос , тогда причем тут весь этот код?

Все эти вопросы носят чисто программерский характер - то бишь берешь
и тренируешься день-два ,заодно получаешь опыт и кайф и публикуешься , то.есть радуешь нас своими успехами. :=))
Задавать вопрос нужно по конкретному-тупиковому для себя делу.
А тут вроде и сказать то нечего.
Это было точно последнее редактирование

Paul Alkhimov

Members


Статус

11 сообщений

Где: Ukraine
Род занятий:
Возраст:

#1034   2010-01-02 18:29 GMT+3 часа(ов)      
Цитата
gihar :
В упор не видно?



Мне проблема видна и именно о ней и был задан вопрос, а точнее целых три:
Вопрос в следующем: в чём недостатки реализации моих функций (линк на код в конце сообщения) через макросы?
И второй вопрос вдогонку: макросы использованы также для вызова кода внутри их, переданных как простые формы. Чем лучше было бы вызывать лямбда-функцию внутри обычной функции вместо предложенного решения?
P.S. Если кто-то знает реализацию подобной функциональности в какой-то библиотеке, подскажите пожалуйста.


Цитата
gihar :
Задавать вопрос нужно по конкретному-тупиковому для себя делу.
А тут вроде и сказать то нечего.



Вопросы я переформулирую, может это что-то и даст...
1) Как изменять (и возможно ли это вообще) значения переменных, которые переданы мне снаружи как параметры?
2) Код громоздок. Что я делаю неправильно в этом направлении?
3) Как перебирать строки файла?

Paul Alkhimov

Members


Статус

11 сообщений

Где: Ukraine
Род занятий:
Возраст:

#1035   2010-01-02 18:50 GMT+3 часа(ов)      
Вот, например, мне пришла в голову такая мысль: если переопределить reader, то я смогу просто втянуть код obj файла как лисп-код и исполнить его, что звучит интересно, так как делает программу понятнее (как переопределять ридер, правда, я пока не знаю). И это будет DSL моего файла OBJ, а не типичная читалка файла, которая делается, например, на Си и втягивает данные "руками", вместо того, чтобы дать это сделать уже существующему reader'у. (Справедливости ради стоит отметить, что в Си нет reader'а в лисповом смысле.

Кто-нибудь может привести пример переопределяемого ридера?

Fallen_s4e

Members


Статус

114 сообщений
http://lisper.ru
Где: Zimbabwe lisper.ru
Род занятий: fallen_s4e
Возраст: 5

#1041   2010-01-03 02:21 GMT+3 часа(ов)      
1):
;Здесь на форуме писали:
(defun swap (a b)
(rotatef (symbol-value a) (symbol-value b)))
(swap 'a 'b)
Либо
(defmacro swap(x y)
(let ((k (gensym)))
`(progn
(setf ,k ,x)
(setf ,x ,y)
(setf ,y ,k))))
(swap a b)

Цитата
(и возможно ли это вообще)

Здесь
Разжевано донельзя.

Paul Alkhimov

Members


Статус

11 сообщений

Где: Ukraine
Род занятий:
Возраст:

#1042   2010-01-03 03:40 GMT+3 часа(ов)      
Fallen_s4e - спасибо, посмотрю ещё раз. Видимо, я чего-то недопонял.

gihar

Moderators


Статус

249 сообщений

Где: --- да вот он я? приехал уже из Катманду
Род занятий: конкретный
Возраст: 0

#1043   2010-01-03 08:16 GMT+3 часа(ов)      
Если тебе кажется что код громоздок значит ты испльзуешь много отдельных переменных.
А должен использовать структуры , списки , объекты.(ООП)
Это было точно последнее редактирование

Paul Alkhimov

Members


Статус

11 сообщений

Где: Ukraine
Род занятий:
Возраст:

#1044   2010-01-03 13:09 GMT+3 часа(ов)      
Цитата
gihar :
Если тебе кажется что код громоздок значит ты испльзуешь много отдельных переменных.
А должен использовать структуры , списки , объекты.(ООП)


Хорошо, однако у ООП (CLOS) есть особенность, которая слабо укладывается в моей голове: это накладные расходы. Как по памяти, так и по производительности. Если посмотреть на мой старый код, то там есть следующее (копипаст):
(defgeneric 2- (a b) (:documentation "Difference between two entities."))
(defgeneric 2+ (a b) (:documentation "Sum of two entities."))
(defun add (&rest args) (reduce #'2+ args))
(defun sub (&rest args) (reduce #'2- args))
 
(defmethod 2- ((a 3D-Vector) (b 3D-Vector))
(if (null a)
(if (null b)
(V3 0 0 0)
(V3 (- (3D-Vector-x b)) (- (3D-Vector-y b)) (- (3D-Vector-z b))))
(if (null B)
A
(V3 (- (3D-Vector-x A) (3D-Vector-x b))
(- (3D-Vector-y A) (3D-Vector-y b))
(- (3D-Vector-z A) (3D-Vector-z b))))))
 

Ну и так далее в таком же духе.
Но это всё очень похоже (за мелкими различиями) на С++. А с С++ у меня всё в порядке, поэтому такое решение для меня интереса не представляет. Мне нужно понять, как это делается кратко, элегантно, правильно на лиспе, на не на С++, переведенном на лисп. Именно поэтому я не использую классы. Я не говорю, что я их вообще не буду использовать, просто моя первая попытка это сделать привела к неожиданному и ненужному результату...
Ёлки-палки, чуть не забыл сказать о накладных расходах: сами по себе классы и структуры, хоть и неизвестны мне по расходам, но допускаю, что могут быть недорогими или даже бесплатными в плане занимаемого места. Но ускорить дженерики я не знаю как. А на них всё стоит. Если знаете, как можно их сделать дешёвыми, а лучше бесплатными, расскажите! Я мгновенно перепрыгну на мультиметоды (в конце концов, опыт ООП есть, хорошо было бы его использовать).

отредактировал(а) Paul Alkhimov: 2010-01-03 13:17 GMT+3 часа(ов)

antares0

Members


Статус

185 сообщений

Где: Russia
Род занятий:
Возраст:

#1049   2010-01-03 20:37 GMT+3 часа(ов)      
Цитата
Paul Alkhimov :
Вообще-то это показательно, по делу сказал только VH и gihar "обнадёжил", что есть готовые прокомментировать лисперы.


Матерые все же на lisper.ru и lg://lisp_ru

antares0

Members


Статус

185 сообщений

Где: Russia
Род занятий:
Возраст:

#1050   2010-01-03 20:53 GMT+3 часа(ов)      



Вопросы я переформулирую, может это что-то и даст...
1) Как изменять (и возможно ли это вообще) значения переменных, которые переданы мне снаружи как параметры?
2) Код громоздок. Что я делаю неправильно в этом направлении?
3) Как перебирать строки файла?


1. Как параметры передаются только значения. Этим значением может быть символ с value-слотом (переменная) или контейнеры: списки, структуры, объекты.
special переменные отдельный случай
2. Много присваиваний setf, *setq и.т.д
3. with-open-file далее работаем с потоком. Как частное (но хорошее) решение iterate

antares0

Members


Статус

185 сообщений

Где: Russia
Род занятий:
Возраст:

#1051   2010-01-03 20:58 GMT+3 часа(ов)      
http://lisper.ru/articles/cl-vars
Про special и лексические переменные. ЛикБез

Paul Alkhimov

Members


Статус

11 сообщений

Где: Ukraine
Род занятий:
Возраст:

#1052   2010-01-03 21:29 GMT+3 часа(ов)      
Цитата
antares0 :
Матерые все же на lisper.ru и lg://lisp_ru


На лиспер.ру не пускает (хотя регистрацию я и прошёл), просто молча возвращает на страницу входа. Если можно этот вопрос провентилировать с администрацией сайта, было бы хорошо.Уникальная система, она неправильно реагировала на наличие пробела в имени. Без пробела всё работает...
А lg://lisp_ru как правильно расшифровать-то?

отредактировал(а) Paul Alkhimov: 2010-01-03 21:58 GMT+3 часа(ов)

antares0

Members


Статус

185 сообщений

Где: Russia
Род занятий:
Возраст:

#1053   2010-01-03 21:58 GMT+3 часа(ов)      
в конфе на jabber.ru постучать archimag-у

antares0

Members


Статус

185 сообщений

Где: Russia
Род занятий:
Возраст:

#1054   2010-01-03 22:07 GMT+3 часа(ов)      

gihar

Moderators


Статус

249 сообщений

Где: --- да вот он я? приехал уже из Катманду
Род занятий: конкретный
Возраст: 0

#1100   2010-01-09 11:14 GMT+3 часа(ов)      
Цитата
Paul Alkhimov :
Цитата
gihar :
В упор не видно?





Мне проблема видна и именно о ней и был задан вопрос, а точнее целых три:
Вопросы я переформулирую, может это что-то и даст...
1) Как изменять (и возможно ли это вообще) значения переменных, которые переданы мне снаружи как параметры?
2) Код громоздок. Что я делаю неправильно в этом направлении?
3) Как перебирать строки файла?




По вопросу про переменные. Лисп по особому относится к переменным , хочешь что бы они были и они будут.
А на самом деле в лиспе их вроде бы и нету ,
при правильном подходе они не нужны.
Если хочешь взаимодействовать с Сишными программами и функциями
то надо вовлекать тип foreign для windows или cffi.

По второму вопросу - автор не правильно отобразил проблему.
надо спрашивать не "Код громоздок.Что я делаю неправильно" ,
а так примерно:
"помогите выпилить быдлокод из моего религиозно-тяглового(понимать скотского) скрипта"

Ну а как перебирать строки (чтить файлы)?
-как-как- , - стандартными средствами. Ты еще спроси как в сартире себя вести. Если не знаешь функцию то так и спроси.


P.S.
И вообще Paul Alkhimov если ты диби-болдер что до сих пор свои комменты не исправил(тя ж люди просили по человечески)
у меня Оперу растянуло , кнопку "Готово" унесло вправо.

отредактировал(а) gihar: 2010-01-09 13:05 GMT+3 часа(ов)
Это было точно последнее редактирование

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#1105   2010-01-09 23:56 GMT+3 часа(ов)      
2 Paul Alkhimov:
А чЁ те не нравиться? Работает ведь. Да и как я вижу, код рассчитан для разового использования. Т.е. зачем его улучшать?
Короче, задайте вопрос Полу Грэхему(какому именно решать вам)

nolisper

Members


Статус

1 сообщений

Где: Afghanistan
Род занятий:
Возраст:

#1106   2010-01-10 00:48 GMT+3 часа(ов)      
Если работает для вас и вам нравиться, то все хорошо. Хотя я вобоще не вижу смысла делать то, что вы делаете, через макросы. Я даже с трудом представляю, для чего понадобилось так делать.

По макросам читаем книжку "On Lisp" by Paul Graham. Там есть раздел "When to use macros".

> Мне нужно понять, как это делается кратко, элегантно, правильно на лиспе,

Правильно на Лиспе, это когда просто и понятно, а не эзотерически. "Programs must be written for people to read, and only incidentally for machines to execute." (c) Abelson & Sussman

> Ускорения, накладные расходы и т.д.

"We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil" (с) Donald Knuth




Я бы над стилем работал (то есть учил бы дальше азы лиспа и изучал код других):
(loop while (not something) ... это (loop until (something) ...
(if something ()) это (when something ())
и т.д. ...

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#1112   2010-01-10 17:57 GMT+3 часа(ов)      
Насчет макросов замечание верное.
> 1 <


Онлайн :

0 пользователь(ей), 23 гость(ей) :




Реклама на сайте: