Подтвердить что ты не робот

Как я могу получить Lisp?

Я читал Природа Lisp. Единственное, что я действительно выбрал, это "код - это данные". Но без определения того, что означают эти термины и почему их обычно считают раздельными, я не понимаю. Моя первоначальная реакция на "код - это данные", так что?

4b9b3361

Ответ 1

Напишите Lisp код. Единственный способ действительно "получить" Lisp (или любой язык, если на то пошло) - это свернуть рукава и реализовать в нем некоторые вещи. Как и все остальное, вы можете читать все, что хотите, но если вы хотите действительно понять, что происходит, вам нужно выйти за пределы теоретического и начать работать с практическим.

Ответ 2

Старомодный вид: "это" интерактивное вычисление с символическими выражениями.

Lisp позволяет простое представление всех видов выражений:

английское предложение

(the man saw the moon)

математике

(2 * x ** 3 + 4 * x ** 2 - 3 * x + 3)

правила

(<- (likes Kim ?x) (likes ?x Lee) (likes ?x Kim))

а также Lisp

(mapcar (function sqr) (quote (1 2 3 4 5)))

и многие другие.

Lisp теперь позволяет писать программы, которые вычисляются с помощью таких выражений:

(translate (quote (the man saw the moon)) (quote german))

(solve (quote (2 * x ** 3 + 4 * x ** 2 - 3 * x + 3)) (quote (x . 3)))

(show-all (quote (<- (likes Kim ?x) (likes ?x Lee) (likes ?x Kim))))

(eval (quote (mapcar (function sqr) (quote (1 2 3 4 5)))))

Интерактивный означает, что программирование - это диалог с Lisp. Вы вводите выражение, а Lisp вычисляет побочные эффекты (например, вывод) и значение.

Итак, ваш сеанс программирования похож на "разговор" с системой Lisp. Вы работаете с ним, пока не получите правильные ответы.

Что это за выражения? Это предложения на каком-то языке. Они являются описанием деталей турбин. Это теоремы, описывающие двигатель с плавающей запятой процессора AMD. Это выражения компьютерной алгебры в физике. Это описания схем. Это правила в игре. Это описания поведения актеров в играх. Это правила в медицинской диагностической системе.

Lisp позволяет записывать факты, правила, формулы как символические выражения. Это позволяет вам писать программы, которые работают с этими выражениями. Вы можете вычислить значение формулы. Но вы также можете легко писать программы, которые вычисляют новые формулы из формул (символическая математика: интегрировать, выводить,...). Это был Lisp, предназначенный для.

В качестве побочных эффектов также представлены программы Lisp. Затем есть программа Lisp, которая оценивает или компилирует другие программы Lisp. Итак, сама идея Lisp, вычисления с символическими выражениями, была применена к Lisp самому. Lisp программы являются символическими выражениями, а вычисление - выражением Lisp.

Алан Кей (известность Smalltalk) называет исходное определение Lisp оценки в Lisp уравнениях Максвелла программирования.

Ответ 3

То, как вы "получаете" любой язык, - это попытаться написать в нем некоторый код.

О значении "data is code", в большинстве языков существует четкое разделение между исполняемым кодом и обработанными данными.

Например, следующая простая C-подобная функция:

void foo(int i){
  int j;

  if (i % 42 == 0){
    bar(i-2);
  }

  for (j = 0; j < i; ++j){
    baz();
  }
}

фактический поток управления определяется один раз, статически, при написании кода. Функция bar не изменится, и оператор if в начале функции не исчезнет. Этот код не является данным, он не может управляться программой.

Все, с чем можно манипулировать, это начальное значение i. И, с другой стороны, это значение не может быть выполнено так, как может быть код. Вы можете вызвать функцию foo, но вы не можете вызвать переменную i. Таким образом, i - это данные, но это не код.

