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 ★
()
Ответ на: комментарий от czan

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

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

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

Очевидный PCL (gigamonkeys.com) очевиден.

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

Типа так


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

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

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

вот примерно так и сделал, и это странно. но работает.

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

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

theNamelessOne ★★★★★
()

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

А на каком языке можешь понять? Это поможет определить где у тебя проблема в понимании и попробовать решить её.

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

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

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

а тут это работает. и на tcl так делал. на питоне же {«table»:[«стол»,«таблица»]}. вообщем переделаю с хештаблицами(потом).

nionio35 ★
() автор топика
Ответ на: комментарий от 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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.