Я прочитал в книге Land of Lisp, что лямбда-функция является единственной встроенной функцией. . Однако я действительно не понимаю, как это возможно, потому что я думал, что вам понадобится по крайней мере одна команда для сложения, одна для сравнения чисел и одна для перемещения данных из одной переменной в другую. Мне было интересно, может ли кто-нибудь объяснить мне, как это делает lisp. Я не математик, поэтому, если это возможно, не могли бы вы также объяснить это без сложной математики?
Как работает лямбда-функция в lisp?
Ответы (3)
«Земля Лиспа» говорит здесь не о том, что lambda
является единственным примитивом Лиспа, а скорее о том, что (согласно лямбда-исчислению Алонзо Черча, которое имеет теоретическую основу для Лиспа) можно реализовать остальную часть Лиспа с помощью lambda
, как лямбда-исчисление. эквивалентна универсальной машине Тьюринга.
Для большинства практических приложений lambda
используется для определения анонимных функций.
В этом разница между теорией и реальным языком программирования.
Лисп взял идеи из лямбда-исчисления, но не реализует их. Лямбда-исчисление описывает систему для выполнения вычислений с использованием функций. Полезно понимать лямбда-исчисление, но вы не будете программировать на чистом лямбда-исчислении, когда будете использовать Лисп.
Как язык программирования, Lisp имеет все виды типов данных и операций для них (числа, строки, символы, cons-ячейки, символы, функции и т. д.).
Сравните это с машинами Тьюринга и чем-то вроде языка программирования C.
Вы тут что-то путаете. lambda
не является функцией. Это конструкция, встроенная в язык Lisp.
Любой практический Лисп будет иметь множество встроенных функций; ему нужны как минимум car
и cdr
для разделения списков, а некоторые примитивные арифметические функции не могут быть определены в терминах других функций. (*) Кроме того, "нефункциональные" части Лиспа, такие как setf
, нуждаются в некоторых примитивах.
[*] Вы можете выполнять церковную арифметику в Лиспе, но тогда вы не сможете красиво -печатать результаты из-за системы типов Лиспа, но сможете ли вы правильно распечатать результат, зависит от варианта Лиспа.
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
lambda
это не функция, это особая форма. И, безусловно, в каждом лиспе есть встроенные функции, которые пользователь не мог бы определить, если бы они не существовали (например, функция +, как вы упомянули). Я думаю, что в книге могло бы быть сказано, что лямбда — это единственный способ определить функции, встроенный в язык (например,defun
— это просто макрос, построенный поверх лямбда). - person sepp2k   schedule 03.01.2012if
или что-то подобное. - person SK-logic   schedule 03.01.2012if
: вы можете использовать лямбда-выражения для задержки оценки. Прекрасный пример перестроения языка только с помощью лямбда-выражений находится на странице 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