Как я 'получаю' Lisp? [закрытый]

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

, Как только общее решение этого должно хешировать их в сбалансированное дерево подкаталогов.

22
задан 4 revs, 3 users 57% 11 July 2009 в 19:19
поделиться

22 ответа

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

35
ответ дан 29 November 2019 в 03:15
поделиться

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

0
ответ дан 29 November 2019 в 03:15
поделиться

О том, что «код есть данные»:

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

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

1
ответ дан 29 November 2019 в 03:15
поделиться

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

Вы программист? На каком (ых) языке (ах)?

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

1
ответ дан 29 November 2019 в 03:15
поделиться

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

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

! [Eval / Apply] [1]

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

)

2
ответ дан 29 November 2019 в 03:15
поделиться

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

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

2
ответ дан 29 November 2019 в 03:15
поделиться

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

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

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

2
ответ дан 29 November 2019 в 03:15
поделиться

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

Когда я пытался освоить Лисп, я делал это «с акцентом Си». set! amd begin были моими друзьями и постоянными товарищами. На удивление легко написать код на Лиспе, даже не написав какой-либо функциональный код, но это не главное.

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

2
ответ дан 29 November 2019 в 03:15
поделиться

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

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

3
ответ дан 29 November 2019 в 03:15
поделиться

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

3
ответ дан 29 November 2019 в 03:15
поделиться

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

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

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

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

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

8
ответ дан 29 November 2019 в 03:15
поделиться

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

15
ответ дан 29 November 2019 в 03:15
поделиться
5
ответ дан 29 November 2019 в 03:15
поделиться

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

10
ответ дан 29 November 2019 в 03:15
поделиться

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

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

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

0
ответ дан 29 November 2019 в 03:15
поделиться

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

Что касается «данные - это код», то в большинстве языков существует четкое разделение между кодом, который выполняется, и данными, которые обрабатываются.

Например, следующая простая 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, возможно, заменить вызов baz другой функцией вызов.

24
ответ дан 29 November 2019 в 03:15
поделиться

I would suggest checking out some of the newer variants of Lisp like Arc or Clojure. They clean up the syntax a little and are smaller and thus easier to understand than Common Lisp. Clojure would be my choice. It is written on the JVM and so you don't have the issues with various platform implementations and library support that exist with some Lisp implementations like SBCL.

2
ответ дан 29 November 2019 в 03:15
поделиться

В Common Lisp «код есть данные» сводится к следующему. Когда вы напишете, например:

(add 1 2)

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

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

5
ответ дан 29 November 2019 в 03:15
поделиться

Старомодное представление: «это» - это интерактивное вычисление с символьными выражениями .

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

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

(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 позволяет вам записывать факты, правила, формулы как символические выражения. Это позволяет вам писать программы, которые работают с этими выражениями. Вы можете вычислить значение формулы. Но вы также можете легко писать программы, которые вычисляют новые формулы из формул (символьная математика: интегрировать, вывести, ...). Для этого был разработан Лисп.

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

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

55
ответ дан 29 November 2019 в 03:15
поделиться

Прочтите и усвойте легендарную страницу 13 Руководства программиста на Лисп 1.5

По крайней мере, по словам Алана Кея.

3
ответ дан 29 November 2019 в 03:15
поделиться

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

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

(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.

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

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

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

1
ответ дан 29 November 2019 в 03:15
поделиться

LISP можно получить разными способами, наиболее распространенным из которых является использование Emacs или работа с кем-то, кто уже разработал LISP.

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

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

1
ответ дан 29 November 2019 в 03:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: