LINUX.ORG.RU

Lisp. Вопросы новичка

 


1

3

Лисп изучаю только второй час, так что сильно пинать меня не стоит.

Проблема вот в чем.

Пробую:

$ gcl
GCL (GNU Common Lisp)  2.6.7 CLtL1    Feb  1 2012 09:07:26
Source License: LGPL(gcl,gmp), GPL(unexec,bfd,xgcl)
Binary License:  GPL due to GPL'ed components: (XGCL READLINE UNEXEC)
Modifications of this banner must retain notice of a compatible license
Dedicated to the memory of W. Schelter

Use (help) to get some basic information on how to use GCL.
Temporary directory for compiler files set to /tmp/

>(setf a (read))
10

10

>a

10

все работает так, как я ожидаю.

Но как только я пробую вот это:

$ cat ./sqare.lsp
(format t "a*x^2 + b*x + c = 0")

(let ((a 0)) )

(format t "~%a=")
(setf a (read))

(format t "~%b=")
(setf (b (read)))

(format t "~%c=")
(setf (c (read)))
(format t "~%")

(setq d (- (* b b) (* 4 a c)))

$ gcl -load ./sqare.lsp
Получаю вот это
GCL (GNU Common Lisp)  2.6.7 CLtL1    Feb  1 2012 09:07:26
Source License: LGPL(gcl,gmp), GPL(unexec,bfd,xgcl)
Binary License:  GPL due to GPL'ed components: (XGCL READLINE UNEXEC)
Modifications of this banner must retain notice of a compatible license
Dedicated to the memory of W. Schelter

Use (help) to get some basic information on how to use GCL.
Temporary directory for compiler files set to /tmp/
a*x^2 + b*x + c = 0
a=
Error: No value for (B (READ)).
Fast links are on: do (si::use-fast-links nil) for debugging
Error signalled by SETF.
Broken at SETF.  Type :H for Help.
>>

Собственно вопрос, почему так происходит?

P.S. Лисп изучаю по свежекуленной книге Пола Грема "ANSI Common Lisp".pdf

★★★★★

Ответ на: комментарий от alg0rythm

Это я эксперементировал с let, setf, setq и проч. Вот исправленный вариант:

$ cat ./sqare.lsp
(format t "a*x^2 + b*x + c = 0")

(let ((a 0)) )

(format t "~%a=")
(setf a (read))

(format t "~%b=")
(setf b (read))

(format t "~%c=")
(setf c (read))
(format t "~%")

(setq d (- (* b b) (* 4 a c)))

И ошибки

$ gcl -load ./sqare.lsp
GCL (GNU Common Lisp)  2.6.7 CLtL1    Feb  1 2012 09:07:26
Source License: LGPL(gcl,gmp), GPL(unexec,bfd,xgcl)
Binary License:  GPL due to GPL'ed components: (XGCL READLINE UNEXEC)
Modifications of this banner must retain notice of a compatible license
Dedicated to the memory of W. Schelter

Use (help) to get some basic information on how to use GCL.
Temporary directory for compiler files set to /tmp/
a*x^2 + b*x + c = 0
a=
Error: (FORMAT T "~%c=") is not of type NUMBER.
Fast links are on: do (si::use-fast-links nil) for debugging
Error signalled by *.
Broken at *.  Type :H for Help.
>>

Такое ощущение, что я неправильно использую либо read, либо...

На этом мысли заканчиваются.

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

Во-первых, у тебя a,b,c,d не объявлены defvar. Что (let ((a 0)) ) это тоже ни к чему. Во-вторых, судя по всему, gcl делает read из того же файла, ибо

gcl -load d.lisp 
GCL (GNU Common Lisp)  2.6.7 CLtL1    Feb  1 2012 08:59:12
Source License: LGPL(gcl,gmp), GPL(unexec,bfd,xgcl)
Binary License:  GPL due to GPL'ed components: (XGCL READLINE UNEXEC)
Modifications of this banner must retain notice of a compatible license
Dedicated to the memory of W. Schelter

Use (help) to get some basic information on how to use GCL.
Temporary directory for compiler files set to /tmp/
a*x^2 + b*x + c = 0
a=
Error: (FORMAT T "~%c=") is not of type NUMBER.
Fast links are on: do (si::use-fast-links nil) for debugging
Error signalled by *.
Broken at *.  Type :H for Help.
>>a

(FORMAT T "~%b=")
>>b

(FORMAT T "~%c=")
>>c

(FORMAT T "~%")

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

судя по всему, gcl делает read из того же файла

Мне тоже так показалось, но как это сделать это правильно я так и не нашел.

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

