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 очевиден.

Как получить используя переменные 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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.