Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LISP > Циклы в Lisp


Автор: turtys 26.9.2006, 19:49
Как в лисп моэжно организовывать циклы с подобный циклу for(;;) из С++, а то с DO уже намучался до невозможности не пашет и все (

Автор: Lisp2D 26.9.2006, 21:07
(defmacro for ((i n) &rest tasks)
 `(do ((,i 0))
  ((>= ,i ,n))
  ,@tasks))

(for (j (length "abcd"))
 ...using j...
  (setf j (1+ j)))

Автор: Void 26.9.2006, 21:26
Lisp2D, зачем, если есть loop?
Код
(loop for i from 1 to 10 do
    (format t "~D" i))

Автор: turtys 26.9.2006, 21:49
РЕбят что то все рано не получаеться, на С++ набомбил но надо на лиспе
Код

#include<stdio.h>
#include<math.h>
float F(float x);
main()
{int k;
float a,b,x,y,z,L;
a=-5;
b=10;
x=(a+b)/2;
L=fabs(b-a); //Взятие по модулю
for(k=0;L>0.005;k++)
    {y=a+L/4;
      z=b-L/4;
           if(F(y)<F(x))
            {b=x;
              x=y;
              }
      else if(F(z)<F(x))
         {a=x;
                       x=z;
          }
    else {a=y;
                         b=z;
          }
                L=fabs(b-a);
}
float F(float x)
{float X;
X=x*x*x*x;
return X;
}



Пытаюсь вот это переписать на лиспе, но пока получилось вот что:
Код

(defun  F (x)
(* x x x x))

(let* ((a -5)
         (b 10)
         (xsr(/(+ a b) 2))
         (L (abs(- b a)))
         (y (+ a (/ (abs L) 4)))
         (z (- b (/ (abs L) 4))))       
  (do ((k 0 (+ k 1)))
      ((< L 0.005 (print xsr))
       (cond ((< (F y) (F xsr)) (let* ((b xsr)
                                                  (xsr y)
                                                  (L (abs(- b a))))))
                                                                    
                ((< (F z) (F xsr)) (let* ((a xsr)
                                                  (xsr z)
                                                  (L (abs(- b a))))))
                ((> (F z) (F xsr)) (let* ((a xsr)
                                                  (xsr z)
                                                  (L (abs(- b a))))))))))
И все это (я имею ввиду на лиспе) не цензура не пашет, знаний и опыта не хватает, програма должна реализовывать метод дихотомии (методы отимизации). Конечно то что я написал на лиспе может быть и полный бред ), но пока сидел разбирался пришел только к этому.Тот что на С++ реализован полность правильно, вот хотелось бы его переписать на лиспе, помогите плз.

Автор: Void 27.9.2006, 01:35
Очень интересный стиль написания кода на C++. При чтении вызывает желание застрелиться или найти автора и сделать ему… плохо.
Метод дихотомии:
Код
(defun find-minimum (f a b eps)
    (let ((d (- b a)))
        (if (< d eps)
            (* (+ a b) 0.5)
            (let* ((x (+ a (* d 0.25)))
                    (y (- b (* d 0.25)))
                    (fx (funcall f x))
                    (fy (funcall f y)))
            (cond
                ((< fx fy) (find-minimum f a y eps))
                ((> fx fy) (find-minimum f x b eps))
                (t (find-minimum f x y eps)))))))

; Пример использования: точка минимума f(x) = (x - 1)^2 на (-5; 5) c погрешностью 0.01
(find-minimum #'(lambda (x) (* (- x 1) (- x 1))) -5 5 0.01)

Автор: turtys 27.9.2006, 17:04
to Void Спасибо тебе все работает, только не мог бы ты пояснить некоторые строчки:
 
(fx (funcall f x)) я так понял примерно что тут х подставляется в лямбда выражение которое мы пишем в вызове функции, только интересен сам механизм и что значит funcall
И еще в конце выводиться ответ, а в каком месте проги прописан вывод этого ответа?


И еще я хочу сделать прогу визуальной, и т.е. получиться должно что нибудь типо есть форма на ней кнопка и edit, мы тыркаем на кнопку а результат выводиться в edit, сейчас я попробовал, но не знаю как прописать вывод в edit и вообще ли можно так в лиспе делать. И Void как сделать что бы функция и все параметры в код были вбиты намертво, т.е. мне нужна это прога для определенной функции, и для определенный остальных значений, т.е. погрешность и a и b все задано, как их вбить что бы не надо было каждый раз их вводить, а просто тыркали на кнопку и результат выводился в едит?

Для кнопки я прописываю вот так для примера :

Код

(defun form1-button4-on-click (dialog widget)
  (declare (ignore-if-unused dialog widget))
  
(car '(a b c))

  t)
 Я в правильном месте пишу код? Если да то как результат вывести в едит? 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)