Вопрос

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

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

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

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

(atom? 'turkey)

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

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

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

  2. Что '?

Это было полезно?

Решение

Форма '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") сам!!

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

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

  2. Символ одинарной кавычки является синтаксическим сахаром для выражения «цитата», поэтому «индейка» — это то же самое, что (кавычка индейка).По сути, «цитата» означает отключение оценщика схемы.Другими словами, «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 и передает ему значение.Поскольку мы не придали ему никакой ценности.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top