Lisp не имеет такого различия. Программный код - это данные, которые тоже можно манипулировать. Ваш код может во время выполнения использовать функцию foo и, возможно, добавить другой оператор if, возможно, изменив условие в for-loop, возможно, замените вызов на baz другим вызовом функции. Весь ваш код - это данные, которые можно проверять и обрабатывать так же просто, как вышеприведенная функция может проверять и обрабатывать целое число i.

Ответ 4

Я бы очень рекомендовал Структура и интерпретация компьютерных программ, которая фактически использует схему, но это диалект lisp. Это поможет вам "получить" lisp за счет того, что вы выполняете множество различных упражнений и продолжаете показывать некоторые из способов, которыми lisp так полезен.

Ответ 5

Я думаю, что у вас должно быть больше сочувствия к авторам компилятора, чтобы понять, насколько фундаментальным является код. Я признаю, что я никогда не брал курс компиляторов, но преобразование любого достаточно высокоуровневого языка в машинный код является трудной проблемой, а LISP во многом напоминает промежуточный шаг в этом процессе. Точно так же, как C "близко к металлу", LISP близок к компилятору.

Ответ 6

Это сработало для меня:

  • Прочитайте "Маленький Schemer". Это кратчайший путь, чтобы заставить вас думать в режиме Lisp (минус макросы). В качестве бонуса это относительно короткое/веселое/недорогое.

  • Найдите хорошую книгу/учебник, чтобы вы начали с макросов. Я нашел главу 8 "Схемы Язык программирования "является хорошей отправной точкой для Схемы.

http://www.ccs.neu.edu/home/matthias/BTLS/

http://www.scheme.com/tspl3/syntax.html

Ответ 8

В Common Lisp "код - это данные" сводится к этому. Когда вы пишете, например:

(add 1 2)

ваша система Lisp проанализирует этот текст и сгенерирует список с тремя элементами: символом ADD и цифрами 1 и 2. Так что теперь это данные. Вы можете делать с ними все, что хотите, заменять элементы, вставлять другие вещи и т.д.

Интересной частью является то, что вы можете передать эти данные компилятору и, поскольку вы можете управлять этими структурами данных с помощью самой Lisp, это означает, что вы можете писать программы, которые пишут другие программы. Это не так сложно, как кажется, и Lispers все время использует макросы. Итак, просто получите книгу о Lisp и попробуйте.

Ответ 9

Хорошо, я собираюсь взломать это. Я новичок в Lisp сам, только что приехав из мира питона. Я не испытал неожиданного момента просветления, о котором говорят все старые Lispерс, но я скажу вам, что я вижу до сих пор.

Сначала рассмотрим этот случайный бит кода python:

def is_palindrome(st):
    l = len(st)/2
    return True if st[:l] == st[:-l-1:-1] else False

Теперь посмотрим на это:

"""
def is_palindrome(st):
    l = len(st)/2
    return True if st[:l] == st[:-l-1:-1] else False
"""

Что вы, как программист, видите? Код идентичен, FYI.

Если вы похожи на меня, вы будете склонны думать о первом как активном коде. Он состоит из нескольких синтаксических элементов.

Второй, несмотря на его сходство, является одним синтаксическим элементом. Это строка. Вы взаимодействуете с ним как единое целое. Чтобы справиться с ним как с кодом - удобно управлять его синтаксическими границами - вам нужно будет немного разобрать. Чтобы выполнить его, вам нужно вызвать интерпретатор. Это не то же самое, что и первое.

Итак, когда мы создаем код на большинстве языков, с чем мы имеем дело? Строки. Когда я создаю HTML или SQL с помощью python, я использую строки python как интерфейс между двумя языками. Даже если я создаю python с python, строки являются инструментом. *

Разве мысль об этом просто... не хочет ли ты танцевать с радостью? Там всегда такое гротескное несоответствие между тем, с которым вы работаете, и тем, над чем вы работаете. Я чувствовал, что в первый раз, когда я создал SQL с perl. Различия в побеге. Различия в форматировании: подумайте о попытке получить сгенерированный html-документ, чтобы он выглядел аккуратно. Материал непросто повторно использовать. Etc.

