Путь к истине

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

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



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

0

6

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

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

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

(compile-file "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

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

Меня тоже умиляет эта фраза.
А если серьёзно, то программист это тот кто прежде всего изучал ассемблер и машинные коды. Те кто прошёл курсы или изучал по книжкам какой-либо язык высокого уровня
по своей сути не является программистом, так как не имеет ни малейшего представления как это всё работает. 
Это я веду к тому, что любая программа написанная на любом языке в итоге будет транслирована в машинный код.  и при интерпретации единственный критерий к программе- это скорость её выполнения.
А эта скорость определяется как алгоритмом программы. так и алгоритмами интерпретации, проще говоря интерпретатор всего лишь в зависимости от программы скармливает процессору куски машинного кода, и при этом изменяет данные с которыми эти куски кода будут работать.
Обращаюсь к народу. Напишите какой-нибудь транслятор Лисп или Форт  подобного языка, хотябы не на ассемблер, а на паскаль или си.  А потом уже увлекайтесь парадигмами.

0