LINUX.ORG.RU

Quote и lambda

 


1

1

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

(define a (quote 1))
(define a (lambda() 1))

(eval a)
(a)
Тут одна и та же семантика. Просто задержка вычислений. Разница в том, что quote принимает только 1 аргумент. Я давно думал об этом, с помощью лямбд можно эмулировать поведение quote. В picolisp, собственно, и нет разницы, там lambda вообще выкинута. Понятное дело, что сейчас, в связи с модой на ФП, с лямбдой связывают кучу всяких заклинаний. Но ведь вплоть до схемы этой всей ФП-лабуды в лиспах не было. Получается, что Маккарти ввел лишнюю сущность в язык. Этот вопрос где нибудь обсуждается? Кто-нибудь видел какие-нибудь бумаги? Может быть, это было простой ошибкой дизайна, которую не успели выпилить и она исторически прижилась?


Ответ на: комментарий от anonymous

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

anonymous
()
Ответ на: комментарий от phill

То етсь реализовать лямбду через quote нельзя, значит она не является лишней сущностью. Ну и да посмотрел бы на факториал через quote

anonymous
()
Ответ на: комментарий от anonymous

То етсь реализовать лямбду через quote нельзя, значит она не является лишней сущностью.

Нет. Ее можно реализовать через quote если quote будет забирать более 1 аргумента. Это одно и то же, фактически.

Ну и да посмотрел бы на факториал через quote

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

(set 'fact (quote (n) (if (> n 2) 1 (* n (fact (- n 1))))))

phill
() автор топика
Ответ на: комментарий от quasimoto

А мне факториал не нужен, я вообще его не умею писать, не комильфо нормальным посанам факториалы писать:)

phill
() автор топика
Ответ на: комментарий от quasimoto

BTW, напиши на своем нормальном вот такой факториал

(define (f)
   (begin 
     (when (> (length f) 2) 
              (pop f -1))
     (push '(if (> 0 1)
                (begin ; Increase return value

                       (setf ((last f) -1) 
                             (* $it ((last f) 1 1))) 
                       
                       ; Change exit condition

                       (dec ((last f) 1 1)) 

                       ; Shorten f if too long

                       (if (> (length f) 4)         
                           (pop f 2))

                       (push (last f) f -1))
                1)
           f
           -1) 
     (setq ((last f) 1 1) (args 0))))

phill
() автор топика
Ответ на: комментарий от phill

Я правильно понял, что в пике (quote (a b) (+ a b)) раскрывается в ((a b) (+ a b)), что в свою очередь является способом традиционной записи (lambda (a b) (+ a b)) ?

staseg ★★★★★
()
Ответ на: комментарий от phill

Нет. Ее можно реализовать через quote если quote будет забирать более 1 аргумента. Это одно и то же, фактически.

Нет, это не одно и то же. Чтобы убедиться в этом - реализуй мне y-кмобинатор (для него нужны только лямбды с одним аргументом)

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

Лол. Этот quote из твоего примера - это и есть лямбда, а никакой не не quote. Естественно, если сделать (define quote labmda), то quote не будет отличаться от лямбды.

anonymous
()
Ответ на: комментарий от anonymous

то quote не будет отличаться от лямбды.

Я и говорю, либо то либо другое. Оба не нужны. Как называть, quote или лямбда — вторично.

phill
() автор топика
Ответ на: комментарий от anonymous

это не одно и то же

Это не одно и то же в недолиспах с лексическим скопом. И чо? Я с этим спорил. Начало прочитай.