Чтобы решить проблему, мы последовательно создаем шаблонные библиотеки. Их из них. Почему так много? Я предполагаю, что они никогда не будут удовлетворительными. К тому времени, когда они начинают становиться достаточно мощными, они превратились в чудовища. Конечно, некоторые из них, такие как SQLAlchemy и Genshi в мире python, - очень красивые и замечательные чудовища. Давайте... гм... избегайте упоминания о PHP.

Поскольку строки создают неудобный интерфейс между обработанным языком и обработанным, мы создаем третий язык - шаблоны - чтобы избежать их. ** Это также имеет тенденцию быть немного неудобным.

Теперь посмотрим на блок цитируемого кода Lisp:

'(loop for i from 1 to 8 do (print i))

Что вы видите? Как новый кодер Lisp, я поймал себя на том, что рассматриваю это как строку. Это не так. Это неактивный Lisp код. Вы смотрите на кучу списков и символов. Попытайтесь оценить его после поворота одной из круглых скобок. Язык не позволит вам это сделать: синтаксис принудительно.

Используя квазиквадруты, мы можем отбросить наши собственные значения в этот неактивный Lisp код:

`(loop for i from 1 to ,whatever do (print i))

Обратите внимание на природу обувной машины: один элемент заменен другим. Мы не форматируем наше значение в строку. Мы сдвигаем его в слот кода. Все это аккуратно и аккуратно.

На самом деле, если вы хотите прямо редактировать текст кода, вы столкнулись с проблемой. Например, если вы вставляете имя <varname> в код, и вы также хотите использовать <varname> -tmp в том же коде, вы не можете сделать это напрямую, как вы можете, с помощью строки шаблона: "% s-tmp =% s". Вы должны извлечь имя в строку, переписать строку, а затем снова включить ее в символ и, наконец, вставить.

Если вы хотите понять суть Lisp, я думаю, что вы можете получить больше, проигнорировав defmacro и gensyms, и все, что на данный момент одевается. Проведите некоторое время, исследуя потенциал квазикота, включая вещь @. Это довольно доступно. Сам Defmacro обеспечивает простой способ выполнения результата квазиквадратов. ***

Что вы должны заметить, так это то, что герметичная строка/шаблонный барьер между обработанным и обработанным полностью исключается в Lisp. Когда вы его используете, вы обнаружите, что ваше ощущение двух разных слоев - активного и пассивного - имеет тенденцию рассеиваться. Функции вызывают макросы, которые вызывают макросы или функции, которые имеют функции (или макросы!), Переданные с их аргументами. Это своего рода большой суп - немного шокирующий для новичка. Тем не менее, я не считаю, что различие между макросами и функциями является столь же плавным, как говорят некоторые люди Lisp. В основном это нормально, но каждый раз, когда я блуждаю в супе, я нахожу себя натыкающимся на призрак этого старого барьера - и он действительно меня ползет!

Я с этим справимся, я уверен. Не важно. Удобство платит за страх.

Теперь Lisp работает с Lisp. Как насчет работы на других языках? Я еще не совсем там, лично, но я думаю, что вижу свет в конце туннеля. Вы знаете, как люди Lisp продолжают говорить о том, что S-выражения - это то же самое, что и дерево разбора? Я думаю, идея состоит в том, чтобы проанализировать иностранный язык в S-выражениях, работать над ними в удивительном комфорте среды Lisp, а затем отправить их обратно на собственный код. Теоретически, каждый язык там может быть превращен в S-выражения или даже исполняемый код Lisp. Вы не работаете на первом языке в сочетании с третьим языком для создания кода на втором языке. Это все - пока вы работаете над ним - Lisp, и вы можете сгенерировать все это с помощью квазиквадратов.

Посмотрите на это (заимствованный из PCL):

(define-html-macro :mp3-browser-page ((&key title (header title)) &body body)
  `(:html
     (:head
      (:title ,title)
      (:link :rel "stylesheet" :type "text/css" :href "mp3-browser.css"))
     (:body
      (standard-header)
      (when ,header (html (:h1 :class "title" ,header)))
      ,@body
      (standard-footer))))

