Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Продумать взаимодействие с host-стороной #3

Closed
impworks opened this issue Sep 18, 2012 · 8 comments
Closed
Assignees
Labels
Milestone

Comments

@impworks
Copy link
Owner

Скрипт должен иметь возможность взаимодействовать с вызывающей его стороной. Для этого интерпретатору перед исполнением должны скармливаться типы и методы, которыми скрипт сможет манипулировать.

Необходимо продумать то, как сгенерированная с помощью Reflection.Emit сборка сможет получать к ним доступ.

Хотелось бы, например, сделать вот так:

script.AddType(typeof(System.Math));
script.AddMethod("log", (string s) => Console.WriteLine(s));
@ghost ghost assigned ForNeVeR Sep 18, 2012
@ForNeVeR
Copy link
Collaborator

Поскольку мы так или иначе будем хранить внутри интерпретатора список импортированных типов, нет проблемы добавить туда ещё один объект. С лямбдами будет чуть интереснее - поскольку конвенция вызова функций lens и внешних объектов может отличаться, то, возможно, нам придётся эмитить или генерировать специальные врапперы над внешними функциями, переданными нам в рантайме.

@impworks
Copy link
Owner Author

Типы - окей. Будем хранить Dictionary<string, Type>. А вот насчет функций хотелось бы какой-то универсальный способ, чтобы не писать по переопределенной версии AddMethod на все возможные Func<...> и Action<...> - чтобы количество и тип параметров определялись сами.

@ForNeVeR
Copy link
Collaborator

Для AddMethod вполне можно написать обобщённый вариант, который принимает делегат, а дальше парсит рефлекшеном его параметры. А вот для lens придётся эмитить конкретные строго типизированные врапперы.

Жаль, что в дотнете нельзя иметь список типов-параметров, как в C++ в конструкции template<class T... args>.

@impworks
Copy link
Owner Author

Реквестирую utility-функцию (набор функций), переводящий Func<...>, Action<...> или указатель на метод в нечто вроде:

class MethodInfo
{
    public List<Type> ParameterTypes;
    public Type ReturnType;
}

@ForNeVeR
Copy link
Collaborator

Вообще-то это всё уже сделано до нас и называется [Delegate.Method : MethodInfo](http://msdn.microsoft.com/en-us/library/system.delegate.method(v=vs.100\).aspx).

Там есть всё необходимое: GetParameters, ReturnType и даже Name.

Мне не кажется, что вообще есть необходимость перегонять эти данные в некую нашу структуру.

От пользователя требуется только преобразовать его лямбду к делегату, если у него именно лямбда. То есть всякие Action<T> и Func<T> мы поддерживаем автоматически.

@impworks
Copy link
Owner Author

Окей, хорошо, так даже лучше.

@ghost ghost assigned impworks Mar 16, 2013
@impworks
Copy link
Owner Author

Начал запиливать потихоньку в ветке master.

@impworks
Copy link
Owner Author

Типы, методы, свойства импортируются. Можно закрывать.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants