Простой интерпретатор в схеме - PullRequest
1 голос
/ 22 февраля 2012

Я опишу мою проблему на примере.

Я получу (play '(left nothing right left)). Некоторые из имен в списке являются реальными процедурами, другие я хочу пропустить.

(define (left)
   'left
)

Мне нужно интерпретировать процедуры с именами в списке. Какое решение?

Когда я пытаюсь ( (car '(left nothing right left))) я получаю ошибку: применение процедуры: ожидаемая процедура, дано: оставлено (без аргументов)

Ответы [ 2 ]

4 голосов
/ 22 февраля 2012

(car '(left nothing right left)) соответствует символу left, который является именем процедуры, но на самом деле не процедурой, поэтому вы не можете вызвать ее.

Вы хотите построить символы сопоставления списков ассоциаций для процедур:

(define actions `((left . ,(lambda () 'left))
                  (right . ,(lambda () 'right))
                  (nothing . ,(lambda () (display "I'm staying put")))))

тогда вы можете вызвать соответствующую функцию для первого элемента в вашем списке как

((cdr (assoc (car '(left nothing right left)) actions)))
0 голосов
/ 25 февраля 2012

Вы также можете использовать квази-кавычки для построения списка, содержащего смесь символов, которые вы хотите оценить, и других, которые вы не оцениваете, например,

(play `(,left nothing nothing ,right nothing))

left и right расширится до того, что вы 'мы определили их как (например, процедуру), в то время как nothing не заключено в кавычки, поэтому оно будет оставлено как символ.play затем должен проверить каждого участника, чтобы увидеть, является ли это процедурой, что-то вроде:

(define (play xs)(for-each (lambda (x)(if (procedure? x)(x) x)) xs))
...