Что такое "(апостроф) в Лиспе / Схеме?

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

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

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

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

(atom? 'turkey)

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

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

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

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

7 ответов

Решение

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

(quote foo)

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

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

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

Первый:

(atom? 'turkey)

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

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

второй

(atom? turkey)

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

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

Резюме

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

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

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

На странице about на codepad написано, что она использует "MzScheme v372 [cgc]".

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

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

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

Это отображает:

5
Икс

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

Сокращение для (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")))) напечатал бы "Привет".
(eval (eval (eval ''''(print "hello"))) - заметить еще ' затем eval - не будет ничего печатать, но вернет код (print "hello") сам!!

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

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

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

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

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

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

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

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

(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 и передает значение в Это. С тех пор мы не предоставили ему никакой ценности

Другие вопросы по тегам