Информация об изменениях

Сообщение Re[2]: Как работает funcall в Лиспе? от 06.07.2024 0:20

Изменено 06.07.2024 0:50 Worminator X

Re[2]: Как работает funcall в Лиспе?
Здравствуйте, dsorokin, Вы писали:

D>В начале формы ищет название функции из пространства имен функций, а у вас, вообще, ячейка сons! Отсюда у вас недопонимание с компилятором.


Если несложно, то можно объяснить, почему в этом случае funcall для вызова не требуется, а в примере с ООП обязателен?

(print (
        (lambda (x y)
                (format NIL "~d + ~d = ~d" x y (+ x y))
        )
        2
        3
       )
)


У меня из функции-конструктора User возвращается та же самая lambda вроде? В чем разница между этими примерами?
Сначала думал, из-за замыканий (поля id и name), но нет, вроде без них то же самое.
То есть в 1-м случае можно использовать анонимную функцию, а во 2-м обязательно указывать имя.

В JavaScript никакой разницы, передавать имя функции или значение на нее:
function User(name) {
  var id;
  if (!('counter' in User)) {
    User.counter = 0;
  }
  User.counter++;
  id = User.counter;
  return {
    'getId': function() { return id; },
    'getName': function() { return name; },
    'data': function() { return [id, name]; },
    'format': function(f) { return f.replace('%d', id).replace('%s', name); } 
  };
}


Обязательное создание имен в глобальном namespace — это, скорее, больше походит на статические языки, в частности отсутствие анонимных функций (хотя бы без замыканий) это огромный, жирный минус Си. Частично исправленный в GCC (но это нестандартное расширение). На каждый вызов qsort, таймера и т.д. создавать отдельную функцию и придумывать ей имя, всегда это приводило в бешенство. Разумеется, в динамическом языке такой мусор недопустим, не нужно превращать код в помойку.
Re[2]: Как работает funcall в Лиспе?
Здравствуйте, dsorokin, Вы писали:

D>В начале формы ищет название функции из пространства имен функций, а у вас, вообще, ячейка сons! Отсюда у вас недопонимание с компилятором.


Если несложно, то можно объяснить, почему в этом случае funcall для вызова не требуется, а в примере с ООП обязателен?

(print (
        (lambda (x y)
                (format NIL "~d + ~d = ~d" x y (+ x y))
        )
        2
        3
       )
)


У меня из функции-конструктора User возвращается та же самая lambda вроде? В чем разница между этими примерами?
Сначала думал, из-за замыканий (поля id и name), но нет, вроде без них то же самое.
То есть в 1-м случае можно использовать анонимную функцию, а во 2-м обязательно указывать имя.

В JavaScript никакой разницы, передавать имя функции или анонимную функцию, значение типа function:
function User(name) {
  var id;
  if (!('counter' in User)) {
    User.counter = 0;
  }
  User.counter++;
  id = User.counter;
  return {
    'getId': function() { return id; },
    'getName': function() { return name; },
    'data': function() { return [id, name]; },
    'format': function(f) { return f.replace('%d', id).replace('%s', name); } 
  };
}


Обязательное создание имен в глобальном namespace — это, скорее, больше походит на статические языки, в частности отсутствие анонимных функций (хотя бы без замыканий) это огромный, жирный минус Си. Частично исправленный в GCC (но это нестандартное расширение). На каждый вызов qsort, таймера и т.д. создавать отдельную функцию и придумывать ей имя, всегда это приводило в бешенство. Разумеется, в динамическом языке такой мусор недопустим, не нужно превращать код в помойку.