Nano Hash - криптовалюты, майнинг, программирование

преобразование ' в кавычки в lisp

Я пытаюсь написать интерпретатор lisp, используя только примитивные функции lisp. Я писал свой eval, но я не уверен, как я могу обнаружить ', поэтому я не оцениваю символ. Я понимаю, что 'x преобразуется в (quote x) внутренне, я запустил интерпретатор lisp и попробовал следующее:

(defun my-car (x) (car x)) 
(my-car (quote x)) -> QUOTE 
(my-car '(x)) -> QUOTE
(my-car 'x) -> Error: Attempt to take the car of A which is not listp.

Я вижу, что в первых двух примерах машина определяет кавычку как первый элемент и возвращает ее, но я не уверен, почему она этого не делает в последнем примере, поскольку по существу 'x следует преобразовать в (цитата x), тогда передал в качестве аргумента my-car. Мне нужно проверить это для одного из базовых случаев my-eval, чтобы, если кавычка предшествует атому, я не возвращал его значение. Есть ли способ сделать это, используя только примитивные функции?

Спасибо!

07.11.2018

  • Вы используете свой собственный интерпретатор для оценки этого фрагмента? В Common Lisp первый и третий должны сигнализировать об ошибке, поскольку аргумент является символом, а не списком, а второй должен возвращать X. 07.11.2018

Ответы:


1

Оценка Лиспа происходит поэтапно.

Первым этапом является считыватель, который преобразует текст (последовательность символов) в формы, т.е. е. списки, символы и литеральные формы (символы, строки, числа, массивы и т. д.).

Читатель также преобразует ' в обернутую кавычку вокруг следующей формы (которая может быть списком, символом и т. д.). 'a читается как (quote a), '(a) читается как (quote (a)).

Eval тогда нужно только правило, как обращаться с quote как с оператором. Он никогда не видит '.

07.11.2018

2

Ваш интерпретатор lisp не ведет себя как Common Lisp. Вы должны получить:

(defun my-car (x) (car x)) 
(my-car (quote x)) -> Error: Attempt to take the car of A which is not listp.
(my-car '(x)) -> X
(my-car 'x) -> Error: Attempt to take the car of A which is not listp.
(my-car (list 'QUOTE 'X)) -> QUOTE
(my-car ''x) -> QUOTE
(my-car (quote 'x)) -> QUOTE
(my-car '(quote x)) -> QUOTE

Шаг за шагом:

Исходный код:

(my-car ''x)

Разобрать:

(my-car (quote (quote x)))

Оценивайте аргументы

(#<Function MY-CAR> (quote x))

Функция вызова:

X

Это я потому, что машина из списка символа QUOTE и символа X есть QUOTE.

07.11.2018
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..