> 1 <

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

Яков Замир Кацман

Members


Статус

38 сообщений

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

#7511   2015-02-28 01:32 GMT+3 часа(ов)      
Почему один фрагмент кода (верхний) прекрасно работает, а второй нет?
Помогите разобраться. Также не понимаю смысла в "лишних" скобках ((x 0 (+ x 0.1))) и ((> x 1)).



(defun f_x ()
(loop for x from 0 to 1 by 0.1
collect
(loop for y from 0 to 1 by 0.1
collect
(list x y ( + (* y y) (* x x) ))
)
)
)
 
(defun f_x ()
(do ((x 0 (+ x 0.1)))((> x 1)) collect
(do ((y 0 (+ y 0.1)))((> y 1)) collect
(list x y ( + (* y y) (* x x) ))
)
)
)

отредактировал(а) Яков Замир Кацман: 2015-03-01 02:07 GMT+3 часа(ов)
Море литературы по Лисп-у и смежным технологиям.

Valko

Members


Статус

29 сообщений

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

#7514   2015-02-28 02:50 GMT+3 часа(ов)      
do это макрос, он может быть написан на основе loop, если вкратце.
читайте спецификацию.
http://www.lispworks.com/documentation/lw60/CLHS/Body/m_do_do.htm

Яков Замир Кацман

Members


Статус

38 сообщений

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

#7516   2015-02-28 14:37 GMT+3 часа(ов)      
Тогда еще один вопрос:
(defun recursion1 (a)
(cond ((< a 10)
(progn
(format t "entering recursion1(~A)~\%" a)
(recursion1 (+ a 1))
)
)
(t (print "le fin" ))
)
)


Это рекурсия которой предлагается заменить циклы.
Почему "le fin" выводится два раза.

отредактировал(а) Яков Замир Кацман: 2015-03-01 02:06 GMT+3 часа(ов)
Море литературы по Лисп-у и смежным технологиям.

Valko

Members


Статус

29 сообщений

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

#7517   2015-02-28 15:35 GMT+3 часа(ов)      
Потому что toplevel настроен так, чтобы печатать автоматически. А тут ещё и print вызван вручную. Убери print и будет один раз.

Яков Замир Кацман

Members


Статус

38 сообщений

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

#7520   2015-02-28 22:25 GMT+3 часа(ов)      
(defun recursion-main (&optional (x 0) (y 0))
(cond
( (< y 1.0)
(recursion-main x (+ 0.1 y))
(< x 1.0)
( progn
(format t "entering recursion(~A)~\%" (+ x y))
(recursion-main (+ 0.1 x) y)
)
)
)
)



(recursion-main 0.0 0.0)
(recursion-main)


Теперь я не могу превратить это в макрос что бы передавать формулу (+ x y)

отредактировал(а) Яков Замир Кацман: 2015-03-01 02:10 GMT+3 часа(ов)
Море литературы по Лисп-у и смежным технологиям.

Valko

Members


Статус

29 сообщений

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

#7521   2015-03-01 01:04 GMT+3 часа(ов)      
Зачем макрос. Пример входных и выходных данных, теги расставь. Какую среду используешь?

Яков Замир Кацман

Members


Статус

38 сообщений

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

#7522   2015-03-01 02:02 GMT+3 часа(ов)      
(recursion-main 0.0 0.0 (+ x y)) вот то, что я хочу передать
 
вот так это работает с макросом::
 
