Как работает лямбда-функция в lisp?

Я прочитал в книге Land of Lisp, что лямбда-функция является единственной встроенной функцией. . Однако я действительно не понимаю, как это возможно, потому что я думал, что вам понадобится по крайней мере одна команда для сложения, одна для сравнения чисел и одна для перемещения данных из одной переменной в другую. Мне было интересно, может ли кто-нибудь объяснить мне, как это делает lisp. Я не математик, поэтому, если это возможно, не могли бы вы также объяснить это без сложной математики?


person Noah    schedule 03.01.2012    source источник
comment
Вероятно, лучше спросить или выполнить поиск на cstheory.stackexchange.com.   -  person zaf    schedule 03.01.2012
comment
«Я читал в книге «Страна шепелявости», что лямбда-функция — единственная встроенная функция». Можете ли вы привести все предложение (или отрывок), которое, по вашему мнению, говорит об этом? Мне это утверждение кажется довольно странным. lambda это не функция, это особая форма. И, безусловно, в каждом лиспе есть встроенные функции, которые пользователь не мог бы определить, если бы они не существовали (например, функция +, как вы упомянули). Я думаю, что в книге могло бы быть сказано, что лямбда — это единственный способ определить функции, встроенный в язык (например, defun — это просто макрос, построенный поверх лямбда).   -  person sepp2k    schedule 03.01.2012
comment
Лямбда-исчисление — это полная по Тьюрингу система, так что да, с ней можно делать все что угодно. Но не в Лиспе с его семантикой энергичных вычислений - там вам понадобится как минимум if или что-то подобное.   -  person SK-logic    schedule 03.01.2012
comment
@zaf: я действительно не понимаю, как это имеет какое-либо отношение к теоретической информатике (не говоря уже о теоретической информатике исследовательского уровня).   -  person sepp2k    schedule 03.01.2012
comment
@SK-logic Да, но тогда мы говорим о другом языке. Конечно, вы можете написать функцию, которая складывает два числа в церковном коде, используя только лямбда-выражения. Но вы не могли бы написать функцию, которая добавляет два числа Clojure (или два числа Common Lisp, или два числа Scheme), если одно из них еще не было встроено.   -  person sepp2k    schedule 03.01.2012
comment
@zaf: cstheory предназначена для вопросов исследовательского уровня.   -  person hugomg    schedule 03.01.2012
comment
@SK-logic Я не могу представить, зачем вам нужен if: вы можете использовать лямбда-выражения для задержки оценки. Прекрасный пример перестроения языка только с помощью лямбда-выражений находится на странице experthuman.com/programming-with-nothing#. логические значения - в основном определяют true как (lambda (x y) x) и false как (lambda (x y) y). Затем вы можете написать неактивное if как (lambda (test then else) (funcall (funcall test then else))) (или в Clojure, (fn [test then else] ((test then else)))).   -  person amalloy    schedule 03.01.2012


Ответы (3)


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

Для большинства практических приложений lambda используется для определения анонимных функций.

person Cosman246    schedule 09.01.2012
comment
Это кажется лучшим ответом на этот вопрос. Все остальные намного выше головы новичка. - person luser droog; 15.01.2012

В этом разница между теорией и реальным языком программирования.

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

Как язык программирования, Lisp имеет все виды типов данных и операций для них (числа, строки, символы, cons-ячейки, символы, функции и т. д.).

Сравните это с машинами Тьюринга и чем-то вроде языка программирования C.

person Rainer Joswig    schedule 03.01.2012

Вы тут что-то путаете. lambda не является функцией. Это конструкция, встроенная в язык Lisp.

Любой практический Лисп будет иметь множество встроенных функций; ему нужны как минимум car и cdr для разделения списков, а некоторые примитивные арифметические функции не могут быть определены в терминах других функций. (*) Кроме того, "нефункциональные" части Лиспа, такие как setf, нуждаются в некоторых примитивах.

[*] Вы можете выполнять церковную арифметику в Лиспе, но тогда вы не сможете красиво -печатать результаты из-за системы типов Лиспа, но сможете ли вы правильно распечатать результат, зависит от варианта Лиспа.

person Fred Foo    schedule 03.01.2012
comment
Если вы используете кодировку Черча для всего, вам не понадобятся car и cdr (т. е. вместо этого вы можете использовать пары Черча). - person SK-logic; 03.01.2012
comment
@SK-logic: да, но опять же, у вас не было бы настоящего Лиспа, поскольку нельзя было бы распечатать секспрс. - person Fred Foo; 03.01.2012
comment
вы можете определить свой собственный симпатичный принтер (и свой собственный синтаксический анализатор для создания списков в кодировке Черча вместо родных списков Лиспа). - person SK-logic; 03.01.2012
comment
Также хорошо известно, как определить car, cdr и cons из чистого лямбда-исчисления - Lisp предоставляет их только потому, что они должны быть эффективными. (defn cons [x y] (fn [f] (f x y))) (defn car [x] (x (fn [x y] x))) (defn cdr [x] (x (fn [x y] y))). Это удовлетворяет единственному требованию cons/car/cdr: чтобы (eq (car (cons x y)) x) и (eq (cdr (cons x y)) y). - person amalloy; 04.01.2012