Что такое '(апостроф) в Lisp/Scheme?
-
20-09-2019 - |
Вопрос
Я сейчас 1 час 1 обучаюсь Схеме.Надо ли говорить, что я ничего не понимаю.Итак, я читаю Маленький интриган и используя эту вещь:
в качестве переводчика.
мне нужно использовать '
например, в
(atom? 'turkey)
чтобы избежать ошибки «неопределенная переменная».А '
, согласно книге, это вещь Common Lisp.
У меня есть два вопроса:
Хороший ли переводчик, о котором я упомянул выше?Можете ли вы порекомендовать другой?Мне нужен тот, который будет хорошо сочетаться с Маленький интриган.
Что
'
?
Решение
Форма 'foo
это просто более быстрый способ ввести специальную форму
(quote foo)
то есть «не оценивайте имя foo и не заменяйте его его значением;Я действительно имею в виду имя foo».
Я думаю, что SISC прекрасно подходит для изучения упражнений в TLS.
Другие советы
Вам необходимо понять основные правила оценки Scheme.
Первый:
(atom? 'turkey)
Список представляет собой приложение-функцию, поэтому atom?
оценивается как функция.'turkey
это краткое обозначение для (quote turkey)
.Оценка (quote turkey)
дает символ turkey
.
Итак, затем функция применяется к символу turkey
и вычисляется возвращаемое значение.
Второй
(atom? turkey)
И снова у нас есть приложение-функция и atom?
оценивается как функция.На этот раз turkey
является переменной.Оценка turkey
дает связанное с ним значение - каким бы оно ни было.
Затем функция применяется к значению переменной turkey
.
Краткое содержание
turkey
— это переменная, которой присваивается ее значение. 'turkey
является (quote turkey)
, который оценивается как символ turkey
.
Scheme повторно использует s-выражения и строит свои программы на основе s-выражений.Это приводит к тому, что когда-нибудь turkey
должна быть переменной, а иногда и символом.Это немного сбивает с толку новичка.Через некоторое время вы увидите силу, стоящую за этим.
SISC — это хорошо, но есть еще более легкий онлайн-исполнитель Scheme. http://codepad.org.На самом деле это не REPL, поскольку он не интерактивный, но довольно близок к этому.Отправленный вами код выполняется на сервер сторону вместо использования апплета браузера.И вы можете поделиться кодом, который вы используете, по короткому URL-адресу.
А о страница на кодовой панели говорит, что она использует «MzScheme v372 [cgc]».
Я использую Codepad для всех видов быстрого тестирования фрагментов (включая тестирование образцов кода для ответов SO!).
Что касается синтаксиса кавычек, разницу можно увидеть, используя такой код:
(let ((x 5))
(display x) (newline)
(display 'x) (newline))
Это отображает:
5 x
В первом случае 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")
сам!!
За исключением того, что шепелявцы склонны называть возвращаемый код (а иногда даже рукописный код) «списком», а не «кодом», по причинам, которые станут очевидными, если вы копнете немного глубже.Удачи :)
Я предлагаю вам переехать в лучшую среду, например Схема PLT, в котором есть IDE, отладчик и множество библиотек.Когда вы двинетесь вперед и начнете писать более крупные программы, они вам понадобятся.
Символ одинарной кавычки является синтаксическим сахаром для выражения «цитата», поэтому «индейка» — это то же самое, что (кавычка индейка).По сути, «цитата» означает отключение оценщика схемы.Другими словами, «quote» возвращает выражение дословно.Если бы «кавычки» не было, то Scheme попыталась бы оценить «индейку» в текущей среде.Это не Common Lisp, а Lisp.Common Lisp и Scheme — два диалекта Lisp.Использование «кавычки» объясняется во всех учебниках/книгах по Lisp.Также смотрите ответы на этот вопрос.
Символ одинарной кавычки — это сокращенный способ сказать (quote foo), где quote — это форма возврата просто foo без его вычисления.
В Scheme или любом Lisp следует помнить одну вещь: все оценивается по умолчанию.Итак, в тех случаях, когда вы не хотите оценивать, вам нужен способ это сделать.
Цитирование делает именно это, а одинарные кавычки просто требуют меньше ввода и приводят к менее подробному коду.
Если вы ищете лучшую 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
Последняя строка (атом?'abc) передает abc, как и в процедуру проверки, является ли abc атомом или нет, но когда вы передаете(atom?abc), затем он проверяет значение abc и передает ему значение.Поскольку мы не придали ему никакой ценности.