Путь к истине

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



LISP

Сообщений 1 страница 5 из 5

1

Давайте на Лиспе писать.
для затравки функция по решению квадратного уравнения.

Код:
(defun qudrat(a b c)
(setq D (- (* b b) (* a c 4)))
     (cond ((< D 0) nil)
               ((= D 0) (print (/ ( - b) (* 2 a))))
               ( T (print (list (/ (- (* b -1) (sqrt D)) (* 2 a))
                                    (/ (+ (* b -1) (sqrt D)) (* 2 a)))))))
       
       

Вызывать можно например напрямую (qudrat 1 -4 2)
или с вводом с клавы (qudrat (read) (read) (read))

Лисп не обязательно устанавливать, всё можно онлайн
https://www.tutorialspoint.com/codingground.htm  здесь много языков , достаточно выбрать Лисп.

Отредактировано Рустик (2017-07-30 12:33:21)

0

2

А зачем здесь setq ... Нужно через локальную переменную делать.

Код:
(defun qudrat(a b c)
(let ((D (- (* b b) (* a c 4))))
     (cond ((< D 0) nil)        
     ((= D 0) (print (/ ( - b) (* 2 a))))          
     ( T (print (list (/ (- (* b -1) (sqrt D)) (* 2 a))
                          (/ (+ (* b -1) (sqrt D)) (* 2 a))))))))


И print-ы надо поубирать, нет смысла дебажить в Лиспе, так как есть Репл!

0

3

В лиспе можно всё что угодно делать, так как программа представляет из себя список.
Например можно легко передать имя функции в список

Код:
(defun ro (a) (+ a 3))
     (+ 2 (eval (list 'ro 4)))        


функция eval вычисляет список, она противоположна '

Код:
(+ 2 (eval (eval '(list 'ro 4))))

Можно и проще сделать

Код:
(+ 2 (apply 'ro '(4)))

В обоих случаях результат будет 9

0

4

Протестировал оба варианта на время!!!
Делайте выводы.

Код:

 (defun qudrat(a b c)
(setq D (- (* b b) (* a c 4)))
     (cond ((< D 0) nil)
              ((= D 0) (/ ( - b) (* 2 a)))
              ( T (list (/ (- (* b -1) (sqrt D)) (* 2 a))
                          (/ (+ (* b -1) (sqrt D)) (* 2 a))))))

(let ((start (get-internal-real-time)))
    
(print (qudrat 1 -4 2))
  (print (- (get-internal-real-time) start)))
  

(0.58578646 3.4142137)                                                                                                            
149  - время выполнения программы

---------------------------------------------
    
(defun qudrat(a b c)
(let ((D (- (* b b) (* a c 4))))
     (cond ((< D 0) nil)        
              ((= D 0) (/ ( - b) (* 2 a)))         
               ( T (list (/ (- (* b -1) (sqrt D)) (* 2 a))
                          (/ (+ (* b -1) (sqrt D)) (* 2 a)))))))



(let ((start (get-internal-real-time)))
  
(print (qudrat 1 -4 2))
 (print (- (get-internal-real-time) start)))
  
(0.58578646 3.4142137)                                                                                                            
 122    - время выполнения программы      

0

5

Под Винду многие юзают  emac .
Но я очень рекомендую устанвить самую простую LispIde  http://www.daansystems.com/lispide/
После установки она просит лишь открыть файл лиспа, я юзаю clisp.exe !
В нижекй части окна открывается Репл, а вверхней можно писать файлы.
Подсветка синтаксиса обычная. и самое главное показывает парные скобки, поэтому процесс программирования получается лёгкий, так как не надо заморачиваться .
http://s7.uploads.ru/t/M5HoE.jpg

0