LINUX.ORG.RU

Помогите въехать в лисп


0

0

Хочу начать изучать лисп.

Установил я себе Common Lisp 2.39

А что дальше-то делать, информации в гугле много, но мне нужна самая начинающая, буквально примерчик простейшей ЗАКОНЧЕННОЙ проги, хоть Hello World выводящую. И КАК ее запустить?

Что происходит при запуске clisp? Зачем там семисвечник нарисован, что тут делать можно?

Помогите буквально чуть-чуть, дальше я сам поеду :)

anonymous

Спасибо всем за ссылки, но разбираться заставляете самому >:-)

Таки семисвечник это шо намек на кошерность? ;-)))

Провел первую проверку на вшивость:

(exp (* 4 (atan 1) #c(0 1)))

Увы: в ответ получил #C(-1.0 1.509958E-7) вместо хотя бы #c(-1.0 0), я уж не говорю о просто -1.0

anonymous
()
Ответ на: комментарий от anonymous

Естественно. А что ты хотел? Флоат-пойнты, етить их за ногу. Ошибочка вполне в рамках.

Со своей стороны порекомендую "Succesful Lisp". Автора и ссылку не помню, погугли сам.

Miguel ★★★★★
()
Ответ на: комментарий от anonymous

> Увы: в ответ получил #C(-1.0 1.509958E-7) вместо хотя бы #c(-1.0 0), я уж не говорю о просто -1.0

Делов-то: напиши свою арифметику с учётом задавемой точности. А для пущей точности прикрути GMP/MPFR через FFI, и "подмени" все арифметические и математические функции - и будет тебе счастье. Причём всё это стандартными методами лиспа, который при этом останется сам собой :)

yyk ★★★★★
()
Ответ на: комментарий от anonymous

>Провел первую проверку на вшивость:

>(exp (* 4 (atan 1) #c(0 1)))

>Увы: в ответ получил #C(-1.0 1.509958E-7) вместо хотя бы #c(-1.0 0), я уж не говорю о просто -1.0

Интересно, ты кого на вшивость проверял? Зная прекрасно о том, всегда есть ограничение на разрядную сетку, надеяться, что 4 * (вычисленное из арктангенса (pi / 4)) будет иметь такую точность, что j*sin (pi) будет даст точно j*0? Это провокация! Если ты так пишешь программы, то мне страшно этим пользоваться. Всегда надо помнить об этих вещах. :)

У тебя есть два пути -- повысить точность вычислений (все-равно 0 не получишь) или использовать какие-нибудь специальные математические пакеты, которые отловят такие случаи. В LISP, слава богу, можно проводить вычисления с произвольной точностью. Вот сходу пример:

(exp (* 4L0 (atan 1L0) #c(0 1))) дает уже #C(-1.0L0 3.8351529288817213532L-19)

http://www.supelec.fr/docs/cltl/clm/node19.html

Zubok ★★★★★
()
Ответ на: комментарий от yyk

>Делов-то: напиши свою арифметику с учётом задавемой точности. А для пущей точности прикрути GMP/MPFR через FFI, и "подмени" все арифметические и математические функции - и будет тебе счастье. Причём всё это стандартными методами лиспа, который при этом останется сам собой :)

Можно и без FFI обойтись.

http://www.haible.de/bruno/MichaelStoll/reals.html

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Можно, только, имхо, тормознее получится.

И я оговорился малость - не с "задаваемой точночтью", а с задаваемой/рассчитываемой погрешностью ;)

yyk ★★★★★
()

> Что происходит при запуске clisp? Зачем там семисвечник нарисован, что тут делать можно?

clisp сионистами написан, вот и подсвечник :) Поставь нормальный лисп: cmucl, sbcl или gcl.

Zmacs
()
Ответ на: комментарий от yyk

Кстати вот можно еще такую фишку сделать. Воспользоваться 
long-float-digits, например. CLISP:


> (/ 1 1234567L0)
8.100005913004316493L-7

> (setf (long-float-digits) 100)
> (/ 1 1234567L0)
8.10000591300431649315104000025920018923L-7

> (setf (long-float-digits) 200)
> (/ 1 1234567L0)
8.100005913004316493151040000259200189216138127780833280008294406055L-7

> (setf (long-float-digits) 6400)
> (/ 1 1234567L0)
Нечитаемо :)

А насчет точности. Есть там кое-какие константы, связанные с 
точностью, которые могут быть использованы. Но они все implemetation 
dependent. Например, в CLISP:

>long-float-epsilon
5.4210108624275221706L-20
>single-float-epsilon
5.960465E-8

и т д. Но я большего сказать не могу, так как этим вопросом вплотную
еще не занимался. 

2zmacs: CLISP и есть очень правильный Lisp, который поддерживает ANSI, а GCL еще до такого уровня не дошел.

SBCL, CMUCL - компиляторы. Не всем это надо.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

> У тебя есть два пути -- повысить точность вычислений (все-равно 0 не получишь) или использовать какие-нибудь специальные математические пакеты, которые отловят такие случаи.

Млин, народ, а шо, прикрутить округление результата до заданного знака в Лиспе религия не позволяет? В быдлоязыках это делается элементарно. А в Лиспе? Только "специальными математическими пакетами"?

eugine_kosenko ★★★
()
Ответ на: комментарий от eugine_kosenko

Округление при выводе? Округление как отдельная операция? Или принудительное округление при любых расчётах? За последнее надо голой задницей в муравейник... :)

yyk ★★★★★
()
Ответ на: комментарий от eugine_kosenko

> > Округление при выводе?

> Оно, родимое!

"Кури" format :)

yyk ★★★★★
()
Ответ на: комментарий от Zubok

> CLISP и есть очень правильный Lisp, который поддерживает ANSI, а GCL еще до такого уровня не дошел.

> SBCL, CMUCL - компиляторы. Не всем это надо.

Не пугай народ. В обоих случаях компиляция "инкрементальная", и разницы они никакой не увидят. Разве что последние два побыстрее бедут :) /и то не везде/

yyk ★★★★★
()
Ответ на: комментарий от yyk

>Не пугай народ. В обоих случаях компиляция "инкрементальная", и разницы они никакой не увидят. Разве что последние два побыстрее бедут :) /и то не везде/

Разница в размерах рантайма соотсветсвенно :). А то потом начнут жаловаться, что у них awk на 25 Мб :)) SBCL в рантайме еще и компилятор держит.

Zubok ★★★★★
()
Ответ на: комментарий от yyk

>P.S. cLisp тоже компилятор держит, только в байткод.

Да, но размеры образов CLISP и SBCL несравнимы:

-rw-r--r-- 1 root root 24928264 2006-09-21 02:25 /usr/lib/sbcl/sbcl.core

сравнить с 'ls -l /usr/lib/clisp/full'

Поэтому я пользуюсь и тем, и другим. Тяжелая артиллерия не всегда 
нужна. :)

Zubok ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.