phill
() автор топика
Ответ на: комментарий от phill
(defun call (fn &rest args)
  (etypecase fn
    (symbol (apply 'call (eval fn) args))
    (cons (apply (eval `(lambda ,@fn)) args))))

(defparameter f
  '((n) (if (<= n 2) n (* n (call 'f (- n 1))))))

(call 'f 5)
; 120

На CL ничего лучше мне как-то и не придумать.

BTW, напиши на своем нормальном вот такой факториал

Это факториал? Или что-то другое? А то я вообще не понял что это делает.

quasimoto ★★★★
()
Ответ на: комментарий от anonymous

(define quote labmda)

кстати, в схеме и CL вряд ли ты сможешь так сделать. Лямбда - это спецформа, а не функция.

phill
() автор топика
Ответ на: комментарий от phill

Я и говорю, либо то либо другое. Оба не нужны. Как называть, quote или лямбда — вторично.

Лол, ты хотя бы понимаешь, что твоя сахарная квотка неявно использует лямбду и стократно отсосет, не будь таковой в твоем языке?

staseg ★★★★★
()
Ответ на: комментарий от quasimoto

Это факториал? Или что-то другое? А то я вообще не понял что это делает.

Да, это факториал. Он вычисляет факториал синтаксическим парсингом себя самого по ходу исполнения.

phill
() автор топика
Ответ на: комментарий от quasimoto

Парсингом и самомодификацией, точней.

phill
() автор топика

Каникулы начались, да?

Deleted
()
Ответ на: комментарий от phill

Ну давай по порядку.

1. (quote (a b) (+ a b)) 
2. Раскрывается в ((a b) (+ a b))
3. Что есть форма записи анонимной функции, т.е. лямбды.
4. Таким образом, хоть ключевого слова lambda у нас нет, сама лямбда у нас используется.
5. И как тогда ты собираешься вызвать (quote (a b) (+ a b)), не умей язык лямбду?

Так в каком месте я неправ? Если что, я пику совсем не знаю и исхожу из того, что выше мою цепочку рассуждений ты назвал верной.

staseg ★★★★★
()
Ответ на: комментарий от phill

Да, это факториал

Тогда это не нужно, у функциональной спецификации программы «факториал» есть реализации получше — проще и эффективнее.

синтаксическим парсингом себя самого

То есть вот только эта хрень вызывается как (f 5) и возвращает 120?

Как метод вообще — куча сахара, нифига не понятно, чтобы как-то демонстрировать его на других языках.

quasimoto ★★★★
()
Ответ на: комментарий от staseg

не умей язык лямбду

Что ты называешь «уметь лямбду»? Суть этой функции quote в том, чтобы задерживать вычисления. Это все, что она делает. Но в отличии от традиционного quote она берет более одного аргумента.

phill
() автор топика
Ответ на: комментарий от quasimoto

эффективнее

Эффективнее, это как посмотреть. Данная версия не засирает стек, между прочим.

phill
() автор топика
Ответ на: комментарий от quasimoto

как-то демонстрировать его на других языках

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

нифига не понятно

Это newlisp. Вот по такому принципу это работает,

(set 'f 
      (lambda()
        (begin (print "Hi for the "
                      (inc counter) 
                      ". time. ")
               (push (last f) f -1)
               (if (> (length f) 3) 
                   (pop f 1)))))
(f)
Hi for the 1. time.
Hi for the 2. time.
Hi for the 3. time.
Hi for the 4. time.
 ...

phill
() автор топика
Ответ на: комментарий от quasimoto

не нужно

А как же код как данные, о котором кричат лисперы на каждом углу?

phill
() автор топика
Ответ на: комментарий от phill

Что ты называешь «уметь лямбду»? Суть этой функции quote в том, чтобы задерживать вычисления. Это все, что она делает. Но в отличии от традиционного quote она берет более одного аргумента.

Я очень рад за нее, но как ты можешь утверждать, что quote и lambda — одно и то же, если в частном случае quote в эту самую лямбду и раскрывается? Лямбдой я называю дурацкий синтаксис ((a b) (+ a b)), который и заморочил тебе голову.

То есть в твоем лиспе в действительности есть и quote, и лямбда. И каждый занимается своим делом. Первая откладывает вычисления (в твоей терминологии), вторая создает анонимную функцию. И из-за синтаксиса записи лямбды ты решил, что quote сама может использоваться для задания функции. Не стоит и говорить об ошибочности дальнейших выводов о том, что сама лямбда может использоваться для отложения вычислений.

Надеюсь, теперь доходит, как пиковый сахарок жидко обосрался в твоем мозгу?

staseg ★★★★★
()
Последнее исправление: staseg (всего исправлений: 1)
Ответ на: комментарий от phill

Я и говорю, либо то либо другое. Оба не нужны.

Что значит не нужны? quote и lambda - совершенно разные формы и их семантика никак не связана. quote нельзя выразить через lambda, lambda нельзя выразить через quote.

anonymous
()
Ответ на: комментарий от staseg

в действительности есть и quote, и лямбда

Я человек посторонний, но Википедия, какбэ, не на твоей стороне

Unlike Common Lisp, quote evaluates all its arguments, not only the first. Picolisp lacks a lambda function.

anonymous
()
Ответ на: комментарий от phill

Так тоже не понятно.

// (define counter 0)
int c = 0;

// (set 'f (lambda()
void f() {
    // (begin (print "Hi for the " (inc counter) ". time. ")
    std::cout << "Hi for the " << ++c << ". time. " << std::endl;
    // push(last(f), f, -1);
    // if (length(f) > 3) pop(f, 1);
    // WTF?
    f();
}

/*
f();
Hi for the 1. time.
Hi for the 2. time.
...
*/

А как же код как данные

'(код как данные)

quasimoto ★★★★
()
Ответ на: комментарий от phill

Ты просто не понимаешь что такое quote и что такое lambda. quote (как и лямбда) это не функции. и аргументов у них нет. то есть вообще.

anonymous
()
Ответ на: комментарий от anonymous

аргументов у них не

И у макросов и у спецформ и у фекпров есть аргументы. Вопрос лишь в том, когда они вычисляются.

phill
() автор топика
Ответ на: комментарий от phill

Нет, не надо. то, о чем ты говоришь, нарушает принцип «код как данные».

anonymous
()
Ответ на: комментарий от phill

Нет, неправильно. И, еще раз - прочитай что такое quote и что такое lambda. Когда прочитаешь - докажи, что quote НЕ эквивалентно lambda. Считай это домашним заданием. Пока ты не поймешь,бепочему quote не эквивалентно lambda - тем нет смысла дальше иметь дело с лиспом, потому как ты ничего не поймешь.

anonymous
()
Ответ на: комментарий от anonymous

Скорей, я докажу обратное


(define inf-loop (lambda(p) (inf-loop p)))

(define if_ (lambda(a b c) (a b c)))

(define true_ (lambda(x y) (eval x)))
(define false_ (lambda(x y) (eval y)))

(print (if_ true_ (quote 1) (quote (inf-loop 1))))

(define true_ (lambda(x y) (x)))
(define false_ (lambda(x y) (y)))

(print (if_ true_ (lambda() 1) (lambda() (inf-loop 1))))

phill
() автор топика
Ответ на: комментарий от phill

Ты доказал что в одном конкретном случае lambda ведет себя так же как quote. Это ни у кого и так не вызывает сомнения. Но всем понятно, что лямбда и quote - разные вещи, котоыре нельзя выразить друг через друга. Докажи, чот это так.

Еще раз - твоя задача не опровергнуть, а ДОКАЗАТЬ это. То, что lambda != quote - это факт, он всем известен. Не пытайся опровергнуть то, что 2*2=4.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.