У меня твой код запускается в sbcl, но с ворнингами. Что следует учесть:

  • Форма let создаёт локальные (по умолчанию лексические) привязки, которые действуют только внутри её тела, поэтому строка с let у тебя не производит никакого полезного эффекта
  • setf у тебя производит присваивание к необъявленным переменным. sbcl на это генерирует ворнинги. Переменные нужно объявить либо «глобально» (формы defvar или defparameter), либо «локально» (форма let и производные, но при этом setf должен быть внутри let)
  • для тестирования удобнее использовать REPL

Немного переписал твой пример:

(defun read-var (name)
  (format t "~&~a=" name)
  (finish-output)
  (read))

(defun main ()
  (let* ((a (read-var "a"))
         (b (read-var "b"))
         (c (read-var "c"))
         (d (- (* b b)
               (* 4 a c))))
    ;; a, b, c, d видны здесь
    (format t "~%D=~a~%" d)

    ;; Дальнейшие расчёты
    )
    ;; a, b, c, d здесь уже не существуют
    )

(main)

λ desktop /tmp → sbcl --script square.lisp 
a=1

b=2

c=1

D=0
λ desktop /tmp → 

Тем не менее, поведение gcl выглядит довольно странно. Попробуй sbcl.

PS. И да, в данном случае буферы лучше сбрасывать явно.

theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 2)
Ответ на: комментарий от trex6

Так и не понял, что можно почерпнуть из этой статьи конкретно для моего случая.

C REPL гораздо быстрее, удобнее и веселее писать и отлаживать программы. Унылое отредактировать-скомпилить-запустить - это не по-лисповски.

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

Используй другой компилятор. Можешь отправить багрепорт.

alg0rythm
()

Тебе нужно глобальное определение переменных, а не локальное через let.

buddhist ★★★★★
()

А почему бы не почитать PCL?

P.S. Лисп изучаю по свежекуленной книге Пола Грема «ANSI Common Lisp».pdf

Мужики, а чё там? А то я не в курсе.

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

Только с GNU можно быть уверенным в том, что софт не скатится в проприетарное дерьмецо.

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

Мужики, а чё там? А то я не в курсе.

Хорошее последовательное введение в CL. PCL же какая-то хаотичная книженция, там только по отдельным главам пройтись можно.

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

Спойлер: вышла в 1995-1996 годах и более не обновлялась.

А чего там обновлять-то?

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

Я начинал с PCL, стиль хорош, много полезной информации, но практические примеры мне были не интересны и я ее забросил. Потом запоем:) прочел ANSI Common Lisp. Думаю для начала самое то. Стиль изложения отменный, но также примеры небольшие, понятные. В общем я рад, что эта книга была второй и могу порекомендовать другим:) А потом пошло, поехало и книжки уже особо не интересно читать, кодить интереснее:) Хотя PAIP, On Lisp, Let Over Lambda можно почитать.

Твой последний пример должен работать. С gcl не общался, кстати баннер он печатает: GCL (GNU Common Lisp) 2.6.7 CLtL1, что может говорить о том, что он по дефолту в CLTL1 моде работает, не ANSI.

Рекомендую Clozure CL ccl.clozure.com. sbcl поначалу может отпугивать большим количеством warnings.

seg-fault
()
Ответ на: комментарий от seg-fault

Если ccl будешь использовать, у него repl без readline (как и у sbcl) по лицензионным соображениям, можно использовать rlwrap для удобоваримого repl:

$ cat `which ccl`

#!/bin/sh

rlwrap lx86cl64 «$@»

Понятно, что лучше emacs, slime и все дела, но если ты начинаешь только изучать и не емаксер, то можно обойтись rlwrap.

seg-fault
()
Ответ на: комментарий от seg-fault

Понятно, что лучше emacs, slime и все дела, но если ты начинаешь только изучать и не емаксер, то можно обойтись rlwrap.

Так смысл SLIME не в том, чтобы сам REPL использовать, а чтобы сразу из редактора нужный кусок кода отправлять автоматом. А как вы там в голом REPL пишете, я вообще не понимаю.

Поэтому на лоре обычно и советуют начать со второй главы Practical Common Lisp.

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

В чем смысл slime я знаю и в голом repl не пишу. Если человек может сходу без культурного шока пользоваться емаксом, вопросов нет, slime это must use. Я к таковым, например не отношусь и знаю, что иметь вменяемый repl полезно. Я пользовался вимом когда изучал лисп, посылая код одной кнопкой через screen в шелл и этого хватало.

