Что такое ' (Апостроф) в Lisp / Scheme?



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

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

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

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

(atom? 'turkey)

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

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

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

  2. что это '?

135   7  

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.

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

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

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

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

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

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

    Ничего не найдено.

Добавить ответ:
Отменить.