2009-10-08 2 views
49

Я нахожусь на 1-й день обучения самому себе Схемы. Излишне говорить, что я ничего не понимаю. Так что я читаю Маленький Schemer и использовать эту вещь:Что такое '(апостроф) в Лиспе/Схеме?

http://sisc-scheme.org/sisc-online.php

в качестве переводчика.

мне нужно использовать ', например, в

(atom? 'turkey) 

, чтобы избежать ошибки «неопределенная переменная». ', согласно книге, является обычным делом Лиспа.

У меня есть два вопроса:

  1. ли переводчик я уже упоминал выше хороший? Можете ли вы порекомендовать другого? Мне нужен тот, который пойдет хорошо с The Little Schemer.

  2. Что такое '?

+1

«Мне нужно», чтобы избежать ошибки «неопределенной переменной» - что-то серьезно нарушает ваш подход, если вы пишете этот путь, хотя я не могу сказать, что. Предложите вам задумчиво прочитать старый стандарт R4RS (за исключением приложений, более доступный, чем R5RS или R6RS) три раза. –

ответ

47

Форма 'foo просто более быстрый способ ввести специальную форму

(quote foo) 

который должен сказать, «не оценивает имя Foo и заменить его со значением, я действительно имею в виду name foo ".

Я думаю, что SISC отлично подходит для изучения упражнений в TLS.

+0

Разве нет функциональной разницы между цитатой и функцией? А именно: правила отопления/охлаждения. Когда foo передается в функцию, он сначала оценивается, тогда как точка цитирования кода заключается в сдерживании ее оценки. –

13

SISC хороший, но еще более легкий онлайн-исполнитель Scheme - http://codepad.org. На самом деле это не REPL, поскольку он не является интерактивным, но он довольно близок. Код, который вы отправляете, выполняется на сервере вместо использования апплета браузера. И вы можете использовать код, который вы используете по короткому URL.

На странице кодекса говорится, что он использует «MzScheme v372 [cgc]».

Я использую кодовое слово для всех видов быстрого тестирования фрагментов (в том числе тестирование образцов кода для ответов SO!).

Для цитаты синтаксиса, разницу можно увидеть, используя такой код:

(let ((x 5)) 
    (display x) (newline) 
    (display 'x) (newline)) 

Здесь отображается:

 
5 
x 

В первом случае x вычисляется и передается display, который отпечатки 5. Во втором случае символ x (который не совпадает с символьной строкой) передается display, который печатает имя o f символ.

22

Вам необходимо понять основные правила оценки Схемы.

Первый:

(atom? 'turkey) 

Список является функцией приложения, поэтому atom? получает оценку к функции. 'turkey - короткая ручная запись для (quote turkey). Оценка (quote turkey) дает символ turkey.

Итак, следующая функция применяется к символу turkey и вычисляется возвращаемое значение.

Второй

(atom? turkey) 

Снова мы имеем функцию приложения и atom? получает оценку к функции. На этот раз turkey является переменной. Оценка turkey дает значение, которое связано с ним - что бы оно ни было.

Таким образом, функция применяется к значению переменной turkey.

Резюме

turkey является переменной, которая получает оценку его стоимости. 'turkey - (quote turkey), который оценивается по значению turkey.

Схема повторно использует s-выражения и строит свои программы из s-выражений. Это приводит к тому, что когда-то turkey должно быть переменной, а иногда оно должно быть символом. Это немного запутанно для новичка. Через некоторое время вы увидите силу за ней.

3
  1. Я предлагаю вам перейти к улучшению состояния окружающей среды, как PLT Scheme, который имеет IDE, отладчик и множество библиотек. Когда вы продвигаетесь вперед и начинаете писать большие программы, вам понадобятся они.

  2. Символ с одной кавычкой является синтаксическим сахаром для выражения «quote», поэтому «индейка такая же, как (quote turkey). В принципе, то, что делает «цитата», - это выключить оценщика Схемы. Другими словами, «quote» возвращает выражение, дословно. Если не было никакой «цитаты», тогда Схема попыталась бы оценить «индейку» в текущей среде. Это не обычная вещь Lisp, а вещь Lisp. Common Lisp и Scheme - это два диалекта Lisp. Использование «цитаты» объясняется во всех учебниках/книгах Lisp. Также см. Ответы на вопрос this question.

3

Символ одиночной кавычки - это сокращенный способ сказать (quote foo), где quote - это форма, возвращающая только foo без ее оценки.

Одна вещь, о которой нужно помнить на схеме или любом Lisp, в том, что все оценивается по умолчанию. Итак, в тех случаях, когда вы не хотите оценивать, вам нужен способ сесть.

Цитата: что-то делает именно это, а одинарная кавычка просто требует меньше ввода текста и ведет к менее сложному коду.

+0

Emm, не все оценивается по умолчанию. В '(если t (один) (два))', (два) никогда не оценивается. Все оценивается по умолчанию только на верхнем уровне или в параметрах функций. Если это * где-либо еще *, это может быть или не быть оценено, в зависимости от того, где именно находится это конкретное * где-либо еще *. – enrey

1

Если вы ищете лучшую IDE для scheme, тогда перейдите на страницу Dr Racket.Но при запуске Dr Racket первая строка должна быть #lang scheme с Dr Racket имеет много языков, на которых мы прямо указываем, какой язык мы будем использовать.

Когда мы хотим передать сам аргумент вместо передачи значения аргумента, мы используем цитату. Это в основном связано с процедурой, проходящей во время использования списков, пар и атомов, которые недоступны на языке программирования C (большинство людей начинают программировать с использованием программирования C, поэтому мы путаем). Это код на языке программирования Схемы, который является диалектом lisp и я думаю, вы можете понять этот код.

(define atom?    ; defining a procedure atom? 
(lambda (x)    ; which as one argument x 
(and (not (null? x)) (not(pair? x))))) ; checks if the argument is atom or not 
(atom? '(a b c)) ; since it is a list it is false #f 

Последняя строка (атом? А) проходят а, как это в порядок, чтобы проверить, если а представляют собой атом или нет, но когда вы передаете (атом? А), то она проверяет значение от abc и передает значение ему. Так как, мы не указали никакой ценности

3

Сокращение на (quote ...), ' превращает код в данные.

stuff является символом, это означает, что он может быть именем переменной или именем функции, и т.д ..
'stuff дает символ «материал» сам.

(dostuff "on" those 4 :parameters) при оценке, будет работать функция dostuff с четырьмя параметрами: строкой, содержимым переменной, числом и ключевым словом.
'(dostuff "on" those 4 :parameters) при оценке будет возвращать код выше, который, при оценке, будет в свою очередь, функция запуска dostuff с того, что четыре параметра ..

Например: Run '''somecode, он возвращает ''somecode. Запустите ''somecode, он возвращает 'somecode. Запустите 'somecode, он возвращает somecode. Запустите somecode, и ... хорошо ... somecode будет работать.

Вы можете сказать, что ' немного напоминает противоположное (eval..).

(eval (eval (eval '''(print "hello")))) напечатал бы «Hello».
(eval (eval (eval ''''(print "hello"))) - уведомление еще ' затем eval - ничего не печатал, но он вернул бы код (print "hello") сам!

За исключением того, что оссики имеют тенденцию называть этот возвращенный код (а иногда даже рукописный код) «списком» вместо «кода», по причинам, которые будут кровоточить, как только вы копаете чуть глубже. Удачи :)

+0

Нет, в схеме (в отличие от обычного lisp) материал является идентификатором. Он становится символом, цитируя его, как в «материалах». Небольшая точка, но приятно, что все правильно.В схеме идентификаторы не должны использоваться как символы, как в общем lisp. Для последнего стандарта схемы см. П. 2.1 и § 6.5 п. –

Смежные вопросы