LINUX.ORG.RU

LISP, помогите, пожалуста, разобраться со списками.

 ,


0

2

Добрый день, я запутался в основных понятия лиспа. Помогите, пожалуйста, разобраться.

Не могу понять как создать именнованный списка. Например

'("один","два","три")
- вот список

  • как его присвоить переменной?
  • как передать его в функцию?
  • как получить доступ к внутренним элементам?

Или вот кусок кода возвращающее случайное значение списка.

(nth (random 4) '("один"		      
       "два"		      
       "три"
       "четыре"))
Но это не крассиво, хотелось бы это оформить как функцию с передачей списка как аргумент.

★★★★

это в букварь по лиспу. основы же, ну. Хоть бы десяток страниц прочитал.

anonymous
()
CL-USER> (setq *my-list* '("один" "два" "три"))
("один" "два" "три")

CL-USER> (defun random-elem (list)
           (and list
                (nth (random (length list)) list)))
RANDOM-ELEM

CL-USER> (random-elem '())
NIL

CL-USER> (dotimes (i 5)
           (print (random-elem *my-list*)))

"один" 
"два" 
"три" 
"три" 
"один" 
NIL

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

читал, но как писал выше не понял, а загнав себя в тупик пошел спрашивать, потому как читая книгу явно вижу фигу. Мне нужно понять, что я понял не так

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

Вот так напрямую я могу сделать?

(nth (random 3) *my-list*)
У меня выдает ошибку, почему так делать нельзя?

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

у меня правда под рукой только picoLisp

Думаю дело в том, что номера элементов списка начинаются с одного, а не нуля.

(setq *list* '("Hello" "World")
(nth *list* (rand 1 2) )
-> ("world")
nihirash ★★★
()
Ответ на: у меня правда под рукой только picoLisp от nihirash

я использую emacs и у elisp свои, видимо, особенности, примеры от анномуса не работают, а работает вот так

(nth (random (+ 1 (length '(mylist)))) '(mylist))
Не неработает, все равно что то не понимаю

Silerus ★★★★
() автор топика
Последнее исправление: Silerus (всего исправлений: 1)

Детский сад какой-то.

Но это не крассиво, хотелось бы это оформить как функцию с передачей списка как аргумент.

А у вас не как аргумент? А как что?

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

А у меня просто как ошибка выполнения пока, почему то elisp

(setq mylist '(one two three))
- так он не понимает что это список, а вот так
(setq mylist (list one two three))
- понимает

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

Для начала научись читать сообщения об ошибках. Работает из этих двух вариантов не второй, а первый. А почему второй не работает? А тебе emacs говорит почему:

(void-variable one)

Потому что list - это функция, и one, two, three буду вычислены в значение переменных. Если таких переменных нет, то ОЧЕВИДНО ошибка.

Gentooshnik ★★★★★
()
Последнее исправление: Gentooshnik (всего исправлений: 1)
Ответ на: комментарий от Silerus

Почитал тред. Всё плохо. На каких языках ты уже умеешь писать?

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

(void-variable one)

нет он мне сообщает error(void-variable mylist) в первом случае, и вычисляет без ошибок во втором. Это ошибка, меня мало информативна, к сожалению, как и void-function.

На каких языках ты уже умеешь писать?

С++ для меня основной. И да, похоже я пытаюсь натянуть синтаксис c++ на elisp. Но я пользуюсь emacs, а бездумно перепечатывать чужое как то уже отучился, а иногда и что то свое надо - а я не понимаю основ lisp. Чтение мануалов пока особо ничего не дало, но я стараюсь.

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

Правда это про общелисп, а я как-то не заметил сразу, что тебя elisp интересует, но всё равно там много полезного.

нет он мне сообщает error(void-variable mylist) в первом случае

Странно, должно быть наоборот, как тебе сказали. А как ты вообще запускаешь всё это дело? eval-print-last-sexp?

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

вот так C-x C-e (eval-last-sexp) Так а дома все по другому, или на работе еще где то накосячил

(setq mylist '("one" "two" "three"))
(nth (random (+ 1 (length mylist))) mylist)
- вот так работает и как аналог
(setq mylist (list one two three))
(nth (random (+ 1 (length mylist))) mylist)
Так я кажется понял мне перечитывать первые главы до полного прояснения рассудка. Я почему-то считал, что qoute - указывает что все что внутри значение.

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

В списке после кавычки абсолютно без разницы что будет. Хоть one two three, хоть "one" "two" "three", хоть one "two" 3.

Если будешь читать PCL, то не забудь экспериментировать тоже на CL, а не elisp, иначе получишь новую порцию недоразумений. :)

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