Как мне узнать, является ли значение переменной символом, связанным с процедурой в Scheme? - PullRequest
3 голосов
/ 21 сентября 2009

Я знаком с Common Lisp и пытаюсь изучить некоторую Схему, поэтому я пытался понять, как я буду использовать Схему для вещей, которые я обычно кодирую в Common Lisp.

В Common Lisp есть fboundp, который сообщает мне, связан ли символ (значение переменной) с функцией. Итак, я бы сделал это:

(let ((s (read)))
  (if (fboundp s)
      (apply (symbol-function s) args)
      (error ...)))

Возможно ли это на схеме? Я пытался найти это в спецификации R6RS, но ничего подобного не нашел.

Ответы [ 2 ]

5 голосов
/ 21 сентября 2009

Сюда?

  1. проверить, если это символ
  2. оцените символ, используя EVAL, чтобы получить его значение
  3. проверить, является ли результат процедурой с PROCEDURE?
4 голосов
/ 21 сентября 2009

В Схеме функции не привязаны к символам, как в Common Lisp. Если вам нужно знать, является ли значение процедурой, вы можете использовать предикат procedure?:

(if (procedure? s) (do-something-with s) (do-something-else))

В переносимой Схеме нет прямого способа достичь того, что хочет сделать ваш пример кода, поскольку символы в Схеме - это просто некие унифицированные строки, в которых отсутствуют слоты value / function / plist Common Lisp.

Вы можете попробовать что-то вроде:

(define function-table (list `(car ,car) `(cdr ,cdr) `(cons ,cons) `(display ,display)))

(let* ((s (read))
       (f (cond ((assq s function-table) => cadr)
                (else (error "undefined function")))))
    (apply f args))

То есть, определяя ваше собственное отображение "хороших" функций. Это дает преимущество в том, что вы можете ограничить набор функций только «безопасными» или какими-либо другими.

...