Что значит «ноль», «процедура»?и "символ?"значит в следующем коде? - PullRequest
0 голосов
/ 26 декабря 2018

Я рассматриваю следующую документацию для реализации интерпретатора Lisp в Python: http://norvig.com/lispy.html

В функции standard_env был определен словарь для отображения определенных символов или переменных вих соответствующие функции или значения.Однако я не могу понять следующие записи в словаре env :

env = {}
env.update({
    'equal?':  op.eq, 
    'list?':   lambda x: isinstance(x,list),
    'null?':   lambda x: x == [], 
    'number?': lambda x: isinstance(x, (int, float)),   
    'procedure?': callable,
    'symbol?': lambda x: isinstance(x, str),
})

Что означает «?»в конце ключа значит?Не могли бы вы привести примеры использования этих записей?

Ответы [ 3 ]

0 голосов
/ 26 декабря 2018

В большинстве диалектов Лиспа идентификаторы (на самом деле, символ имена) могут содержать знаки препинания, такие как ? (или ! или -)

Условно в схеме предикат имен (функции именования, возвращающие тестируемое логическое значение) имеют свое имя, заканчивающееся ? (например, list?), а побочные функции имеют свое имя, заканчивающееся ! (например vector-set!);см. также R5RS и SICP .

В Common Lisp предикат имена часто заканчиваются P (например, listp)

Эти соглашения об именах являются просто полезными соглашениями.Вы можете назвать свою функцию foo!bar?x, даже если она не является предикатом.

0 голосов
/ 26 декабря 2018

Синтаксически ? - это только один из многих символов, разрешенных в идентификаторах в Лиспе.Так что это просто часть имени функции.

По соглашению имена функций, заканчивающиеся на ?, используются для функций, возвращающих логические значения.

В частности equal? проверяет, равны ли два ее аргумента, null? проверяет, является ли его аргумент пустым списком, а все остальные - проверками типа, то есть они проверяют, имеет ли их аргумент заданный тип.

Не могли бы вы привести несколько примеров, где этибудут использоваться записи?

Функции, возвращающие логические значения, чаще всего используются в условиях if или cond, поэтому вы можете увидеть нечто подобное в качестве примера функции, использующей null?:

(define (sum lst)
  (if (null? lst)
    0
    (+ (first lst) (sum (rest lst)))))
0 голосов
/ 26 декабря 2018

Я не знаком с Лиспом, но, глядя на определения этих терминов, похоже, что они используются для проверки параметров, то есть 'list?'сопоставляется с функцией, которая проверяет, является ли параметр списком, 'method?'проверяет, является ли параметр процедурой (или, по крайней мере, вызываемой), 'null?'проверяет наличие пустого списка (возможно, именно так представлены значения null в интерпретаторе) и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...