Похож на S-выражение версии HTML, не так ли? У меня такое ощущение, что Lisp отлично работает как собственная библиотека шаблонов.

Я начал задумываться о версии S-выражения python. Будет ли это квалифицироваться как Lisp? Это, конечно, не было бы общим Lisp. Может быть, было бы лучше - для программистов на питоне, по крайней мере. Эй, а как насчет P-выражения?

* Теперь у Python есть нечто, называемое AST, которое я не изучил. Также человек может использовать списки python для представления других языков. Относительно Lisp, я подозреваю, что оба они немного взломали.

** SQLAlchemy является своего рода исключением. Это сделало хорошую работу по превращению SQL непосредственно в python. Тем не менее, похоже, что они приложили значительные усилия.

*** Возьмите это у новичка. Я уверен, что я что-то замалчиваю. Кроме того, я понимаю, что quasiquote - не единственный способ генерировать код для макросов. Это, конечно, хороший.

Ответ 10

Данные - это код, представляющий интересную парадигму, которая поддерживает обработку структуры данных как команды. Обработка данных таким образом позволяет обрабатывать и манипулировать структурой различными способами - например, обход - путем его оценки. Более того, парадигма "данные является кодом" устраняет необходимость во многих случаях разрабатывать собственные парсеры для структур данных; сам анализатор языка может использоваться для анализа структур.

Ответ 11

Первый шаг - это забыть все, что вы узнали, со всеми языками C и Pascal. Пустите свой разум. Это самый сложный шаг.

Затем, хорошо ознакомьтесь с программированием, использующим Lisp. Не пытайтесь сопоставить то, что вы видите, с чем-либо, что вы знаете заранее (когда вы поймаете себя на этом, повторите шаг 1). Мне нравилась структура и интерпретация компьютерных программ (использует схему), практические общие Lisp, парадигмы программирования искусственного интеллекта, кастинговые слова в Lisp и другие. Обязательно напишите примеры. Также попробуйте упражнения, но ограничьте себя конструкциями, которые вы узнали в этой книге. Если вы обнаружите, что пытаетесь найти, например, некоторую функцию для установки переменной или некоторого оператора, который похож на цикл for, повторите шаг 1, а затем снова перейдите к главам, чтобы узнать, как это делается в Lisp.

Ответ 13

Важно видеть, что данные - это код И код - это данные. Это подает цикл eval/apply. Рекурсия также интересна.

(Эта ссылка не работает:

! [Eval/Применить] [1]

[1]: http://ely.ath.cx/~piranha/random_images/lolcode-eval_apply-2.jpg

)

Ответ 14

Одна из причин, по которым некоторые университетские программы для компьютерных наук используют Lisp для своих вступительных курсов, заключается в том, что в целом верно, что новичок может более или менее хорошо изучать функциональное, процедурное или объектно-ориентированное программирование. Однако для кого-то, кто уже думает в процедурных утверждениях, гораздо труднее начать думать как функциональный программист, чем делать обратный.

Когда я попытался забрать Lisp, я сделал это "с акцентом C." set! amd begin были моими друзьями и постоянными спутниками. На удивление легко написать код Lisp, не записывая никакого функционального кода, что не является точкой.

Вы можете заметить, что я не отвечаю на ваш вопрос, что верно. Я просто хотел сообщить вам, что это ужасно сложно заставить ваш ум думать в функциональном стиле, и это будет захватывающая практика, которая сделает вас более сильным программистом в конечном итоге.

Kampai!

P.S. Кроме того, вы, наконец, поймете, что "мой другой автомобиль - это наклейка с компакт-диском".

Ответ 15

Чтобы по-настоящему grok lisp, вам нужно написать его.