Сейчас есть настроенный emacs+evil+slime, когда надо что-то отладить. Потребности сидеть в emacs по прежнему нет и наверное по канонам тру лисперов я не лиспер:)

seg-fault
()
Ответ на: комментарий от seg-fault

sbcl поначалу может отпугивать большим количеством warnings.

Так нефиг стандарты нарушать. ещё его компилятор сыплет большим количеством notes, но это только при (declare (optimize ...)), вроде

shamaz
()

А я рекомендую clisp. Самое Ъ

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

Это опять же основываясь на опыте. Когда еще нихрена не знаешь, тяжело не нарушить стандарт и портянки warning-ов разгребать бывает не весело. Они еще поначалу не пойми о чем.

seg-fault
()

Лисп изучаю только второй час... Проблема вот в чем.

Проблема не в этом.

Проблема в том, что ты второй час занимаешься бесполезным занятием. Посуди сам, как еще назвать изучение маргинальной технологии, не имеющей сегодня применения на практике? Да, когда-то LISP предлагал интересные идеи. Но его роль в структуре человеческих знаний сродни алхимии, астрологии и целительству. Все удачные идеи, предложенные эти тупиковыми направлениями, были давно изучены, оценены и приняты на вооружение химией, астрономией и медициной. Так и с лиспом. То, что некоторые удачные идеи навроде мусоросборщика были приняты индустрией, не делает из LISP'а индустриальную технологию. Ровно так же полезные алхимические наблюдения не делают из алхимии науку. Место алхимии, астрологии, целительства, гомеопатии и LISP'а сегодня одно — Музей Истории Человеческого Познания, зал Ранних Исканий и Заблуждений.

Собственно вопрос, почему так происходит?

Потому что у тебя есть запрос на реализацию юношеского нонконформизма. Ты вычитал на ЛОРе, что LISP — это «элитный» язык, доступный избранным, и захотел к ним присоединиться. Спешу тебя огорчить; такие сведения на ЛОРе распространяют тролли, школьники и сумасшедшие. Ты точно хочешь, чтобы вышеописанный контингент считал тебя «элитой»? Это ли то, чего ты хочешь добиться?

Да и сама эта идея — выделиться из общей массы за счет изучения LISP'а — в корне порочна. Ты хочешь выделиться за счет внешних атрибутов и аксессуаров, а не за счет твоих личных достижений. Точно по такой же причине молодежь покупает «зеркалки», айфоны, а кто побогаче — дорогие автомобили. Мой тебе мудрый совет: выделяйся собственными достижениями, а не блестящими побрякушками. Найди свои сильные стороны и развивай их. Освой музыкальный инструмент, изучи иностранный язык, прочти в подлиннике хорошие классические книги, займись спортом, отправься путешествовать, познакомься с девушкой, наконец!

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

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

sbcl поначалу может отпугивать большим количеством warnings.

большим количеством warnings.

Так это же хорошо.

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

В основном буковки, но стиль изложения мне нравится.

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

Проблема в том, что ты второй час занимаешься бесполезным занятием.

У каждого свои интересы в жизни. Мне интересно изучить лисп.

trex6 ★★★★★
() автор топика
Ответ на: комментарий от seg-fault

А я пытался начать с «Lisp in Small Pieces», перед этим прочитав статьи Водолазского, но ничего не понял и решил изучить по этой книжке.

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

У каждого свои интересы в жизни. Мне интересно изучить лисп.

Ну, а я что, против, что ли? У всех свои интересы.

Кому-то интересно пить пивасик в подворотне.
Кому-то — смотреть камеди клаб по ящику.
Кому-то — онанировать на порнуху в интернетах.
Кому-то — коллекционировать аниме.
Кому-то — совершать сатанинские ритуалы на кладбище.
Кому-то — состоять в движении «Наши» или в «Молодой гвардии».
Кому-то — пиздить чучмеков у метро.
Кому-то — отжимать мобилы.
Кому-то — обдалбываться спидами на дискотеках.
Кому-то — барыжить этими самыми спидами.
Кому-то — участвовать в МЛМ, МММ, торговать БАДами и гомеопатией.
Кому-то — изучать лисп.

Просто пойми, у нас, старших и мудрых, есть такой рефлекс. Если видишь заблуждающегося юнца — используй любой шанс, даже самый иллюзорный, чтобы приоткрыть ему глаза.

И наплевать, что это не сработало сейчас. Через некоторое время глаза откроются сами, это сделает сама жизнь.

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

культурного шока пользоваться емаксом

CUA mode же

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

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

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

Просто пойми, у нас, старших и мудрых, есть такой рефлекс. Если видишь заблуждающегося юнца — используй любой шанс, даже самый иллюзорный, чтобы приоткрыть ему глаза.

