Сообщение Re[2]: Как работает funcall в Лиспе? от 06.07.2024 0:20
Изменено 06.07.2024 1:18 Worminator X
Re[2]: Как работает funcall в Лиспе?
Здравствуйте, dsorokin, Вы писали:
D>В начале формы ищет название функции из пространства имен функций, а у вас, вообще, ячейка сons! Отсюда у вас недопонимание с компилятором.
Если несложно, то можно объяснить, почему в этом случае funcall для вызова не требуется, а в примере с ООП обязателен?
У меня из функции-конструктора User возвращается та же самая lambda вроде? В чем разница между этими примерами?
Сначала думал, из-за замыканий (поля id и name), но нет, вроде без них то же самое.
То есть в 1-м случае можно использовать анонимную функцию, а во 2-м обязательно указывать имя.
В JavaScript никакой разницы, передавать имя функции или анонимную функцию, значение типа function:
Обязательное создание имен в глобальном namespace — это, скорее, больше походит на статические языки, в частности отсутствие анонимных функций (хотя бы без замыканий) это огромный, жирный минус Си. Частично исправленный в GCC (но это нестандартное расширение). На каждый вызов qsort, таймера и т.д. создавать отдельную функцию и придумывать ей имя, всегда это приводило в бешенство. Разумеется, в динамическом языке такой мусор недопустим, не нужно превращать код в помойку. Даже в Java, еще до появления лямбд, пытались что-то с этим сделать, ввели анонимные классы. А в C# изначально сдеалали делегаты.
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, таймера и т.д. создавать отдельную функцию и придумывать ей имя, всегда это приводило в бешенство. Разумеется, в динамическом языке такой мусор недопустим, не нужно превращать код в помойку. Даже в Java, еще до появления лямбд, пытались что-то с этим сделать, ввели анонимные классы. А в C# изначально сдеалали делегаты.
Re[2]: Как работает funcall в Лиспе?
Здравствуйте, dsorokin, Вы писали:
D>В начале формы ищет название функции из пространства имен функций, а у вас, вообще, ячейка сons! Отсюда у вас недопонимание с компилятором.
Если несложно, то можно объяснить, почему в этом случае funcall для вызова не требуется, а в примере с ООП обязателен?
У меня из функции-конструктора User возвращается та же самая lambda вроде? В чем разница между этими примерами?
Сначала думал, из-за замыканий (поля id и name), но нет, вроде без них то же самое.
То есть в 1-м случае можно использовать анонимную функцию, а во 2-м обязательно указывать имя.
В JavaScript никакой разницы, передавать имя функции или анонимную функцию, значение типа function:
Обязательное создание имен в глобальном namespace — это, скорее, больше походит на статические языки, в частности отсутствие анонимных функций (хотя бы без замыканий) это огромный, жирный минус Си. Частично исправленный в GCC (но это нестандартное расширение). На каждый вызов qsort, таймера и т.д. создавать отдельную функцию и придумывать ей имя, всегда это приводило в бешенство. Разумеется, в динамическом языке такой мусор недопустим, не нужно превращать код в помойку. Даже в Java, еще до появления лямбд, пытались что-то с этим сделать, ввели анонимные классы. А в C# изначально сдеалали делегаты.
D>По Common Lisp есть хороший учебник: Практическое использование Common Lisp
Спасибо, буду изучать. Похоже, там со времен Джона Маккарти в 1958 напридумывали всего... По статьям из интернета теперь не разберешься, а ведь изначально это был один из самых простых языков. Столяров, пожалуй, прав, когда призывает расстреливать любых стандартизаторов из комитетов.
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, таймера и т.д. создавать отдельную функцию и придумывать ей имя, всегда это приводило в бешенство. Разумеется, в динамическом языке такой мусор недопустим, не нужно превращать код в помойку. Даже в Java, еще до появления лямбд, пытались что-то с этим сделать, ввели анонимные классы. А в C# изначально сдеалали делегаты.
D>По Common Lisp есть хороший учебник: Практическое использование Common Lisp
Спасибо, буду изучать. Похоже, там со времен Джона Маккарти в 1958 напридумывали всего... По статьям из интернета теперь не разберешься, а ведь изначально это был один из самых простых языков. Столяров, пожалуй, прав, когда призывает расстреливать любых стандартизаторов из комитетов.