Что такое «(апостроф) в Лиспе / Схеме? - PullRequest
56 голосов
/ 08 октября 2009

Я в 1-й день 1-го часа обучаю себя Схеме. Само собой разумеется, я ничего не понимаю. Итак, я читаю The Little Schemer и использую эту вещь:

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

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

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

(atom? 'turkey)

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

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

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

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

Ответы [ 7 ]

55 голосов
/ 08 октября 2009

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

(quote foo)

то есть «не оценивайте имя foo и не заменяйте его значением; я действительно имею в виду имя foo».

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

25 голосов
/ 09 октября 2009

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

Первый

(atom? 'turkey)

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

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

Второй

(atom? turkey)

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

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

Резюме

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

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

14 голосов
/ 08 октября 2009

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

Страница о на кодовой панели гласит, что она использует "MzScheme v372 [cgc]".

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

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

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

Отображается:

5
x

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

7 голосов
/ 06 декабря 2014

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

stuff - это символ, то есть это может быть имя переменной или имя функции и т. Д.
'stuff дает вам сам символ "вещи".

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

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

Можно сказать, что ' немного отличается от (eval..).

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

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

4 голосов
/ 13 октября 2009

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

Одна вещь, которую нужно помнить в Scheme или любом Лиспе, это то, что все оценивается по умолчанию. Таким образом, в случаях, когда вы не хотите оценивать, вам нужен способ выполнить это.

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

4 голосов
/ 09 октября 2009
  1. Я предлагаю вам перейти в лучшую среду, такую ​​как PLT Scheme , в которой есть IDE, отладчик и множество библиотек. По мере продвижения вперед и написания более крупных программ они вам понадобятся.

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

2 голосов
/ 16 июня 2014

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

Когда мы хотим передать сам аргумент вместо передачи значения аргумента, мы используем кавычку. В основном это связано с процедурой, проходящей во время использования списков, пар и атомов, которые недоступны в языке программирования C (большинство людей начинают программировать, используя программирование на C, поэтому мы запутались) Это код на языке программирования Scheme, который является диалектом 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

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

...