Учитесь любить car, cdr и cons. Не перебирайте, когда вы можете возвращаться. Начните писать несколько простых программ (факториал, разворот списков, поиск словарей) и проделайте свой путь до более сложных (сортировка наборов элементов, сопоставление образцов).

В коде данные и данные - это код, я бы не стал беспокоиться об этом на данный момент. Вы поймете это в конце концов, и это не критично для обучения lisp.

Ответ 16

Считать Вкл Lisp и Парадигмы в программировании искусственного интеллекта. Оба они имеют превосходный охват макросов Lisp, которые действительно делают код реальностью данных.

Кроме того, при записи Lisp не перебирайте, когда вы можете переписывать или сопоставлять (учитесь любить карту).

Ответ 17

Я бы предложил проверить некоторые из новых вариантов Lisp, например Arc или Clojure. Они немного очищают синтаксис и меньше, и поэтому их легче понять, чем Common Lisp. Clojure был бы моим выбором. Он написан на JVM и поэтому у вас нет проблем с различными реализациями платформ и поддержкой библиотек, которые существуют с некоторыми реализациями Lisp, такими как SBCL.

Ответ 18

Я бы предположил, что это ужасное введение в язык. Есть лучшие места для начала и улучшения людей/статей/книг, чем тот, который вы указали.

Вы программист? Какой язык (ы)?

Чтобы помочь вам в вашем вопросе, может оказаться полезным больше фона.

Ответ 19

О цели всего "кода - данные":

Разве это не из-за " архитектуры фон Неймана"? Если код и данные были расположены в физически отдельных ячейках памяти, биты в памяти данных не могли быть выполнены, тогда как биты в программной памяти не могли быть интерпретированы как что-либо, кроме инструкций для ЦП.

Я правильно понимаю это?

Ответ 20

Я думаю, чтобы узнать все, что у вас есть для этого, например, простой проект.

Для Lisp хороший простой проект является символическим дифференциатором, поэтому, например,

(diff 'x 'x) -> 1
(diff 'a 'x) -> 0
(diff `(+ ,xx ,yy) 'x) where xx and yy are subexpressions
 -> `(+ ,(diff xx 'x),(diff yy 'x))
etc. etc.

а затем вам понадобится упрощение, например

(simp `(+ ,x 0)) -> x
(simp `(* ,x 0)) -> 0
etc. etc.

поэтому, если вы начинаете с математического выражения, вы можете оценить его, чтобы получить его значение, и вы можете оценить его производную, чтобы получить свою производную.

Надеюсь, это иллюстрирует, что может случиться, когда программный код управляет программным кодом.

Как заметил Марвин Мински, компьютерная математика всегда беспокоится о точности и ошибке округления, верно? Ну, это точно или совершенно неправильно!

Ответ 21

Вы можете получить LISP во многих отношениях, наиболее распространенным является использование Emacs или работающий рядом с кем-то, у кого уже развился LISP.

К сожалению, как только вы получите LISP, трудно избавиться от него, антибиотики не будут работать.

Кстати: я также рекомендую Приключения Pythonista в Schemeland.

Ответ 22

То, как я думаю об этом, заключается в том, что лучшая часть "кода - это данные" - это лицо, функция которого, ну, функционально не отличается от другой переменной. Тот факт, что вы можете написать код, который пишет код, является одной из самых мощных (и часто упускаемых) функций Lisp. В результате функции могут принимать другие функции в качестве параметров и даже возвращать функции.

Это позволяет использовать один код на гораздо более высоком уровне абстракции, чем, скажем, Java. Это делает многие задачи элегантными и лаконичными, и, следовательно, делает код более легким для изменения, поддержания и чтения или, по крайней мере, в теории.

Я бы сказал, что единственный способ по-настоящему "получить" Lisp - потратить на это много времени - как только вы его повесите, вы пожелаете, чтобы у вас были некоторые функции Lisp на других языках программирования.

Ответ 23

Это может быть полезно: http://www.defmacro.org/ramblings/fp.html (не о LISP, а о функциональном программировании как парадигме)