Что такое (апостроф) в Lisp/схеме?

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

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

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

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

(atom? 'turkey)

чтобы избежать ошибки "undefined". ', согласно книге, является общей темой Lisp.

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

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

  • Что такое '?

Ответ 1

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

(quote foo)

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

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

Ответ 2

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

Первая

(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

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

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

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

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

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

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

5
x

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

Сокращение для (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 имеют тенденцию вызывать этот возвращенный код (а иногда даже рукописный код) "list" вместо "code", по причинам, которые будут кровоточить очевидными, когда вы копаете чуть глубже. Удачи:)

Ответ 7

Если вы ищете лучшую 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

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