Ржали всем отделом. Фото с прыщавой рожей, датой и фразой «привет Изену» в студию!

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

портянки warning-ов разгребать бывает не весело

Это опять же из-за не умения использовать SLIME. В SLIME ты пишешь функцию, сразу же ее компилируешь, сразу же получаешь подсветку ошибок и warning-ов, сразу же вызываешь и смотришь результат. Вот это и есть интерактивная разработка.

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

А я пытался начать с «Lisp in Small Pieces»

Это книга по внутреннему устройству Лиспа, для тех кто хочет свой написать.

Вообще по CL можно выделить три основные книги: ANSI Common Lisp - отличное введение, Practical Common Lisp - пройтись по отдельным главам и посмотреть как, примерно, это используют на практике, и Common Lisp the Language - полное и подробное описание языка, справочник.

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

подозреваю, что большинство ржавших - самовлюбленные тупые идиоты. кстати было сказано неплохо, хоть и с пафосом.

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

Этот «старший» и «мудрый» совсем недавно, когда только пришел на ЛОР, через слово сыпал двачевским жаргоном, что говорит нам, что он из вечно скучающего офисного планктона, который любит тупить от безделья на чанах.

Ну а советы вроде «выучи музыкальный инструмент» довершают картину, показывая легкомысленную и самоуверенную посредственность, ничего своим трудом в жизни не добившуюся. Потому как «выучить тот же музыкальный инструмент» - это лет десять музыкальной школы минимум, а крутые музыканты так вообще даже на толчке с инструментом не расстаются.

Что касается, не относится к Лиспу фанатично и изучать его наравне с другими языками, и вообще с другими науками - я согласен. Только нужно учиться быстро въезжать в разные интересующие темы, а не брасать все и пойти лабать на гитаре и трахаться с кем попало, как советует глупый двачер.

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

Кому-то — состоять в движении «Наши» или в «Молодой гвардии».

А в этом-то что плохого? Или опять белогандонники набижали?

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

У всех свои интересы.

Кому-то интересно пить пивасик в подворотне. Кому-то — смотреть камеди клаб по ящику. Кому-то — онанировать на порнуху в интернетах. Кому-то — коллекционировать аниме. Кому-то — совершать сатанинские ритуалы на кладбище. Кому-то — состоять в движении «Наши» или в «Молодой гвардии». Кому-то — пиздить чучмеков у метро. Кому-то — отжимать мобилы. Кому-то — обдалбываться спидами на дискотеках. Кому-то — барыжить этими самыми спидами. Кому-то — участвовать в МЛМ, МММ, торговать БАДами и гомеопатией. Кому-то — изучать лисп.

А у тебя — всё это вместе?

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

негодный анонимус, толстый

anonymous
()

Лол, стоило в треде случайно очутиться неглупому взрослому человеку — у малолетних лисп-боев массово бомбанули пердаки, аж дымящиеся ошметки разлетелись.

Лисп-бои такие лисп-бои.

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

Лол

А ты даже «не лол», ибо уныл до блевоты. Единственное, чем ты заинтересовал - уровень чего у тебя ниже: способности угадывать или отрицательного IQ.

yyk ★★★★★
()

Чёрт, пацаны, этот анонимус первый сказал, что у всех «массово бомбанули пердаки», а мы даже не успели перекрыть это своим «бомбит», «затралено» или хотя бы классическим «азаза». Он победил, расходимся.

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

Про «лалку» еще забыл, которая анскилльная.

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

Ну а советы вроде «выучи музыкальный инструмент» довершают картину, показывая легкомысленную и самоуверенную посредственность, ничего своим трудом в жизни не добившуюся. Потому как «выучить тот же музыкальный инструмент» - это лет десять музыкальной школы минимум, а крутые музыканты так вообще даже на толчке с инструментом не расстаются.

Дружок, а может, тебе просто не хватило таланта и способностей? Может, на ухо наступил медведь, а руки растут не из того места?

Я вот, например, во взрослом возрасте решил освоить саксофон. Полгода усердных занятий с преподом, год самостоятельной практики, репетиций с командой и изучения музыкальной теории. Что из этого получилось, можешь спросить у посетителей франкфуртских джаз-клубов. А публика у нас тут весьма привередливая, сразу тебе скажу.

Короче, «десять лет музыкальной школы» — это миф для посредственностей и лентяев. Нужны глубокое увлечение, твердое намерение, энтузиазм, трудолюбие, хороший преподаватель и немного «божьей искорки» ;)

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