Что такое ' (Апостроф) в Lisp / Scheme?
Я нахожусь на день 1 час 1 обучения себя схеме. Излишне говорить, что я ничего не понимаю. Так что я читаю Маленький Интриган и, используя эту вещь:
как переводчик.
мне нужно использовать
(atom? 'turkey)
чтобы избежать ошибки" неопределенная переменная". The '
, согласно книге, является распространенной шепелявостью.
у меня два вопроса:
является ли переводчик, о котором я упоминал выше, хорошим? Можете порекомендовать другую? Мне нужен тот, который будет хорошо сочетаться с Маленький Интриган.
что это
'
?
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
is (quote turkey)
, который оценивается в символ turkey
.
Scheme повторно использует s-выражения и строит свои программы из s-выражений. Это приводит к проблеме, что когда-нибудь turkey
должна быть переменной и иногда это должен быть символ. Это немного сбивает с толку новичка. Через некоторое время ты увидишь силу, стоящую за этим.
SISC хорош, но еще более легкий онлайн-исполнитель схемы http://codepad.org. Это на самом деле не REPL в том, что это не интерактивно, но это довольно близко. Код вы отправляете выполнен на сервер сторона вместо использования апплета браузера. И вы можете поделиться кодом, который вы используете по короткому URL.
на о страница на codepad говорит, что использует " 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"))))
будет печатать "Hello".(eval (eval (eval ''''(print "hello")))
- обратите внимание еще один '
затем eval
- ничего не будет печатать, но он вернет код (print "hello")
себя!!
за исключением того, что шепот, как правило, называют этот возвращенный код (а иногда даже рукописный код) "списком" вместо "кода" по причинам, которые будут очевидны, поскольку вы копаете немного глубже. Удачи :)
Я предлагаю вам перейти в лучшую среду, такую как PLT схема, который имеет IDE, отладчик и множество библиотек. Когда вы продвигаетесь вперед и начинаете писать большие программы, они вам понадобятся.
символ одной кавычки является синтаксическим сахаром для выражения "цитата", поэтому " Турция такая же, как (цитата Турция). В принципе, то, что делает" цитата", - это отключить оценщик схемы. Другими словами, "quote" возвращает выражение, дословный. Если бы не было "цитаты", то схема попыталась бы оценить" Турцию " в нынешних условиях. Это не обычная шепелявость, а шепелявость. Общий Lisp и схема являются двумя диалектами Lisp. Использование "цитаты" объясняется во всех учебниках/книгах Lisp. Также смотрите ответы на этот вопрос.
символ одинарной кавычки-это сокращенный способ сказать (цитата foo), где цитата-это форма для возврата только foo без ее оценки.
одна вещь, которую действительно нужно помнить в схеме или любом Lisp, если на то пошло, - это то, что все оценивается по умолчанию. Итак, в случаях, когда вы не хотите оценивать, вам нужен способ сидеть это.
цитирование что-то делает именно это, и одинарная кавычка просто требует меньше ввода и приводит к менее подробному коду.
если вы ищете лучшую IDE для scheme
тогда вперед Dr Racket
. Но когда начать Dr Racket
первая строка должна быть #lang scheme
С Dr Racket
имеет много языков, которые мы явно упоминаем, какой язык мы будем использовать.
когда мы хотим передать сам аргумент вместо передачи значения аргумента, мы используем quote. Это в основном связано с процедурой, проходящей во время использования списков, пар и атомов, которые недоступны на языке программирования 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
последняя строка (атом? 'abc) передает abc, как это к процедуре, чтобы проверить, является ли abc атомом или нет, но когда вы проходите (атом? abc) затем он проверяет значение abc и передает ему значение. С тех пор мы не предоставили ему никакой ценности