Путь к истине

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

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



LISP

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

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 !
В нижекй части окна открывается Репл, а вверхней можно писать файлы.
Подсветка синтаксиса обычная. и самое главное показывает парные скобки, поэтому процесс программирования получается лёгкий, так как не надо заморачиваться .

0

6

Подключение Tcl/Tk
1) Установить Tcl/Tk на комп
я использую
Magicsplat Tcl/Tk for Windows
wwwmagicsplat.com/tcl-installer/index.html

2) установить на лисп библиотеку
LTK
http://www.peter-herth.de/ltk/ltk-0.981.tgz

Распаковать в директорию лиспа ( все файлы должны быть там же где лисп!!!!
Откомпилировать библиотеку в лиспе командой

(compile-file "ltk.lisp")

Если не сработает, то просто щёлкните  дважды на файле ltk.lisp

Вот и всё!

Далее во всех проектах под винду добавлять две строчки кода

(load "ltk")

(in-package :ltk)

ПРОТЕСТИРОВАТЬ можно двумя командами
(ltktest)
(ltk::ltk-eyes)

Общая конструкция вставки виджетов макрос with-ltk

Вот пример
вставляет кнопку по нажатию которой выводится Hello Worl

Код:



(defun hello1()
(with-ltk ()
(let ((b (make-instance 'button
:master nil
:text "Press Me"
:command (lambda ()
(format t "Hello World!~&")))))
(pack b))))

LTK- описание на английском, много примеров!!!
http://www.peter-herth.de/ltk/ltkdoc.pdf

ВАЖНО!!!!!!!!!!!!!!!!!!
Тестировалось на  SBCL  не работает!!!!!!!!!!

0

7

Переписал квадратное уравнение через IF

Код:

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

Кстати можно свою IF написать. чтобы более естественная была с then  и else
вот варианты

Код:

(defmacro if1 (usl Then rez) (list 'cond (list usl rez)))
Код:
(defmacro if2 (usl Then rez1 Else rez2) (list 'cond (list uls rez1) (list 'T rez2)))

Но это только ради эстетики)))

0

8

Я юзаю CLISP в нём большущее разнообразие возможностей по созданию циклов.
Вот мои основные конструкции.

со счётчиком

Код:
(Loop for x from 1 to 5
         do (print (* 3 x)))

с условием

Код:
(setq x 10)
(Loop while ( < x 100)
         do (print (* 3 x))
             (setq x (+ x 10)))

0

9

Сегодня мне попался отрывок из учебника по лиспу. И в нём я обнаружил такой перл:

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

Особо умиляет  -  "Вместо этого лучше думать"  Ржунемагу.
Так вот братцы хомячки, думать вы можете как угодно, но от этого сущность  этого явления не поменяется.
Никто никого не заставляет использовать ту или иную конструкция языка, для какого-то круга задач  эти конструкции вредны, для какого-то полезны,
всё определяется именно поставленной задачей! По крайней мере так должно быть, но к сожалению из-за таких вот "умных" учебников и преподавателей,
воспитываются не программисты, а догматики, которые могут мыслить только в рамках какой то одной парадигмы.  И решение задачи рассматривают именно
через призму парадигмы, а не через рациональный подход.

0

10

Меня тоже умиляет эта фраза.
А если серьёзно, то программист это тот кто прежде всего изучал ассемблер и машинные коды. Те кто прошёл курсы или изучал по книжкам какой-либо язык высокого уровня
по своей сути не является программистом, так как не имеет ни малейшего представления как это всё работает. 
Это я веду к тому, что любая программа написанная на любом языке в итоге будет транслирована в машинный код, который изначально императивный.
Надо отиетить , что именно машинный код - это и есть чистый императив ( приказ). В Ассемблер уже введены директивы, прежде всего def  - прообраз переменной, и полный аналог setq в LISPе.
Надо понимать, что базовая парадигма -Императивная. Все остальные парадигмы, это всего лишь надстройки над императивной и не более того.

0