Что такое "(апостроф) в Лиспе / Схеме?
Я в 1-й день 1-го часа учу себя Схеме. Само собой разумеется, я ничего не понимаю. Итак, я читаю "Маленький мошенник" и использую эту вещь:
как переводчик.
Мне нужно использовать '
например
(atom? 'turkey)
чтобы избежать ошибки "неопределенная переменная". '
Согласно книге, это вещь Common Lisp.
У меня есть два вопроса:
Является ли упомянутый выше переводчик хорошим? Можете ли вы порекомендовать другой? Мне нужен тот, который будет хорошо с The Little Schemer.
Что такое
'
?
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 или любом Лиспе - все оценивается по умолчанию. Таким образом, в случаях, когда вы не хотите оценивать, вам нужен способ решить эту проблему.
Цитирование чего-либо делает именно это, и одиночная кавычка просто требует меньше ввода и приводит к меньшему количеству подробного кода.
Я предлагаю вам перейти в лучшую среду, такую как PLT Scheme, в которой есть IDE, отладчик и множество библиотек. По мере продвижения вперед и написания более крупных программ они вам понадобятся.
Символ одинарной кавычки является синтаксическим сахаром для выражения "кавычка", поэтому "индейка" - это то же самое, что и "цитата индейки". По сути, то, что делает "цитата", - это отключение оценщика схемы. Другими словами, "цитата" возвращает выражение дословно. Если бы не было "цитаты", то Схема попыталась бы оценить "индейку" в текущей среде. Это не вещь 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 и передает значение в Это. С тех пор мы не предоставили ему никакой ценности