2016-08-16 5 views
0

Racket - это первый диалект схемы, который я изучаю, и я не так далеко, однако из-за минимального синтаксиса схемы я считаю, что можно с уверенностью предположить, что знак вопроса в именах переменных не интерпретируется интерпретатором иначе чем любой другой жизнеспособный характер.Почему имена предикатов в схеме в форме вопросов?

С помощью этого пробега в предложении, почему схема использует символ «?» Для обозначения функции, которая возвращает true или false (называемый предикат)? Например, в ракетке есть встроенная функция, называемая number?. number? возвращает true при применении к любому числу (1, 5, -5, 2.7 и т. Д.) И false в противном случае. Я считаю, что number? не соответствует чему-то по строкам is_the_following_argument_a_number?. Предполагая, что это так, выражение (number? 5) означает (is_the_following_argument_a_number? 5).

На английском языке (язык, на котором была написана эта переменная), предикат «является следующим аргументом числа?» Можно найти, сначала переведя вопрос в форму утверждения, переместив глагол: «следующий аргумент число ", а затем извлечение предиката:" является числом ". Теперь я не лучший на говорящих языках, поскольку я на языках программирования, но я считаю, что это правильно. Кроме того, извините, если это превращается в английский вопрос больше, чем вопрос схемы.

Что я имею понимание тревоги является тот факт, что если сюсюкать сообщество называет number? предикат, почему это имя переменной не предикат в английском (я говорю о том, что переменная имя не сказуемое в английском, а не тип функции он в схеме не является предикатом) Я нашел то, что я считал предикатом того, что я думал number?, переведенный на «как число», а не весь вопрос »является следующим аргументом: номер? ", просто предикат. Итак, почему сообщество lisp предпочитает называть предикаты в схеме как вопросы на английском языке? Я считаю, что это происходит потому, что сообщество ошибочно принимает значения утверждений (истинных или ложных) для ответов на вопросы «да/нет» (да или нет (очевидно)). Неужели я не ошибаюсь?

+0

Зачем нужен downvote? – Vityou

ответ

2

Предикат в информатике не имеет ничего общего с предикатом в грамматике языка. Они оба связаны с трём, но в остальном они не связаны понятиями. Предикат в Схеме - это процедура, которая проверяет, является ли что-то истинным или нет, и на самом деле оно может иметь любое имя. Однако, поскольку мы можем кодировать информацию в имени, она должна содержать то, о чем речь, что может быть любым словом или даже предложением, ограниченным дефисами, заканчивающимся знаком вопроса, чтобы указать, что это действительно предикатная процедура. И имя в определении и использовании будет выделяться читателю, чтобы они знали его, не глядя на документацию или реализацию.

Scheme predicates в очень first Scheme report и the second выглядел Common Lisp и предикаты на схеме следовали тому же соглашение об именовании, как Common Lisp сегодня. Старые процедуры, которые были в LISP 1.5, имеют одно и то же имя без общего p-окончания, в то время как новые введенные имели его, например procp (сегодня procedure?). Причиной этого является то, что Scheme работает под MacLisp и заимствует у него все скучные вещи, в то время как это были лексические закрытия, которые были волшебством Схемы. На самом деле, это выглядело много похоже на Common Lisp.

В RRRS или R2RS они сделали весь предполагаемый конец с?и он работал с eq? и друзьями, но арифметические предикаты, которые использовали символы, такие как <?, =?, <=? и т. д., не были успешными и были удалены в R3RS.

В условном мы называем части предиката, следствие и альтернатива:

(if (< a 0) ; predicate 
    (- a) ; consequent 
    a)  ; alternative 

Здесь предикат является лишь выражением, либо оказывается истинным или ложным. Фактически все значения схемы допустимы, и только #f является ложным. Предикатная процедура - это процедура, которая всегда либо возвращает #t, либо #f, и именно так, как вы пишете, number? проверяет, является ли аргумент числом, а string=? проверяет, являются ли два аргумента строк одинаковыми. Шаблон очень хорош, и вы можете себе представить, что он делает, просто глядя на имя, используемое при сохранении коротких имен процедур. В речи мы часто делаем то же самое, как сказать «кофе?». и получение положительного или отрицательного ответа. Он работает большую часть времени, и некоторые люди должны сказать ему, что они предлагают им горячий напиток, чье имя - кофе. При кодировании это означает просмотр документации или определение процедуры.

В Схеме есть другие соглашения об именах.

foo->bar - это процедура, которая принимает аргумент типа foo и возвращает его как тип bar. number->string принимает число и строит его. (number->string 5) ; ==> "5"

foo! может изменить объекты, которые вы передаете, чтобы выполнить работу немного быстрее, чем если бы она была названа foo. set! и set-car! являются примерами.

*variable* от CL, но на Схеме вы можете быть уверены, что это глобальная переменная.

CONSTANT, +CONSTANT+, +constant+ являются обычными именами для переменных, которые считаются константами.

form* делает что-то похожее на то, что form делает, но не совсем. Специальная форма let* делает что-то похожее на let, но она связывает одну переменную за раз.

код работает ли следовать за вами это или нет, но вы делаете это легче читать с помощью этой конвенции и, когда вы пытаетесь сделать процедуру somparison foo=? так же легко понять, как are-these-two-foo-things-equal и foo? так же легко как argument-is-a-foo.

Обратите внимание, что это также делают другие языки программирования. В Java пишите isFoo и equals, так что там тоже не указано.

+0

Значит, это не имеет ничего общего с английским? Просто аббревиатура и набрание меньше? – Vityou

+0

@ Vityou English не изобретал неоднозначные и быстрые вопросы, поскольку они существуют на всех языках, о которых я знаю. Стандартные процедуры и предикаты хорошо известны, и у них достаточно контекста, поэтому, когда вы понимаете, что означает это слово, например. 'number' вы можете понять' number? '. Когда указанные пользовательские предикаты могут быть более двусмысленными, а иногда требуется больше слов. например. 'valid?' может быть нормально, если ваша программа работает с одним типом данных и имеет только один очевидный предикат проверки, в то время как 'list-valid?' и 'element-valid? ''в другом, так как они оба проверяют действительность. – Sylwester

+0

То, что я прошу в своем первом комментарии, состоит в том, что если ваши высказывания могут «понять это», хотя имя функции предиката не является предикатом на английском языке, не имеет ли что-нибудь с английским, хотя переменная name 'number' - английское слово. – Vityou

1

Это просто соглашение о программировании. Предикаты - значение: те процедуры, которые возвращают true или false, определяются с именем, которое заканчивается знаком вопроса. Аналогично, процедуры, которые имеют побочные эффекты (например, это состояние мутанта), определяются с именем, которое заканчивается восклицательным знаком.