- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
package org.casalib.util {
/**
Utilities for constructing and working with Classes.
@author Aaron Clinger
@version 02/13/10
*/
public class ClassUtil {
/**
Dynamically constructs a Class.
@param type: The Class to create.
@param arguments: Up to ten arguments to the constructor.
@return Returns the dynamically created instance of the Class specified by <code>type</code> parameter.
@throws Error if you pass more arguments than this method accepts (accepts ten or less).
@example
<code>
var bData:* = ClassUtil.construct(BitmapData, 200, 200);
trace(bData is BitmapData, bData.width);
</code>
*/
public static function construct(type:Class, ...arguments):* {
if (arguments.length > 10)
throw new Error('You have passed more arguments than the "construct" method accepts (accepts ten or less).');
switch (arguments.length) {
case 0 :
return new type();
case 1 :
return new type(arguments[0]);
case 2 :
return new type(arguments[0], arguments[1]);
case 3 :
return new type(arguments[0], arguments[1], arguments[2]);
case 4 :
return new type(arguments[0], arguments[1], arguments[2], arguments[3]);
case 5 :
return new type(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4]);
case 6 :
return new type(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);
case 7 :
return new type(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6]);
case 8 :
return new type(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7]);
case 9 :
return new type(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7], arguments[8]);
case 10 :
return new type(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7], arguments[8], arguments[9]);
}
}
}
}
guest 19.04.2010 17:13 # +1
nibb13 20.04.2010 10:00 # 0
/**
Instatiates an externally loaded class.
@param className: The full name of the class you wish to instantiate from the loaded SWF.
@param arguments: The optional parameters to be passed to the class constructor.
@return A reference to the newly instantiated class.
@throws Error if method is called before the SWF has loaded.
*/
public function createClassByName(className:String, arguments:Array = null):* {
arguments ||= new Array();
arguments.unshift(this.getClassByName(cl assName));
return ClassUtil.construct.apply(null, arguments);
}
Другим способом инстанциировать класс из подгруженной swf'ки не получится.
nibb13 19.04.2010 17:43 # −1
guest 19.04.2010 17:49 # 0
nibb13 19.04.2010 18:04 # 0
И отличается ли поведение eval в AS3 от AS2? Я "тройку" слабо знаю.
guest 19.04.2010 20:21 # −6
С++.
Lavir_the_Whiolet 19.04.2010 20:43 # +1
Dynamically constructs a Class.
@param type: The Class to create.
guest 19.04.2010 21:47 # −6
TarasB 19.04.2010 22:25 # 0
mov ecx, i
lea eax, arguments
@:
push eax
add eax, 4
dec ecx
jb @
push i
call type
nibb13 20.04.2010 00:10 # 0
Dummy00001 26.04.2010 01:07 # +1
Лучше бы они пример с перла брали где на вход функции приходит абстрактный список и к класам можно по именам обращатся. и у конструктора стандартное имя...
Тем более в асме тебе еще надо самому считывать размер параметров.
ЗЫ в С call convention, параметры просто ложатся на стек: ну вызывающая то сторона всегда знает количество параметров которое она передает. Она же - вызывающая функция - и освобождает стек. Если не угадал с параметрами - крути рулетку как поведет себя вызываемая функция: либо крэш, либо мемори коррапшн, етц.
ЗЗЫ паскалева call covention не поддерживает произвольное кол-во параметров, потому как вызываемая функция отвечает за чистку стека.
Говногость 26.04.2010 07:18 # 0
Dummy00001 26.04.2010 15:53 # −1
WriteLN & ReadLN не есть функции в Паскале, они есть часть синтакса языка.
Говногость 26.04.2010 16:04 # +1
TarasB 26.04.2010 17:43 # +1
procedure Poly(P: array of TPoint);
...
Poly([P1, P2, P3]);
То есть можно передавать любое число параметров (при этом размер массива в данном случае передастся через edx и будет доступен внутри процедуры Poly как Length(P)), но опять же, число параметров должно быть известно на этапе компиляции.
Говногость 26.04.2010 18:11 # 0
Если число парметров не известно на этапе компиляции, то List вам в помощь, например.
roman-kashitsyn 19.08.2011 08:49 # 0
Первые редакции C, к примеру. Такое поведение поддерживается до сих пор. Если в объявлении функции не перечислены параметры, компилятор не знает, сколько их должно быть.
Lavir_the_Whiolet 21.08.2011 09:52 # +2
TarasB 19.04.2010 22:27 # 0
nibb13 20.04.2010 09:44 # −1
Создать инстанс класса по имени класса можно. Вышеописанным методом в AS3 или конструкцией вида:
var classConstructor:Function = eval('MyClassName');
var myClassInstance = new classConstructor();
А вот как конструктору передать неизвестное заранее количество аргументов, если он не поддерживает arguments?
Насколько я понимаю, никак. Потому, что аргументы, передающиеся функции/методу, являются не конструкциями байткода, а пре-компилятивным хардкодом.
С удовольствием ошибусь в мнении.
Lavir_the_Whiolet 20.04.2010 10:21 # 0
nibb13 20.04.2010 10:27 # 0
Но в релизе, конечно, необходимо вычитывать и править. Тут соглашусь.
Я думал, что основная претензия была к "case 0..10", чего и удивлялся, т.к. адекватной замены в упор не вижу. Выглядит всё равно диковато... :D
KOSH 21.04.2010 11:30 # 0
nibb13 21.04.2010 18:53 # 0
trace(new Array(eval('1,2,3')));
Пишет "undefined", само собой. Причины есть в справке Macromedia/Adobe.
В AS3 eval вообще нет, как выяснилось.
Для AS3 есть "костыль" через "Tamarin": http://danielmclaren.net/2008/09/21/eval-in-as3-tips-for-executing-dynamic-actionscript
но он ещё угробищнее, чем решение Клингера.
Lavir_the_Whiolet 21.04.2010 21:05 # 0
nibb13 21.04.2010 21:26 # 0
На мой взгляд AS - единственный жизнеспособный client-side язык для веба.
А вот в чём действительно ужас - так это в стандартных компонентах от Macromedia (Flash MX и далее). Уровень "индусизма" зашкаливает. Серьёзные баги в каждом компоненте. Код оттуда так и просится на этот сайт, только исходники закрыты и декомпиляция запрещена. :(
Кстати, сам язык не запостишь, но отдельные характерные для него конструкции - почему бы и нет?
Lavir_the_Whiolet 21.04.2010 22:07 # 0
А Flex SDK не закрыт. И уровень "индусизма" там ничуть не меньше. Так что вперед! >:)
wvxvw 25.04.2010 20:33 # 0
А по поводу примера - в рамках АС3 другого выхода нет, не смотря на то, что до функции конструктора в принципе можно добрарься, вызвать ее через call() / apply() не получится, ВМ не даст.
А чем вам импорты и пакеджи не угодили? Вполне себе нормальная практика высокоуровневых языков.
Lavir_the_Whiolet 26.04.2010 05:47 # 0
Нужны. Точка.
> А язык такой потому что хотели сделать одинаково для жабаскрипта и для АС, но не получилось.
А мне показалось, что просто слизали побольше модных фич с распиаренных языков... Причем местами совершенно не задумываясь, зачем они нужны и нужны ли вообще.
> А по поводу примера - в рамках АС3 другого выхода нет, не смотря на то, что до функции конструктора в принципе можно добрарься, вызвать ее через call() / apply() не получится, ВМ не даст.
Вот к чему приводит тупое копирование фич из других языков.
> А чем вам импорты и пакеджи не угодили? Вполне себе нормальная практика высокоуровневых языков.
А вот тут я зафейспальмил. Дико. Так зафейспальмил, что аж уснул, и вот утром решил ответить.
Это нормальная практика для современных высокоуровневых языков, но ненормальная практика для языков программирования вообще. Скажите честно, коллеги, кто-нибудь из вас вообще хоть раз правил их сам? А если и правил, то не материл ли IDE, которая can not organize imports?
IM-порты появились в Java и то только потому, что ее создатели поленились написать автоматическую искалку модулей (как и реализовать множественное наследование, кстати). А другие, вместо того, чтобы применить хоть немного мозга, подумали, что это круто - заставлять программиста самого указывать, какие он использует модули - это же в крутой Java сделано; и стали тупо копировать это в свои языки.
В языках, при проектировании которых был применен мозг, а не Ctrl+C-Ctrl+V (например, Eiffel), никаких пакагесов и тем более IM-портов нет.
Пакагесы с IM-портами - это чистый бойлерплейт. Чище C-шных #include-ов.
Говногость 26.04.2010 07:22 # 0
Lavir_the_Whiolet 26.04.2010 12:11 # 0
wvxvw 26.04.2010 10:41 # 0
А по поводу вложеных функций ваш ответ похож на ответ следующий за вашим - я не говорю что они вообще в принципе не нужны, просто в рамках того, что возможно сделать они там как на корове седло. И вообще, для них и компилятор надо было бы писать совсем по-другому... да и синтаксис и так трудно парсить, а если еще туда и лямбда функции добавить, так компиляции можно будет годами ждать.
По поводу копирования фич из распиареных языков - тоже как-то сомнительно, а можно пример? Как по мне, лучше бы действитело копировали :)
Чего, на мой взгляд, паталогически не хватает - массивов и примитивных типов данных (т.е. обычных индексированых массивов, т.как ECMA Array это не массив, а более сложная коллекция, ну и Byte, Char, Long и т.п.). Генерики тоже бы очень не помешали... Ну и больше возможностей компилятора - инлайн, шаблоны...
Lavir_the_Whiolet 26.04.2010 12:15 # 0
Они мешают тем, что их нужно печатать. Я не встречал еще ни одной ситуации, когда их не могла бы сгенерировать машина. А так они мне только мешаются, потому что почему-то не все среды разработки умеют их organize.
> они там как на корове седло.
Lavir_the_Whiolet 26.04.2010 12:26 # +1
Они мешают тем, что их нужно печатать. Я не встречал еще ни одной ситуации, когда их не могла бы сгенерировать машина. А так они мне
только мешаются, потому что почему-то не все среды разработки умеют их organize.
> вложенные функции там как на корове седло.
...потому что спроектированы индусами. Хорошие вложенные функции использовать удобно и приятно, see Ruby или Scala.
> так компиляции можно будет годами ждать.
Уже. Индусы can not into optimization. Синтаксис C++ куда сложнее, а компилируется в разы быстрее.
> По поводу копирования фич из распиареных языков - тоже как-то сомнительно, а можно пример?
Пакагесы - из Java. get-set - из C#, похоже. Причем слизано через зад. Синтаксис - тоже из Java. Недо-ООП с интерфейсами и без множественного наследования - из Java. Да даже ASDoc с Javadoc-а слизан. И недопилен, да.
А теперь взгляните на Eiffel.
Говногость 26.04.2010 15:35 # 0
Говногость 26.04.2010 15:41 # 0
Хотя да, если боишься, то присутсвующее в языке множественное наследование можно и не использовать.
Lavir_the_Whiolet 26.04.2010 18:19 # 0
И да, когда им не пользуешься, и оно есть - это одно, а когда им пользуешься, и его нет - это, <censored>, совсем другое.
Говногость 26.04.2010 18:24 # 0
"И да, когда им не пользуешься, и оно есть - это одно, а когда им умеешь пользоваться и сильно хочется, а его нет - это, <censored>, совсем другое."
wvxvw 26.04.2010 20:38 # 0
- Компилятор писали американцы, и я даже знаю кто - http://stopcoding.wordpress.com/ , индусы там не при чем :) Писал его по сути один человек... Решение на чем его писать принимал, по всей видимости не он, а продакт менеджеры - и то, что теперь имеем самый популярный компилятор для AS3 написаный на Яве (которая перед каждым запуском должна еще свой рантайм поднять, да и не бог весть какая шустрая сама по себе + проблемы с объемами памяти и т.д. и т.п.)
Вобщем, компилятор наш, он как бы "игрушечный", ну, так выглядит... Поэтому лучше уж там будут импорты. Если это сократит время компиляции, хоть на немного - буду их печатать, - напечатать это всего один раз, а компилировать прийдется много :) Кроме того, на стуктуру языка это вообще никак не влияет, это претензия в духе "а по чему у вас в языке много прописных букв, или подчерков, или доллaров?" (Нужное подчеркнуть).
Лямбда функции и АС3 ну просто никак не дружат друг с другом, ну вот так вот, или пишите на другом языке, где они есть, или учитесь пользоваться даденым инстументом, незачем со своим уставом в чужой монастырь. В HaXe есть немного больше от функциональных языков (см. callback и using). Если нравится такой подход - пожалуйста, есть другой язык, с другим подходом, компилирующийся при желании в то же самое.
С множественным наследованием у меня был всего один контакт в жизни, и ничего хорошего для себя я в нем не нашел (что, наверняка не отменяет его полезность, но тем не менее) - SVG - его элементы предполагают (и обязывают) к множественному наследованию. В большинсте случаев это просто не удобно и накладывает больше ограничений, чем дает возможностей...
Не знаю, к AS3 можно выставлять много справедливых претензий, но ваши откровенно говоря высосаны из пальца - вам нравится другой язык, так замечательно, пишите на нем, в мире есть много хороших и не похожих друг на друга языков.
Lavir_the_Whiolet 27.04.2010 08:05 # 0
Бесят кулибины, засравшие мои интернеты своими поделиями и манагеришки, которые эти поделия заставляют использовать.
guest 27.04.2010 08:20 # −3
C++
wvxvw 27.04.2010 11:59 # 0
Просто для общей информации - AS3 это реализация ECMA4 которая по разным политическим и техническим соображениям была в дальнейшем оставлена. У этого языка есть автор, но это тот же человек, что в 1995 году придумал JavaScript - т.е. если бы он придумал AS3 учась в последнем классе школы (2005), то он должен был придумать JavaScript когда ему было 7-8 лет :) Да, кроме того, JavaScript существующий сейчас в FireFox очень похож на AS3 т.как в отличие от остальных браузеров, где есть только JavaScript 1.5 в FF это либо 3.6 либо 4 (не путайте с Майкрософтовским JScript, у них версии не зависимы от ECMA, и JScript 5.5 - это все тот же JavaScript 1.5 по сути.
Ну а если серьезно - то у языка не один автор конечно, и как ни странно, в его создании замешаны всякие большие компании, даже тот же MS, Apple, Mozilla, и др. :) Что ни в коем случае не гарантирует качества, но тем не менее не соответствует вашей гипотезе.
Интересный момент: некоторые популярные языки были действительно придуманы, ну, не школьниками, а студентами, тот же PHP например.
И это... напишите свой, хороший, Интернет. Я абсолютно с вами согласен, этот Интернет никуда не годится - его место на помойке! :)
guest 27.04.2010 14:25 # −1
Lavir_the_Whiolet 27.04.2010 14:26 # 0
> Что ни в коем случае не гарантирует качества
вдвойне.
Это называется "намутили".
guest 27.04.2010 21:52 # 0
столяр говорит:"блин, ненавижу ключ на 10, им плохо доски отёсывать"
а слесарь ему в ответ:"ты, сам му**к, ключ на 10 это классно, а вот топором гайку закручивать это попа, топор - отстой"
и пошла драка не на жизнь а на смерть
Lavir_the_Whiolet 28.04.2010 12:21 # 0
Встретились столяр и слесарь. Столяр говорит: "блин, ненавижу китайский рубанок, нихрена не снимает, ломается каждые пять минут - плохо, в общем". А слесарь ему в ответ: "так возьми другой, швейцарский". Столяр отвечает: "швейцарские слишком ровно снимают, менеджеру не нравится". На том и разошлись.
guest 27.04.2010 14:26 # 0
Согласен. Школотовский PHP нужно в помойку, но замены нет. :(
xXx_totalwar 28.04.2010 12:56 # 0
вот фреймворки навскидку:
happstack (haskell)
erlang-web (разумеется erlang)
Seaside (smalltalk)
guest 28.04.2010 16:59 # 0
xXx_totalwar 28.04.2010 17:10 # 0
Но даже на пхп есть приличные фреймворки, например kohana3 (изначально была форком CodeIgniter) http://kohanaframework.org/
Использует полезный паттерн - иерархический MVC (HMVC)