LINUX.ORG.RU

Поиск по списку в лисп.

 ,


0

3

Есть списки: (setq a ’(1 2)) (setq b ’(1 2 3 4)) (setq c ’(11 22)) (setq d ’(100 200))

Есть строка и число: (setq str «a») (setq n 1)

Как получить используя переменные str и n элемент из списка a под номером 1 соответсвенно.

Я немогу понять, как это делается правильно в лиспе. Или (может быть) посоветуйте некую книгу по лисп.



Последнее исправление: maxcom (всего исправлений: 1)

я хочу запилить простенький переводчик для эмакса, есть пары слов, английское(одно) и соотвествующие ему несколько значений русских. очень простая задачка, но

nionio35
() автор топика

Текст программы:

(setq a '(1 2))
(setq b '(1 2 3 4))
(setq c '(11 22))
(setq d '(100 200))

(setq str "a")
(setq n 1)

(define (get-element some-string ind)
  (nth (- ind 1) (eval (read-expr some-string))))

Использовать так:

> (get-element str n)
1

P.S.: Писалось на new-lisp.

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

SICP ? там вроде scheme, и они с emacs lisp имеют какие то различия. не разбираюсь в этом, наверное это неважно. впрочем, каким-то образом переводчика написал за пару часов. тем не менее понятнее лисп не стал.

nionio35
() автор топика

Или (может быть) посоветуйте некую книгу по лисп

Очевидный PCL очевиден.

Как получить используя переменные str и n элемент из списка a под номером 1 соответсвенно

Типа так


(elt (symbol-value (find-symbol (string-upcase str))) n)

Но вообще хочешь странного.

no-such-file ★★★★★
()

Я бы вместо нескольких списков сделал хэш-таблицу, в которой ключём будет строка (переменная str у тебя), а значениями — векторы, а не списки (т.к. тебе нужен произвольный доступ, а не последовательный).

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

Я и на том и на другом тоже пишу, но не припомню чтобы в них приходилось в рантайме искать переменные по имени. Покажи как бы ты решил задачу на Python или JS - я переведу идеоматично на CL.

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

Вот как раз Tcl - единственный язык где мне приходилось искать переменные в рантайме по имени, и там это в целом нормально. Тут ты скорее всего хочешь таблицу, да. Или просто plist’ы если данных не очень много.

(defvar data '(:a (1 2) :b (1 2 3 4) :c (11 22) :d (100 200)))
(defvar key :a)
(defvar n 1)

(princ (nth n (getf data key)))
;; Печатает 2
Gentooshnik ★★★★★
()