(defmacro f_x (&rest body)
`(loop for x from 0 to 1 by 0.1
collect
(loop for y from 0 to 1 by 0.1
collect
(list x y ,@body)
)
)
)


>>
(f_x ( + (* y y) (* x x) ))


Но хочется сделать через рекурсию и без макросов. Среда LispWorks.
выходные данные точки окружности.
Море литературы по Лисп-у и смежным технологиям.

Valko

Members


Статус

29 сообщений

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

#7523   2015-03-01 12:09 GMT+3 часа(ов)      
Лучше задай этот вопрос здесь:
http://www.cyberforum.ru/lisp

misha

Moderators


Статус

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

#7524   2015-03-01 13:23 GMT+3 часа(ов)      
Цитата
Почему один фрагмент кода (верхний) прекрасно работает, а второй нет?
Потому что вы не разобрались с простейшим циклом - do. Как вариант:
 
(defun f_x1 ()
(do ((x 0 (+ x 0.1))
(r nil (cons (do ((y 0 (+ y 0.1))
(r nil (cons (list x y ( + (* y y) (* x x)))
r)))
((> y 1) (nreverse r)))
r)))
((> x 1) (nreverse r))))
но лучше поменять условия в циклах.

Яков Замир Кацман

Members


Статус

38 сообщений

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

#7525   2015-03-01 13:39 GMT+3 часа(ов)      
Да. Спасибо. Это действительно работает.
Немного смущает "r" которое здесь повторяется 6(!) раз.
И nreverse, которое используется, как мне кажется, не по назначению.
Подобный код с использованием С++ выглядит лучше?
В том плане, что мне же нужно максимально простое решение.
В любом случае: Спасибо.
Море литературы по Лисп-у и смежным технологиям.

misha

Moderators


Статус

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

#7526   2015-03-01 13:40 GMT+3 часа(ов)      
Цитата
(f_x ( + (* y y) (* x x) ))

Но хочется сделать через рекурсию и без макросов. Среда LispWorks.
выходные данные точки окружности.
А зачем вам здесь рекурсия и тем более макрос? Используйте функцию, например,
(f_x (lambda (x y) ( + (* y y) (* x x))))

Яков Замир Кацман

Members


Статус

38 сообщений

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

#7527   2015-03-01 13:43 GMT+3 часа(ов)      
Так ведь: либо Два вложенные друг в друга цикла. Либо рекурсия.
А какие еще варианты перебора декартова произведения?


А макрос нужен потому что я хочу вставлять формулу "как она есть"
Море литературы по Лисп-у и смежным технологиям.

misha

Moderators


Статус

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

#7528   2015-03-01 13:47 GMT+3 часа(ов)      
Цитата
Немного смущает "r" которое здесь повторяется 6(!) раз.
Это простейший цикл, поэтому его достаточно редко используют на практике, предпочитая более удобный loop.
Цитата
И nreverse, которое используется, как мне кажется, не по назначению.
Это самое простое решение, конечно, лучше изменить условия циклов.

misha

Moderators


Статус

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

#7529   2015-03-01 13:50 GMT+3 часа(ов)      
Лучше используйте циклы, т.к. CL не предусматривает оптимизацию хвостовых вызовов.

Яков Замир Кацман

Members


Статус

38 сообщений

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

#7530   2015-03-01 13:58 GMT+3 часа(ов)      
Понятно. Тут скорее всего речь будет идти о том, что бы это проводить расчет на С и вызывать через CFFI. Я как бы был к этому готов, просто меня
интересовали сами границы применимости лисп-а. Я получил ответ.
Буду читать Черча, разберемся
Море литературы по Лисп-у и смежным технологиям.

misha

Moderators


Статус

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

#7531   2015-03-01 13:59 GMT+3 часа(ов)      
Цитата
А макрос нужен потому что я хочу вставлять формулу "как она есть"
Кстати, а меня вот смущают не связанные переменные: x и y?

Яков Замир Кацман

Members


Статус

38 сообщений

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

#7532   2015-03-01 14:02 GMT+3 часа(ов)      
Да в этом вы правы. Это скорее aux, чем оptional
Море литературы по Лисп-у и смежным технологиям.

misha

Moderators


Статус

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

#7533   2015-03-01 14:04 GMT+3 часа(ов)      
Цитата
Тут скорее всего речь будет идти о том, что бы это проводить расчет на С и вызывать через CFFI.
Я уже не раз наступал на грабли CFFI, поэтому стараюсь все писать на лиспе. Тем более, что с числами лисп работает гораздо лучше Си.

Яков Замир Кацман

Members


Статус

38 сообщений

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

#7536   2015-03-07 16:56 GMT+3 часа(ов)      
Работающий вариант:

(do ((x 0 (+ x 0.1)))
((> x 1))
(do ((y 0 (+ y 0.1)))
((> y 1))
(format t "~,2f - ~,2f : ~,4f ~%" x y ( + (* y y) (* x x)))
)
)


BNF:

(do ({var | (var [init-form [step-form]])}*)
(end-test-form result-form*)
declaration*
{tag | statement}*)

ну или такой вариант:
 
(let (c)
(block nested-loops
(do ((x 0 (+ x 0.1)))
((> x 1))
(do ((y 0 (+ y 0.1)))
((> y 1))
(push ( + (* y y) (* x x)) c)
)
)
(return-from nested-loops c)
)
)


Тему можно закрывать.

отредактировал(а) Яков Замир Кацман: 2015-03-07 17:20 GMT+3 часа(ов)
Море литературы по Лисп-у и смежным технологиям.
> 1 <


Онлайн :

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




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