Имя: Пароль:
1C
1С v8
v8: Когда в 1с появятся замыкания?
0 ERWINS
 
08.05.14
15:42
1. Не нужно 67% (10)
2. В 9.0 33% (5)
3. В 8.3.6 0% (0)
Всего мнений: 15

В место такого кода

&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
    ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьОтвет", ЭтотОбъект);
    ПоказатьВопрос(ОписаниеОповещения, "Завершить работу системы?",РежимДиалогаВопрос.ДаНет, 60);
    Отказ = Истина;
    
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьОтвет(РезультатВопроса, ДополнительныеПараметры) Экспорт
    
    Если РезультатВопроса <> КодВозвратаДиалога.Нет Тогда
        ЗавершитьРаботуСистемы(Ложь);
        Закрыть();
    КонецЕсли;
    

КонецПроцедуры


Писать более простой

&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
    ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьОтвет", ЭтотОбъект);
    ПоказатьВопрос((РезультатВопроса, ДополнительныеПараметры) => (Если РезультатВопроса <> КодВозвратаДиалога.Нет Тогда
        ЗавершитьРаботуСистемы(Ложь);
        Закрыть();
    КонецЕсли;) , "Завершить работу системы?",РежимДиалогаВопрос.ДаНет, 60);
    Отказ = Истина;
    
КонецПроцедуры
1 ДенисЧ
 
08.05.14
15:45
Тупые 1сники ещё УФ-то не освоили, а ты им функциональщину предлагаешь...
Людей пожалей...
2 ERWINS
 
08.05.14
15:47
(1) функиональщину я не предлагаю.
Просто если ввели оповещения, то желательно для них ввести короткую запись.
3 Господин ПЖ
 
08.05.14
15:49
(0) мне лично ни то ни другое не нравится

первое - костыли
второе - читать не привычно
4 Rovan
 
гуру
08.05.14
15:55
(0) ээээ... а функция Вопрос()  ?
5 ДенисЧ
 
08.05.14
15:55
(2) Замыкания - это самая настоящая функциональщина.
6 mehfk
 
08.05.14
15:57
7 ERWINS
 
08.05.14
15:58
(5) а 1с это обычные формы.

Я не предлагаю вводить функциональные типы и т д
просто синтаксис похожий на функциональный
8 ДенисЧ
 
08.05.14
15:59
(7) Ты предложил анонимные функции
9 ERWINS
 
08.05.14
16:02
(8) да
10 vde69
 
модератор
08.05.14
16:05
(5)+1 да это типичная функциональщина...

(0)
во первых функциональщина куда более трудно читабельная
во вторых ты не сможешь повторно использовать "обработатьОтвет"
в третих учитывая новые тенденции по борьбе с модальными окнами процедура должна всегда отрабатывать до конца, без остановки на интерактивные действия (хотя лично я в новой стратегии пока весьма мало вижу плюсов)
11 ERWINS
 
08.05.14
16:10
(10)
1. более просто читаема, тут вопрос вкуса. Создавать ссылки на функции и т д я не предлагаю
2. вариант применять, только когда функция встречается 1 раз. в среде предусмотреть как перевод в аноннимную функцию, так и обратно
3. она так и будет обрабатывать без остановки, функциональность кода не изменилась.
12 vde69
 
модератор
08.05.14
16:13
(11) поставь точку остановки отладчика в анонимную функцию
13 PR
 
08.05.14
16:14
(0) Какое-то кривое и непонятное предложение. Что оно дает?
14 ERWINS
 
08.05.14
16:16
(12) в чем разница в постановке точки останова на обычную функцию?
15 ERWINS
 
08.05.14
16:16
(13) упрощение кода
16 Rebelx
 
08.05.14
16:22
Ну кабы вроде как то же самое можно обработкой выбора реализовать

Не нужно
17 jsmith82
 
08.05.14
16:22
опять ться?
18 vde69
 
модератор
08.05.14
16:23
(12) в том, что для меня логично когда точка входа в процедуру легко определима....

(15) ты хочешь как на лиспе? я писал для автокада, уверяю что это ад кромешный.

Если 1с введет такое - я буду просить 500тр в неделю, по тому как 80% 1с ников свалят из профессии
19 jsmith82
 
08.05.14
16:25
это как в си шарп шоле
20 jsmith82
 
08.05.14
16:25
прежде ООП появится
21 wade25
 
08.05.14
16:27
Полагаю есть причины не делать функцию доступной. Т.е. 1с становится кроссплатформенным приложением и на разных платформах пауза по разному воспринимается, много косяков всплывет.
Ну и ожидания для отладки не оч хороший инструмент. В других языках по моему можно многопоточность использовать, пока пауза выполнять какие то другие процессы.

Не нужно
22 iamnub
 
08.05.14
16:40
(0)
Пряма праблема #1 в нисчастнай 1С!
23 PR
 
08.05.14
16:44
(15) Где ж там упрощение-то? Читабельность отвратительная.
24 iamnub
 
08.05.14
16:51
(23)
Ты просто не врубаешься.
То, что показал (0) в своем примере - оченно частный случай.

Замыкания позволяют обратиться из анонимной функции к внешнему контексту (по отношению к самой функции).

Иногда это просто очень пользительно.
25 PR
 
08.05.14
16:52
(24) Нихрена не понял.
Почему бы просто не сделать вызов функции?
26 iamnub
 
08.05.14
16:54
(25)
В 1С нет делегатов - вот ты нихрена и не понял.
27 Serginio1
 
08.05.14
16:55
(10) Видно ты не знаком с Ajax
28 mehfk
 
08.05.14
16:55
(24) Callback
29 mehfk
 
08.05.14
16:56
(28)+ это был вопрос.
30 iamnub
 
08.05.14
16:56
(28)
Что callback?
31 PR
 
08.05.14
16:57
(26) Что это?
32 iamnub
 
08.05.14
16:57
(31)
"Функциональщина"
33 Serginio1
 
08.05.14
16:57
(18) Ну народ пищет на JS и нормально.
Linq в том C# уже повсеместно нормальное явление
34 mehfk
 
08.05.14
16:58
(30) Тебе в 1С их не хватает ?
35 PR
 
08.05.14
16:58
(32) Если речь про wiki:Делегат_(программирование), то повторяю вопрос, нахрена?
36 batmansoft
 
08.05.14
16:59
(0) Это разве замыкания? По моему, это называется делегаты, как в C#...

В 9.0
37 iamnub
 
08.05.14
17:02
(35)
Да ХЗ - что нахрена? Нахрена событийная модель?

В контексте 1С - видимо не нахрена.

Когда я говорил "очень пользительно" - я не 1С конечно же имел ввиду, а "замыкания" как понятие.
38 vermouth
 
08.05.14
17:03
блин, хорошо Вам  - умным!!!
я б ответил: "до версии 15.1 даже не думайте"
39 PR
 
08.05.14
17:04
(37) А, понятно. Я просто непонятно почему сразу про 1С подумал :))
40 iamnub
 
08.05.14
17:07
(39)
Странно. o_O
41 quest
 
08.05.14
17:10
а к замыканиям еще сразу repl обеспечить и расширение для slime. Ну и макросы нормальные конечно же. Прикольно ведь было бы  :)
42 Serginio1
 
08.05.14
17:45
(10) Вообще если 1С взяла курс на ВЭБ то им нужно подтягивать язык к JS, так они все равно транслируют код клиента в JS

<!--[if IE]>
    <script type="text/vbscript" language="vbscript">
        Sub ShowFocusMessage(win)
            win.setTimeout "MsgBox ""Нажмите OK для перехода к окну"",vbSystemModal,""1С:Предприятие""",0,"vbscript"
        End Sub
    </script>
<![endif]-->
43 iamnub
 
08.05.14
17:48
(42)
--то им нужно подтягивать язык к JS

И это будет конец
44 su_mai
 
08.05.14
18:03
(0) Дочитай "bullschildt" до конца и забудь :)
45 Serginio1
 
08.05.14
18:04
(43) Почему?
46 su_mai
 
08.05.14
18:09
+(44) И самое интересное, когда 1С реализует новый синтаксис, то на Мисте опять будут появляться сообщения типа: "Опять только фантики-бантики делают, а о производительность никто не повышает"...
47 ERWINS
 
08.05.14
21:49
(46) всегда есть недовольные
48 Web00001
 
09.05.14
04:54
Ты как бы это, перепутал мисту, с хотлайном. Миста не ведет же разработку 1С.
49 Fragster
 
гуру
09.05.14
10:54
вообще как только обработку ожидания придумали - надо было сразу и делать. Хотя бы не замыкания, а присвоение функций переменным и использование имен функций без скобок как переменных.

В 9.0
50 Fragster
 
гуру
09.05.14
10:58
(49)+ служебный массив с параметрами функции для использования внутри функции
51 Serginio1
 
09.05.14
14:28
(49) Да и использование лямбд и делегатов для универсальных функций. Например сравнения
v8: Отбор с условием
52 Serginio1
 
09.05.14
14:29
51 и вместо лямбд и делегатов приходится присобачивать Вычислить
53 Эмбеддер
 
09.05.14
15:28
(0) по-моему наоборот хуже читается. особенно плохо это будет выглядеть при объединении конфигураций

Не нужно
54 Karavanych
 
09.05.14
15:41
Кстати... тут я вижу в теме набрались специалисты ООП.
Я вот 10 лет программировал в 1С, там вроде конфа есть, все более менее структурировано до тебя. Есть методология вроде как надо и где писать чтоб было красиво.Ну писал и писал, нормально было.
Щас пишу на java - че-то у меня ппц адский ад получается в проекте... одно туда, другое сюда, то от того наследуюется, тут реализуем интерфейс... там модулей 10 штук я ниче не понимаю уже как это все между собой работает.
Кто может меня натолкнуть на мысль вообще как это все исправить и навести хоть какой-то порядок... может мне че-нить почитать по этому поводу ?
55 Alex S D
 
09.05.14
15:45
(54) ага, на пенсию тебе пора)
56 Karavanych
 
09.05.14
15:50
(55) Какая пенсия... мне только 30 :)
57 program1Cer
 
09.05.14
16:39
(54) Гарди Буч ООП, Макконелл Совершенный код. Банда 4х Про паттерны.
58 EugeniaK
 
09.05.14
17:18
Нечитабельно.
Типовой вариант лучше.

Не нужно
59 Serginio1
 
09.05.14
17:58
(53) Ты не пробовал работать с Linq to DB тогда бы понял их премущество над текстовыми запросами. Ленивые вычисления рулят особенно когда тебе нужно 10 этажный запрос наворотить.
А вообще насчет сложности и читаемости когда лямды и Linq появились все  тоже говорили о том что нечитабельно итд. Сейчас все прекрасно используют и не жалуются на читабельность.

В 9.0
60 Karavanych
 
09.05.14
20:33
(57) спс.
Я кстати банду четырех пытался читать, год назад...че-то не пошло. Пока попробую Буч и Макконела почитать, потом еще раз попробую паттерны проектирования осилить.
61 iamnub
 
10.05.14
00:19
(59)
--Ты не пробовал работать с Linq to DB

Хм, я тоже. o_O
62 Torquader
 
10.05.14
00:28
Чем больше возможностей в языке - тем более суровый г?внокод получается у программистов.
63 quest
 
10.05.14
00:31
(54) юзай  clojure. А про все эти паттерны, методики и прочую х*ню забудь.... И сделай свои.
64 kokamoonga
 
10.05.14
05:53
(0) и где в приведенном примере замыкание?
65 Serginio1
 
10.05.14
08:23
(64) Закрыть(); неявно передан this (ЭтотОбъект)
66 Asmody
 
10.05.14
09:25
(0) еще один товарищ, воодушевленный скалой :)
Замыкания сложны в реализации на уровне транслятора. Т.е., у тебя появляется не просто объект с неопределенным временем жизни, а целый контекст объектов. Следить за ними — большая головная боль. Не даром в jvm хороший кусок занимает сборщик мусора.
67 Gepard
 
10.05.14
09:58
(0) сначала пусть глюки все уберут, а потом уже можно делать такие плюшки (особо не нужные)
68 Gepard
 
10.05.14
09:58
(67) + имхо, даже вредные для 1С
69 Serginio1
 
10.05.14
10:25
(66) Скорее JS учитывая Вэб клиента. Ну в JS это все реализовано и прекрасно работает
70 quest
 
10.05.14
11:10
(0) может ты и прав конечно, но большой проблемы на С это представляет - посмотри на clisp, sbcl или любую другую реализацию лиспа
71 quest
 
10.05.14
11:10
(70) к (66) было
72 kokamoonga
 
10.05.14
16:13
(65) У замыкания есть довольно четкое определение. Причем здесь неявная передача чего бы то ни было?
73 Serginio1
 
10.05.14
20:47
(72) wiki:%C7%E0%EC%FB%EA%E0%ED%E8%E5_(%EF%F0%EE%E3%F0%E0%EC%EC%E8%F0%EE%E2%E0%ED%E8%E5)

Замыкание (англ. closure) в программировании — функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде). Говоря другим языком, замыкание — функция, которая ссылается на свободные переменные в своём контексте.
74 kokamoonga
 
10.05.14
22:15
(73) дальше прочитать не хватило сил?

"Замыкание — это особый вид функции. Она определена в теле другой функции и создаётся каждый раз во время её выполнения. В записи это выглядит как функция, находящаяся целиком в теле другой функции. При этом вложенная внутренняя функция содержит ссылки на локальные переменные внешней функции. Каждый раз при выполнении внешней функции происходит создание нового экземпляра внутренней функции, с новыми ссылками на переменные внешней функции."
75 Serginio1
 
11.05.14
00:15
(74) Ну и что же не соответсвует в 0.
Есть функция в теле другой функции которая использует ЭтаФорма
Закрыть(); закрыть к чему будет применяться?
Реально в .Net создается экземпляр класса в котором есть ссылка на ЭтаФорма.
76 kokamoonga
 
11.05.14
02:18
(75) "Она определена в теле другой функции..."

Особо обращаю внимание на слово "определена".

Если следовать твоей логике, то любая функция, которая вызывается в теле другой функции и содержит, например, ссылки на глобальные переменные, является замыканием. Но это не так.

Причем здесь .Net, причем здесь экземпляр какого-то класса? Речь в (0) идет о встроенном языке 1С.
77 Serginio1
 
11.05.14
10:30
(76) Вообщето есть статические и экземплярные функции.
Для экземплярных функций this передается скрыто ввиде параметра. В питоне например он передается явно.
Так что этаФорма определена в теле функции.
78 kokamoonga
 
11.05.14
16:21
(77) У тебя дикая каша в голове.


Еще раз для альтернативно одаренных с капсом в нужных местах:

"ЗАМЫКАНИЕ — это особый вид ФУНКЦИИ. ОНА [ФУНКЦИЯ, КОТОРАЯ ЗАМЫКАНИЕ] определена в теле другой функции и создаётся каждый раз во время её выполнения. В ЗАПИСИ ЭТО ВЫГЛЯДИТ КАК ФУНКЦИЯ, НАХОДЯЩАЯСЯ ЦЕЛИКОМ В ТЕЛЕ ДРУГОЙ ФУНКЦИИ. При этом вложенная внутренняя функция содержит ссылки на локальные переменные внешней функции. Каждый раз при выполнении внешней функции происходит создание нового экземпляра внутренней функции, с новыми ссылками на переменные внешней функции."


И еще одна цитата (wiki:%D4%F3%ED%EA%F6%E8%FF_(%EF%F0%EE%E3%F0%E0%EC%EC%E8%F0%EE%E2%E0%ED%E8%E5)):

"Функция должна быть соответствующим образом объявлена и определена. Объявление функции, кроме имени, содержит список имён и типов передаваемых параметров (или: аргументов), а также, тип возвращаемого функцией значения. ОПРЕДЕЛЕНИЕ ФУНКЦИИ СОДЕРЖИТ ИСПОЛНЯЕМЫЙ КОД ФУНКЦИИ. В одних языках программирования объявление функции непосредственно предваряет определение функции, в то время как в ряде других языков необходимо сначала объявить функцию, а уже потом привести её определение."


Внимание вопрос, где определена функция Закрыть() ?
79 quest
 
11.05.14
16:27
(defparameter Закрывашка (lambda (чего-там-позакрывать доппараметры) (закрыть чеготампозакрывать доппараметры))

(defun юзалка (форма)
  (apply закрывашка форма nil))

хотя через defgeneric было бы проще :)

Не нужно
80 Serginio1
 
11.05.14
16:44
(78) Ты мне так и не ответил к чему относится Закрыть()?
При этом ЭтаФорма не передается в параметрах функции и не является глобальной переменной.

Ответь для себя чем отличается модуль объекта от модуля менеджера. Чем является для вызывающей функции ЭтаФорма.
Что такое контекст http://habrahabr.ru/post/149516/

А потом уже решай у кого каша в голове.
81 quest
 
11.05.14
16:58
Вот жеж... еще ничего никуда не добавили, а уже не могут нормально говорить - в (0) кривой код, 10 постов выяснение у кого что в голове... представляю что будет если добавят (как обычно по одноэсовски - придумают свою реализацию лямбды и обзовут односамбда) это в платформу. на мисту вообще можно будет не заходить - птушники задолбают... своим особым прочтением
82 kokamoonga
 
11.05.14
16:59
(80) Ок, давай предположим, что я не умею читать, связно логически мыслить и у меня реально каша в голове. А ты все это умеешь и у тебя есть стройное логическое объяснение почему вдруг функция ( а на самом деле метод ЭтаФорма.Закрыть() ) вдруг превратилась в замыкание.

Сделай это пожалуйста в терминологии 1С и в соответствии с определением замыкания. Сравнения с другими языками абсолютно неуместны. Я пишу и на js и  на python, которые ты тут приводил в пример, и не вижу параллелей с 1С, кроме самых общих.
83 Serginio1
 
11.05.14
17:01
Откуда в функции взялась ЭтаФорма?
84 kokamoonga
 
11.05.14
17:06
(83) Закрыть() это метод объекта Форма. ЭтаФорма для метода Закрыть() является аналогом this или self  в других языках.

Закрыть() это сокращенная форма записи ЭтаФорма.Закрыть(). То есть обращение к методу объекта. Странно было бы если в методе объекта не была доступна ссылка на сам объект.
85 kokamoonga
 
11.05.14
17:09
(81) Так я изначально про кривой код и спросил. А теперь вот пытаюсь понять каким чудом может метод объекта превратиться в замыкание.
86 Serginio1
 
11.05.14
17:19
То есть ЭтаФорма является переменной вызывающей функции?
87 ERWINS
 
11.05.14
17:38
(85)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    class test
    {
        delegate int Act(int i);
        void info(int i)
        {
            Console.WriteLine(i);
        }
        public void cas(int per)
        {

            Act t = (i) => { info(i); return i + per; };
            t(per);
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            var t=new test();
            t.cas(1);
            Console.ReadKey();
        }
    }
}
88 kokamoonga
 
11.05.14
17:51
(86) Я не готов спорить на тему как именно попадает ЭтаФорма в функции и процедуры модуля — неявно как локальная переменная (очень сомневаюсь) или как глобальная переменная контекста. Я недостаточно хорошо знаю как работает 1С внутри.

В данном случае это абсолютно неважно, потому что вызов Закрыть() это вызов метода переменной ЭтаФорма как бы она ни была определена.

Если принять твою точку зрения, то условно это можно записать так:

Процедура Тест ()

    НеявнаяПеременная = ЭтаФорма;
    
    НеявнаяПеременная.Закрыть(); //никакой передачи тут нет, это вызов метода объекта Форма, который находится в неявной переменной по твоему мнению

КонецПроцедуры
89 kokamoonga
 
11.05.14
17:52
(87) Ты не видишь разницы между тем что написано в (0) и в (87) ?
90 quest
 
11.05.14
17:55
с замыканием более верный пример


(defparameter y 10)
(setq f (function (lambda (x) (+ x y))))
(apply f 1) вернет 11
затем меняем внешнюю по отношению к f пременную
(setq у 7)
и (apply f 1) вернет 8

в твоем случае ты определил функтор который можешь юзать как хочешь, он от внешней переменной не зависит (per аргумент, не переменная в данном контексте)
91 ERWINS
 
11.05.14
18:01
(90) тут замыкание по ссылке или по значению?

в разных языках это по разному.
92 quest
 
11.05.14
18:04
в данном случае по ссылке. но можно и по значению сделать.
93 quest
 
11.05.14
18:06
наверное в этом прелесть лиспа - как хочешь так и делай, в отличии от других языков
94 ERWINS
 
11.05.14
18:07
соответственно и ответ будет разный

Например в for и foreach С# в одном случае по ссылке, а в другом по значению.
95 ERWINS
 
11.05.14
18:11
(93) 1с на лиспе....

"и по молясь Лиспу великому с ужасом не приходящим стал он писать проведение документа прихода от поставщика и за разъяснениями и взмолился он к мисте и послала его миста по дальше вместе с...."
96 quest
 
11.05.14
18:32
забыл дописать "... ибо не написать на лиспе проведение прихода - это высшая степень кретинизма " :)
97 Serginio1
 
11.05.14
18:40
(88) Нет лямбда это статическая функция которая ничего не знает о ЭтаФорма. Но как только ты вызываешь в лямбле метод ЭтоФорма она сразу превращается в замыкание, так как в неё передается ссылка на ЭтаФорма.
(89) Там как раз есть вызов метода объекта  info(int i)
то есть неявное замыкание на this
98 ERWINS
 
11.05.14
18:48
(97) в каком языке?
в C# она знает контекст
99 ERWINS
 
11.05.14
18:51
(96) если ты лисп знаешь.....
а куча скобок пугает пока не понимаешь какие это дает преимущества.
например отсутствие проблем с обновлениями.(в первом приближении)
100 ERWINS
 
11.05.14
18:53
100
101 Serginio1
 
11.05.14
18:59
(98) Я знаю. Здесь идет спор о том что в приведенном тобой примере является замыканием. Если лямда не использует тссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде).
this и ЭтаФорма являются переменными объявленные вне тела лямбды а значит явяется замыканием.

this и ЭтаФорма на самом деле являются переменными вызывающей функции
102 ERWINS
 
11.05.14
19:07
(101) замыкание это захват контекста.
оно даже не обязательно связано должно быть с функцией, тем более анонимной.
103 Serginio1
 
11.05.14
19:46
(102) Согласен
wiki:Замыкание_(программирование)

Замыкание (англ. closure) в программировании — функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде). Говоря другим языком, замыкание — функция, которая ссылается на свободные переменные в своём контексте.
Замыкание, так же как и экземпляр объекта, есть способ представления функциональности и данных, связанных и упакованных вместе.
Замыкание — это особый вид функции. Она определена в теле другой функции и создаётся каждый раз во время её выполнения. В записи это выглядит как функция, находящаяся целиком в теле другой функции. При этом вложенная внутренняя функция содержит ссылки на локальные переменные внешней функции. Каждый раз при выполнении внешней функции происходит создание нового экземпляра внутренней функции, с новыми ссылками на переменные внешней функции.
В случае замыкания ссылки на переменные внешней функции действительны внутри вложенной функции до тех пор, пока работает вложенная функция, даже если внешняя функция закончила работу, и переменные вышли из области видимости.[1]
Замыкание связывает код функции с её лексическим окружением (местом, в котором она определена в коде). Лексические переменные замыкания отличаются от глобальных переменных тем, что они не занимают глобальное пространство имён. От переменных в объектах они отличаются тем, что привязаны к функциям, а не объектам.
104 Serginio1
 
11.05.14
21:59
(81) Вообще замыкания в контексте 1С интересны для серверного вызова в теле клиента. Тогда весь код будет компактен и выполнен в одной процедуре, нежели раскидан по нескольким процедурам.
105 Torquader
 
11.05.14
22:07
На самом деле, полезнее были бы не сами замыкания (так как при их кривой реализации будут только утечки памяти, что для круглосуточно работающей программы может оказаться смертельно), а возможность создания контекста исполнения независимо и сохранения в нём серверных параметров без необходимости их передачи на клиента и обратно.
Также будет очень полезной возможность создания таких контекстов для выполнения отдельных процессов.
106 Лефмихалыч
 
11.05.14
22:16
(0) сомневаюсь, что скоро. Все работает и без этого и смысла вкладываться в усложнение кода пока не видно.

ЗЫ В день, когда я увижу код с замыканиями в каком-нибудь отраслевом, у меня лопнут или мне придется их себе выколоть, чтобы гарантировать, что я больше ни чего подобного не увижу. Это будет ужасно, я думаю
107 Лефмихалыч
 
11.05.14
22:21
имею мнение, что того, кто решил всунуть lambda expressions в java, в аду черти ждут с нетерпением. Потому что они може код и сокращают, но делают его нечитабельным в хлам.
В 1С будет все еще хуже, потому, как порог вхождения "специалистов" ниже, ибо практика показывает, что для того, чтобы быть программистом 1С, в большинстве случаев нужно всего лишь уметь поддерживать температуру тела в районе 37 градусов
108 quest
 
11.05.14
22:27
(107) +100500
109 viraboy
 
11.05.14
22:31
(107) Не согласен. Видел УТ 11 допиленную, там из БСП франкенштейна сделали, хотя там все уже было. Вот и здесь, как  говорится можно и ... сломать. Плотно работал с лямбда в шарпе - очень хороший механизм, только 1С до шарпа как до китая.
110 viraboy
 
11.05.14
22:32
+ (109) Хотя объектный язык запросов 1С можно рассматривать как аналог
111 Serginio1
 
11.05.14
22:36
(107) А то, что сейчас гвнокод именно из-за того что язык ограничен.
А на шарпе народ радуется Linq и во всю использует замыкания.
А раньше так же кричали, так как на шарпе пишут куча не сеньоров, а джуниоров
112 quest
 
11.05.14
23:08
(111) Копрокод он же не из-за возможностей языка, а из-за отсутствия мозга. А выразительные возможности языка и уровень разработчика  - ну никак не связаны.
Можно  на басике написать красиво, можно на С# наговнять.

Коли так не в моготу без замыканий/каринга/лямбд/протоколов/(тут можно подставить без чего еще нельзя жить) - напиши свой интерпретатор с любимого языка на 1С - и пользуйся
Вот только сердце-вещун говорит что будешь ты единственным кто его будет пользовать.
113 kokamoonga
 
11.05.14
23:37
(101) Что ты, никакого спора. Я прозрел.

Теперь я знаю, что Закрыть() при определенных условиях становится замыканием, что ЭтаФорма и ЭтотОбъект передаются в функции модуля в виде неявной локальной переменной и что ЭтаФорма по совместительству еще и метод. Мир никогда не будет прежним.

(112) map/reduce забыл и итераторы:)
114 Лефмихалыч
 
11.05.14
23:54
(109) (112) ну... это, как с матом - умеючи можно добавить овер 9000 выразительности, а не умеючи... ну вы поняли
115 Валентин
 
12.05.14
00:24
116 iamnub
 
12.05.14
01:55
(112)
--Коли так не в моготу без замыканий/каринга/лямбд/протоколов/

Увы, ничего этого в 1С не нужно. Потому что сама 1С - это "пришлепка" к БД, причем пришлепка, которая пытается усидеть на двух стульях. Итог закономерен.

Ну, а если 1С решит вывести свой продукт в другую парадигму, то зачем изобретать свою экосистему? Со своим языком (я про "настоящий"), IDE и прочими? Всё это давно уже есть.
117 vde69
 
модератор
12.05.14
07:58
столько нафлудили, но НИКТО не сказал ЗАЧЕМ это нужно???

есть мнение СПОРНОЕ что это более читабельно, других доводов НЕТ!

еще раз зачем вносить довольно сомнительное новшество которое повысит порог вхождения в профессию при явном дифеците специалистов.
118 Поpyчик-4
 
12.05.14
08:24
(3) А мне второе больше нравится, так как в духе привычного JavaScript
119 Asmody
 
12.05.14
08:31
(117) ну, хотя бы для того, чтобы избавиться от совершенно уродских конструкций типа "ПодключитьОбработчикОжидания", "ОписаниеОповещения" и т.п.
120 vde69
 
модератор
12.05.14
08:44
(119)
я не вижу чем они уродские кроме как текстовое указание имени функции, поменять это можно если ввести новый тип "функция/процедура".

Наоборот, учитиывая клиент/серверное выполнение кода - выделение кода обработчика в отдельный модуль кажется весьма логичным.

А вот представь свое замыкание в клиент серверном варианте, верхняя процедура на клиенте, а безымянка на сервере :) и понеслось.... передаяа контекста вызова (всех описаных переменных, в том числе и не нужных...)

ИХМО для клиент сервера нужно ужесточения той свободы которая есть сейчас. Нужна явная типизация параметров функций и прочего контекста передаваемого с клиента на сервер и обратно...
121 dmpl
 
12.05.14
08:45
Обычные формы уже это реализуют.

Не нужно
122 ERWINS
 
12.05.14
09:19
...
123 ERWINS
 
12.05.14
09:20
(120) и на сколько это повысит порог вхождения?
124 dmpl
 
12.05.14
09:44
(123) Да не важно насколько, главное зачем? И, еще главнее - зачем во втором варианте строчка


ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьОтвет", ЭтотОбъект);


Она ведь нигде не используется.
125 Serginio1
 
12.05.14
10:19
(112) Не скажи когда появился Linq сразу начали писать по другому в том числе используя замыкания. А вот Linq2DB кардинально меняет подход

(120) Замыкания интересны прежде всего в контексте серверных вызовов. Не надо создавать отдельно метод с параметрами. Не надо помечать с контекстом без контекста. Компилятор должен сам решить какие данные передавать на сервер и какие возвращать. Я уже не говорю про ассинхронность
126 ERWINS
 
12.05.14
15:08
в С++ 2003 не добавили замыкания просто по той причине, что практически никто не мог понять необходимость данной фичи. Единственное место, где она считалась, хоть как то полезной - sort в качестве функции сравнения.
127 iamnub
 
12.05.14
15:20
(126)
--  что практически никто не мог понять необходимость данной фичи.

Судя по всему - изменилось немного.
128 Леша1с
 
12.05.14
15:29
(0) у 1С постоянно, с каждым релизом, одни замыкания.
Разве нет?
129 ERWINS
 
12.05.14
15:35
(127) посмотри на новые библиотеки.... там все на замыканиях.
130 dmpl
 
13.05.14
08:10
(129) Может просто inline?
131 ERWINS
 
13.05.14
08:32
(130) инлайн сейчас практически не применяют в синтаксической форме, так как компиляторы для этого достаточно умны.
132 dmpl
 
13.05.14
08:35
(131) Вот именно. У тебя же нет исходников 1С, с чего ты взял, что это не компилятор inline автоматически сделал?
133 ERWINS
 
13.05.14
08:36
(132) стоять... что ты имеешь ввиду под инлайном
134 andreymongol82
 
13.05.14
08:39
(0) Блин, тут иногда возникают сра..., простите прения по поводу нужен ли ООП в 1С, а предлагается еще добавить прения функциональщина против объективщина?
135 dmpl
 
13.05.14
08:42
(133) То же что и все - физическое размещение кода inline функции в теле вызывающей ее функции и без создания для нее собственного контекста.
136 Kyon8
 
13.05.14
08:56
А когда в 1С вообще происходило какое-то развитие встроенного языка? Я не про добавление предопределенных классов.

В 9.0
137 Ненавижу 1С
 
гуру
13.05.14
09:01
Даешь embedded язык запросов!
138 ERWINS
 
13.05.14
09:03
(135) 1с это транслятор или интерпритатор, но ни как не компилятор
139 ERWINS
 
13.05.14
09:04
(137) это что?
140 Ненавижу 1С
 
гуру
13.05.14
09:05
(139) это когда текст запроса не передается как строковый параметр, а непосредственно в коде имеет место быть

плюс такого подхода: проверка корректности на стадии компиляции, возможность предварительной оптимизации
141 ERWINS
 
13.05.14
09:15
(140) linq?
142 Ненавижу 1С
 
гуру
13.05.14
09:16
(141) LINQ это только одна из реализаций, причем местами неудачная
143 dmpl
 
13.05.14
09:21
(138) Тогда к чему (129)? Кстати, для критических задач все эти новомодные штучки очень не любят использовать. В бой идет олдскульный код.
144 mikecool
 
13.05.14
09:29
для начала научились бы полностью использовать то, что уже есть в языке...
145 quest
 
13.05.14
09:48
(140) - обоснуй. какой от этого выигрыш? лучше чем сервер интерпретатор 1С вряд ли оптимизирует план запроса.
146 quest
 
13.05.14
09:49
(143) потому что он - предсказуем и для него легко найти разработчиков
147 quest
 
13.05.14
09:50
(144) Когда нибудь и научаться. Это для java/C#/visual basic есть best practics. Для 1С пока нет, не доросли еще
148 Ненавижу 1С
 
гуру
13.05.14
09:59
(145) ну может с оптимизацией и нет, хотя может повыкидывать избыточные части типа "ГДЕ ИСТИНА"
но синтакс-проверка на уровне компиляции точно помогла бы
149 quest
 
13.05.14
10:09
(148) да ничем бы она не помогла. это раз. и два - тект запроса не обязательно к этой базе относиться. три - думать надо прежде чем писать.
150 Ненавижу 1С
 
гуру
13.05.14
10:16
(149) ну тебе не помогла бы, а кому то и помогла, я же не говорю, что динамические запросы надо убрать
151 Serginio1
 
13.05.14
10:33
(140) Народ на C# с огромным удовольствием использует LINQ to Entities и не можер нарадоваться. Так где не хватает производительности используют запросы с выводом типа.

http://msdn.microsoft.com/ru-ru/magazine/hh781018.aspx



string entitySQL = " SELECT p, p.Filling " +
"FROM PartyContext.Pinatas AS p "
"WHERE p.Filling.Description='Candy'";
var query=context.CreateQuery<DbDataRecord>(entitySQL);
query.MergeOption = System.Data.Objects.MergeOption.NoTracking;
var pinatasWithFilling=query.ToList();



http://msdn.microsoft.com/ru-ru/library/bb386964(v=vs.110).aspx
152 Леша1с
 
13.05.14
10:47
(151)>>Народ на C# с огромным удовольствием использует LINQ
потомуц что на безрыбье и рак - рыба.
На фоне остальной реализации работы с БД в С# - это глоток воздуха с помойки в душном подземелье.
153 Ненавижу 1С
 
гуру
13.05.14
10:58
(152) ты как гений - 1С это круто
154 Леша1с
 
13.05.14
11:04
(153) да нет возможно ))
А, впрочем, мы тут про С#.
155 rsv
 
13.05.14
11:16
(0) Что такое замыкания ?
156 х86
 
13.05.14
11:20
то что хочет ТС впринципе штука нужная, как уже отмечали, на JS (и не только) активно используемая
токма вопрос накой это вкрячивать в эску ???

Не нужно
157 Ненавижу 1С
 
гуру
13.05.14
11:21
158 Serginio1
 
13.05.14
11:40
(152) То есть 1С запросы это рыбное место c rhegysvb ktofvb, а LINQ to EF это малек шпроты?
(156) смотри 125
159 х86
 
13.05.14
11:45
(158)>>Не надо создавать отдельно метод с параметрами. Не надо помечать с контекстом без контекста. Компилятор должен сам решить какие данные передавать на сервер и какие возвращать. Я уже не говорю про ассинхронность

имхо мне кажется замыкания не панацея
160 Леша1с
 
13.05.14
11:45
(158) если уж интересно про запросы, то SQL-запросы - это рыбное место. При чем тут 1С, и каким боком - известно только вам, в силу сообщения ( 153) :))
161 gr0ck
 
13.05.14
11:54
А как же высказывание про то, что "одинэсники тупые и жадные"
Зачем усложнять язык? Для повышения жадности?)
162 Serginio1
 
13.05.14
12:12
(160) А Linq to EF это объектные запросы с выводом типа и ленивыми вычислениями из которых удобно создавать запросы которые в итоге транслируется в SQL запросы. Также EF поддерживает и объектные запросы (151)
163 Serginio1
 
13.05.14
12:14
(160) По твоей идеологии ассемблер это рыбное место, а C# это малек шпроты?
164 Serginio1
 
13.05.14
13:00
(159) Замыкания придуманы для удобства, что бы захватывать контекст и уменьшить лишние телодвижения для программиста перекладывая всю нагрузку на компилятор и удобства читаемости программы
165 quest
 
13.05.14
13:12
(153) вообще-то он прав. Посмотри как в других языках  сделаны макросы/замыкания (лисп, схема) и поймешь что в С# - очень жалкая поделка.
(161) 10% нахрен не нужен, 10% жить без него не могут, оставшимся 80 - пофиг.
(164) когда возникли замыкания - люди даже  в машинных кодах не писали. Ты бы хоть не по вики учил что такое замыкание, а нормальную доку почитал.


Вот для всех еще раз предложение - чем муссировать тему чего в 1С не хвататет - возьмите и напишите свой компилер с лиспа на 1С - а затем попробуйте окружаюших убедить его использовать
166 Serginio1
 
13.05.14
13:32
(165) Макросы это отдельная тема.
На лиспе и схеме программировать не приходилось, но того что есть в C# в большинстве случаев достаточно, ну если только Pattern matching добавить.

И добавить замыкание в 1С для серверных вызовов очень нужная вещь. А на лиспе пусть гики пишут
167 rsv
 
13.05.14
13:32
(157) Ок.
168 SUA
 
13.05.14
13:38
(125)это был толстый клиент
а вообще тема хорошая, тупо чтобы не писать портянку в 10+ передаваемых параметров (привет БСП присоединенные файлы) или хотя бы 1 раз определить что они могут быть контекстными

В 9.0
169 Леша1с
 
13.05.14
13:46
(163) ты запросы на ассемблере пишешь? уважаю
170 quest
 
13.05.14
13:51
(166) Тогда почему тебе не достаточно того что есть в 1С? Твой код станет лучше если добавить замыкания?
Если да - приведи пример. Желательно - убедительный, а не с косяками как в 0.

А отзывы других форумчан будут тебе в поддержку потом.
171 Serginio1
 
13.05.14
14:03
(169) Спасибо. Linq to EF это объектная надстройка над ДБ которая в итоге генерит SQL код к конкретной БД. При этом используются ленивые вычисления которые можно использовать для повторного использования сокращая код и улучшая читабельность. А то бывают такие потрянки SQL кода на десятки страниц где разобраться очень сложно в том числе и используя конструктор запроса.

(170) Чем тебе в 0 не нравится?Где там косяк. Там есть захват контекста.


&НаСервереБезКонтекста
Функция П2(парам1,парам2,парам3)
    возврат парам1+парам2+парам3
КонецПроцедуры


&НаКлиенте
Процедура Ткнуть(Команда)
Парам1=1;
парам2=2;


рез=П2(парам1,парам2,РевизитФрмы)
//используя замыкания
рез=СерверныйВызов(возврат парам1+парам2+РевизитФрмы)
КонецПроцедуры
172 quest
 
13.05.14
14:10
изучай http://docs.racket-lang.org/web-server/run.html (как самое близкое из предоженного тобой)

потом расскажи почему предложенный тобой код будет тормозить (хинт - присваивать могут не только  числа )
173 Serginio1
 
13.05.14
14:11
(171) Мало того если замыкание получилось большое его можно отфакорить в отдельную процедуру со всеми параметрами
174 Ненавижу 1С
 
гуру
13.05.14
14:12
(171) а где тут замыкание? я что-то не в гоняю
175 Serginio1
 
13.05.14
14:13
(172) Тормозить будет только компиляция в серверный код по сути должно получаться из
СерверныйВызов(возврат парам1+парам2+РевизитФрмы)

&НаСервереБезКонтекста
Функция П2(парам1,парам2,парам3)
    возврат парам1+парам2+парам3
КонецПроцедуры
176 quest
 
13.05.14
14:13
(173) замыкание это не заклинание! ну разбери ты любое замыкание в let-форму и увидишь что параметры передавать надо, а раз надо, то от необходимости сериализовать данные не избавиться. Ты прикольно взял 1 и 2 в части параметров. А если мне надо на сервер передать содержимое динамической таблицы?
177 quest
 
13.05.14
14:15
и втрое - замыкания сами могут быть параметром. и как тогда не запутаться бедному адынэснику?
178 Serginio1
 
13.05.14
14:16
(174) Замыкание это захват парам1 парам2 РевизитФрмы
Код то будет выполняться на сервере, что аналогично
&НаСервереБезКонтекста
Функция П2(парам1,парам2,парам3)

176 передавай что угодно смыл замыкания это уменьшить код
Для примера на C# http://www.rsdn.ru/article/csharp/Closure_in_Csharp.xml#EDG
создается отдельный класс
179 Serginio1
 
13.05.14
14:19
(177) Я не пойму в чем проблема то, что 1С ки тупые что ли?
Не вижу проблемы замыканий в качестве переменной. Наоборот вижу одни только плюсы. Проблема больше в реализации в 1С вот у кого проблема.
180 quest
 
13.05.14
14:40
Хендерсон "Функциональное программирование", читаешь, много думаешь и  потом (если будешь так уж уверен) пытаешься озвучить мысль что в 1С с этим проблемы не будет.
181 quest
 
13.05.14
14:40
и что 1С это так жизнено необходимо
182 Serginio1
 
13.05.14
14:57
(180) И как это в C# по проблем не видят?
Не путай чистую функциональщину с гибридными языками.
Хотя ограниченный патерн матчинг вещь нужная.
(181) Для серверных вызовов да. И это тебе подвердят многие когда на каждый чих нужно городить отдельный метод.
183 Леша1с
 
13.05.14
14:59
(179)>>Проблема больше в реализации в 1С вот у кого проблема.
есть такая проблема.
Поэтому никогда и не будет реализована в 1С.
184 Леша1с
 
13.05.14
15:01
(178)>>Код то будет выполняться на сервере
у 1С свое понимание, что исполнять на сервере, что - на клиенте.
В 1С все это будет глючить неимоверно, т.к. обработка таких сущностей вне компетенции разработчиков 1С.
Вспомнить хотя бы полуработающую Перейти...Метка (типа Goto...)
185 ДенисЧ
 
13.05.14
15:02
Вот блин... У Лёши даже перейти не работает...
186 Serginio1
 
13.05.14
15:02
(181) Или просто даже делегаты или лямбды v8: Отбор с условием

(183) Посмотрим. Что то ты совсем плохого мнения о разработчиках 1С. Там проблем больших то нет. Обычный рефакторинг
187 Ювелир
 
13.05.14
15:04
Чего-то не понял, или столько постов написано из-за размещения текста процедуры внутри вызывающей процедуры? Плюс - это использование общего контекста процедур ?
188 Serginio1
 
13.05.14
15:05
(184) Ты не поверишь я еще программировал на Бухгалтерии 6.0
7.0 и на моих глазах многое в 1С менялось. Так что посмотрим.
189 Serginio1
 
13.05.14
15:06
(187) Да. Люди не видят пользы, либо не считаю захват контекста замыканием.
190 quest
 
13.05.14
15:13
(185) ну да. не работает как минимум тут v8: Выполнить. Весь мозг поломал
(189) Открой глаза, в конце концов замыкания вполне можно реализовать через  напиши ВК.
191 Леша1с
 
13.05.14
15:13
(184)>>Там проблем больших то нет
ну да, нет, только неработающая платформа ))
А так остальное правится в конфигураторе.
192 quest
 
13.05.14
15:13
через  напиши ВК. = через ВК, напиши .
193 Леша1с
 
13.05.14
15:15
(187) ну было такое в 7.7. Раз говоришь, начинал с 6.0 - должен знать.
И где теперь этот контекст? в свете " я еще программировал на Бухгалтерии 6.0, 7.0 и на моих глазах многое в 1С менялось"
194 Леша1с
 
13.05.14
15:16
(193) к (189)
195 Леша1с
 
13.05.14
15:17
+ 193
ах, да, приобрел форму клиента УФ ))
196 Serginio1
 
13.05.14
15:18
(190) То есть тебе подход в 171 не нравится. Все оставить по старому через процедуры? При чем тут ВК.
(193) Ты не видишь разницу между Бухгалтерия 6.0 и Предприятие 8.3?
197 Serginio1
 
13.05.14
15:22
(190) Вот лямды и замыкания нужны, для того что бы к Выполнить по меньше обращаться. Для тебя Выполнить это нормально с которыми сам разобраться не можешь, а замыкания это зло.
198 Леша1с
 
13.05.14
15:28
(196) не вижу
как там не работали расчеты, так здесь - не работает сбор данных.
Какая разница, что не работает, если воз и ныне там.
199 Леша1с
 
13.05.14
15:29
+ а с 8.3 ты, видимо, сам не работал. Там даже супротив глюкавой 8.2 полная попа.
200 vqwy
 
13.05.14
15:30
200
201 quest
 
13.05.14
15:44
(197) зачем нужны лямбда, замыкание -  я как для себя знаю и где нужно применяю, зачем это в 1С -  не понимаю, вся ветка не смогла убедить в необходимости. Вот честно - никакой выгоды  не вижу.
202 Ювелир
 
13.05.14
15:45
Т.е. попытка реализовать сохранение контекста процедуры выполняемой на сервере, когда может потребоваться вызвать ее еще раз? Вместо явного сохранения на клиенте? Мне кажется 1с от этого пытается уйти. Ибо все это хорошо когда такие процедуры малы и контекста не много. Программист задумывается на хрена он передает икспарам и игрекпарам, когда можно этого не делать (и из-за лени (да простят меня 1С-ники, конечно, это происходит из совершенно других, более высоких мотивов :) ) - оптимизирует передачу параметров, миграцию контекста - туда-сюда). Когда есть халявный метод позволяющий запихнуть тупо все и не разбираться - срабатывает закон лени. В результате опухает  передача контекста по пути клиент - сервер - клиент.

Думаю если идти предложенным 1с путем, то такие методы нам не надо, хотя это удобно с точки зрения быстро писательства.

Не нужно
203 Serginio1
 
13.05.14
15:46
(198) Спасибо рассмешил. Ты для интереса почитай что такое Бухгалтерия 6.0. По твоим выводам на 1С писать вообще нельзя. А ведь пишут. А вэб клиент это уже отдельная платформа с использованием HTML JS.
По твоей логике Вэб клиент это чуть переделанный тольстый клиент?

(201) Ответь на 196 чем тебе не нравится подход в 171.
По твоей же логике Зачем нужны вычислить?
204 Serginio1
 
13.05.14
15:51
(202) Не должен опухать, так как компилятор должен анализировать код и если значения не изменяются то передавать только необходимые данные. Если есть изменения только в реквизитах то отслеживать эти реквизиты и изменять их на клиенте. Если изменяются табличные части то придется  передавать и их. Сейчас как раз многие ради лени используют На сервере передавая полный контекст.
205 quest
 
13.05.14
15:58
в (171) у тебя собственная реализация вычислить. Например так

МоеЗамыкание = новый Структура();
МоеЗамыкание.Вставить("Замыкание","Тип");
МоеЗамыкание.Вставить("х1 + х2 + х3","Код");
МоеЗамыкание.Вставить("1","х1");
МоеЗамыкание.Вставить("2","х2");
МоеЗамыкание.Вставить("3","х3");

Результат = моеВыполнить(моеЗамыкание);

функция МоеВыполнить(замыкание)
если замыкание.Тип = "Замыкание" тогда
строкакода = замыкание.Код;
для каждого х из Замыкание
   строкаКод = стрЗаменить(строкаКод, х.Ключ, х.Значение);
конеццикла;
возврат вычислилить (строкакод);
конецесли;
кнецфункции

Это будет прямо сейчас работать в коде, то что ты предлагаешь сделать - то же самое, но на уровне платформы, исходя из того что 1 и 2 как параметры очень легко передаются.
И проигнорировал вопрос - что будет если я захочу передать не числа, например захочу обойти строки динамической таблицы. И главное - как ЭТО по твоему должно реализоватся на платформе?

(204) А кто тебя обманул и сказал что 1С компилятор?
и что он что-то кому-то должен оптимизировать?
206 Ювелир
 
13.05.14
16:09
(204) Хм, а на счет #НаСервере - может тогда и не нужно более никаких других методов?

(204) понятно, что транслятор, а не компилятор (хотя, у 1с есть система предварительной компиляции).

"анализировать код и если значения не изменяются то передавать только необходимые данные" - я бы заменил "значения" на используемые и/или изменяемые переменные, так как, имено это, на мой взгляд, имеется ввиду.
207 Serginio1
 
13.05.14
16:17
(205)  Смысл замыкании как раз в рефакторинге.
Я тебе уже приводил пример как это реализовано в Net.
Замыкания нужны для упрощения кода.
(206) Так скажем в зависимости от мутабельности по разному  передача. Например касаемо табличной части если к контексте замыкания нет вызова внешних процедур и  данные не изменяются, то передавать можно не всю табличную часть а только определенные колонки.
Хотя бы отслеживали и возвращали только используемые переменные и реквизиты.
208 Serginio1
 
13.05.14
16:20
(205) Так же как и сейчас передаешь на сервер различия нет.
Смысл в том что вместо
Процедура(парам1,парам2,...парам101)
Просто использовать захват этих переменных и реквизитов.
209 Serginio1
 
13.05.14
16:29
(205) Транслятор вместо компилятора тебя удовлетворит?
210 Serginio1
 
13.05.14
16:32
209+ wiki:Компилятор

Все равно нужно
1.Лексический анализ. На этом этапе последовательность символов исходного файла преобразуется в последовательность лексем.
2.Синтаксический (грамматический) анализ. Последовательность лексем преобразуется в дерево разбора.
3.Семантический анализ. Дерево разбора обрабатывается с целью установления его семантики (смысла) — например, привязка идентификаторов к их декларациям, типам, проверка совместимости, определение типов выражений и т. д. Результат обычно называется «промежуточным представлением/кодом», и может быть дополненным деревом разбора, новым деревом, абстрактным набором команд или чем-то ещё, удобным для дальнейшей обработки.
4.Оптимизация. Выполняется удаление излишних конструкций и упрощение кода с сохранением его смысла. Оптимизация может быть на разных уровнях и этапах — например, над промежуточным кодом или над конечным машинным кодом.
211 su_mai
 
13.05.14
16:32
(0) А когда в 1С один и тот же код сможет выполняться на вэб-клиенте, тонком клиенте, мобильном приложении, сервере. При этом еще указывать на каком именно сервере кластера и тп? :)
212 Serginio1
 
13.05.14
16:48
(205) Заметь насколько твой код больше обычного замыкания
x1=1; x2=2; x3=3;
Лямбда=() => x1+x2+x3;

результат=Лямбда();
213 Asmody
 
13.05.14
16:53
(212) и сразу вопрос:
если после твоего кода написать

х1=2; х2=3; х3=4;
результат1 = Лямбда();

чему будет равен результат1?
214 Asmody
 
13.05.14
16:54
точнее, чему _должен_ быть равен результат1
215 Serginio1
 
13.05.14
17:06
Я уже давал тебе ссылку как это в Net реализовано.
будет как при  х1=2; х2=3; х3=4;
То есть в замыкании ссылки на эти переменные.
216 Serginio1
 
13.05.14
17:09
215+ А что касается 171 там замыкание для передачи и возврата переменных реквизитов
217 Serginio1
 
13.05.14
17:12
Поэтому есть проблемы с переменными циклов
http://habrahabr.ru/post/36601/
218 Serginio1
 
13.05.14
17:13
Хотя в C#5 Это уже подправили
http://deilycode.ru/index.php/2013/08/foreach-closures/
219 Serginio1
 
13.05.14
17:33
(214) Если нужна неизменяемые то можно как то так
Функция ВернутьЗамыкание(знач x1,знач x2,знач x3)
Лямбда=() => x1+x2+x3;
возврат Лямбда
КонецФункции
220 Asmody
 
13.05.14
17:38
(215) а вот, например, у scala на этот счет есть иное мнение
221 Serginio1
 
13.05.14
17:48
(220) Ну я на скала не пишу. Ты не забывай что в функциональном программировании все рид онли (Неизменяемые типы, иммутабельные типы) окромя монад.

На C# будет так так как он гибридный язык.
А с точки зрения сервеных вызовов все изменения переменных в замыкании должно переносится и в вызывающий метод.
222 Asmody
 
13.05.14
17:54
(221) в scala в этом смысле проще — там мутабельность переменной определяется явно и контролируются компилятором. Но побочные эффекты возможны и в этом случае.
223 iamnub
 
13.05.14
17:57
(0)
Фуфел это всё, сынки.

В Informix можно было указывать - на каком месте цилиндра HDD хранить таблицу!

О как!
224 iamnub
 
13.05.14
18:02
Таблицы партионного учета - СТРОГО близка к стержню!

Восстановление партионного учета - танец у шеста!
225 Asmody
 
13.05.14
18:04
(223) в случае с SSD особенно актуально, да
226 Serginio1
 
13.05.14
18:09
(222) Ну вот здесь пишут что изменения видны
http://blog.lakhtin.com/post/2348212568/closure

scala> var more = 1
more: Int = 1

scala> val addMore = (x: Int) => x + more
addMore: (Int) => Int = <function1>


scala> more = 100
more: Int = 100

scala> addMore(10)
res17: Int = 110

scala> more = 200
more: Int = 200

scala> addMore(10)
res18: Int = 210
227 quest
 
13.05.14
21:41
(207) > Смысл замыкании как раз в рефакторинге. - в мемориз
> Я тебе уже приводил пример как это реализовано в Net.  - ты бы на пример реализации в lisp или clojure глянул. дя академической простоты - в ракетке
> Замыкания нужны для упрощения кода.  поржал

(212) еще раз - это возможная на сегодня реализация замыкания, которая не потребует переписывания платформы. Причем тут размер? или синтаксис? ну глянь ты просто на CLHS что можно сделать простым макросом. ветка же не про синтаксический сахар

(221) внезапно - у лиспа на этот счет тоже другое мнение.
(224) круть!


Резюмируя - ветка смысла не имеет, все говорят на разных языках.
228 Serginio1
 
14.05.14
10:57
(227) Смысл есть в упрощении кода. Еще раз в 212 намного проще использовать чем твой код в 205 почувствуй разницу и ржи себе на здоровье.

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

Кстати ссылочки приводи для общего развития.
229 quest
 
14.05.14
11:16
Код из (205) это то что сейчас уже будет работать, код из 212 - твоя мечта которая не скомпилиться ни под какой платформой. Так как 1С развивает платформу не пойми как, то надеяться что в новой версии введут тот синтаксический сахар что ты указал - глупо.  
Насчет ссылок - было уже. читай не вики, а учебники. Для понимания как это внутри работает - прочти Lisp in Small Pieces (есть и на русском ссылка - http://ilammy.github.io/lisp/ )
А вот по поводу "..правой кнопочкой выбираем создать серверную процедуру задаем имя и в конфигураторе создается процедура и её вызов. Если такое введут предлагаю тебе не пользоваться." - уже полгода пользуюсь. открой для себя снегопат.
230 Serginio1
 
14.05.14
11:41
(229) Здесь разговор не о том, что есть, а что желательно ввести для облегчения программирования. Т поверь я сам активно использую выполнить.
Тесты не проводил, но мне кажется что выполнить более медленая операция по сравнению с инлайн кодом.
v8: Отбор с условием

Во вторых приходится использовать текст, что неудобно по сравнению с кодом и синтаксическим контролем.

Ну вот видишь в снегопате то уже есть, значит не все так уж и сложно?
231 Serginio1
 
14.05.14
11:47
(229) В приведенной тобой ссылке нет того что захватываются значения, а не ссылки переменных.
232 quest
 
14.05.14
12:18
(230) хм.. то есть тебе достаточно регэкспов? так может так и стоило писать - хочу регэкспы выполянемые в конфигураторе, а не замыкания.
(231) ты сделал мой день. Но если что - прочти чуть дальше чем введение.
233 Serginio1
 
14.05.14
12:43
(232) Вообще то это регекспы это далеко не рефакторинг.
Так как нужно анализировать изменнеия и оптимизировать передачу и возврат данных. При этом выглядеть такой код будет как замыкания. Например на шарпе генерится отдельный класс. От этого суть замыкания не меняется. Меняется её реализация.

Насчет изучения поверь мне и без этого есть, что изучать поэтому и прошу дать ссылку на захват  переменных по ссылке или по значению в Лиспе.
234 quest
 
14.05.14
18:55
Когда в руках молоток, все кажется гвоздями. Если знаешь С# - то везде видишь классы. И вольно или невольно пытаешься применить свои знания и здесь.

По поводу захвата, освобождения и прочих терминов применяемых  в С# - не нашел адекватной замены, но можешь прочесть пункт про лексическую и динамическую видимость из выше приведенной ссылки.

200 постов - ни о чем.
235 Serginio1
 
14.05.14
19:08
(234) Посмотрим что будет в 9.0. Но рефакторинг уже в ближайших версиях могут вводить
236 iamnub
 
14.05.14
19:14
(234)
Хорошо сказал!
237 quest
 
14.05.14
19:49
рефакторинг - это не свойство языка. его ты и сейчас можешь делать (кроме лени - ничего не мешает). Если что - его еще на 77 можно было делать.
Замыкание - свойство языка, для его реализации в 1С придется переделывать платформу.
238 Serginio1
 
14.05.14
20:16
(237) Ну от рефакторинга wiki:Рефакторинг#.D0.92.D1.8B.D0.B4.D0.B5.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BC.D0.B5.D1.82.D0.BE.D0.B4.D0.B0_.28Extract_Method.29

Выделение метода недалеко и от совмещения серверного кода внутри клиентского, а там уже недалеко и до лямбд и замыканий.

А там уже и совсем рукой подать и до Linq и Linq to DB.
Начинать надо с малого.
239 Serginio1
 
14.05.14
20:20
В том числе можно создавать аналог расширяемого класса
v8: v8: Использование сборок .NET в 1С 7.x и 8.x
240 VladZ
 
14.05.14
20:20
(0) Очередная ненужная фигня... Не удивлюсь, если эту фигню пропихнут в каком-нибудь новом релизе.
241 quest
 
14.05.14
22:08
(238) с твоей точки зрения получается - теплое и кислое - практически идентичные понятия. И ничем  не отличаются от  твердого и желтого.
(239) Сейчас тебе что это мешает сделать?
(240) Не боись. не пропихнут. Потребности в этом нет. пара гиков  с С# и один с лиспом - не повод менять язык.
242 Asmody
 
14.05.14
23:40
(241) если в типовых начнут активно использовать фоновые асинхронные вызовы, то может что-то такое и появится. Сейчас реализация тех же фоновых отчетов больше похоже на шаманство, чем на технологию
243 Serginio1
 
15.05.14
10:32
(241) Здесь не проблема гиков. Linq это уже постоянное использование в том числе и Linq to EF. Индустрия развивается и борьба за клиентов идет полным ходом. Тот кто создаст удобный с максимальными возможностями инструмент тот и будет завоевывать клиентов. Ты просто отстал от времени. Например я сейчас на 7.7 программирую и получаю больше удовольствия из-за того что на 1С++ могу использовать всю мощь T-SQL.
Да и среды разработки постоянно совершенствуются. Если сравнить Visual Studio или IntelliJ IDEA.

А потребность в этом есть. Просто ты этого не видишь.
244 Serginio1
 
15.05.14
11:09
Опачки сейчас открыл 1С:Предприятие 8.3 (8.3.5.823)
а там рефакторинг то уже есть. Например "Выделить в ассинхронную процедуру". Так что до совмещения клиентского и серверного кода недалеко
245 Serginio1
 
15.05.14
11:14
Блин прорустил http://v8.1c.ru/o7/201312ref/index.htm
246 quest
 
15.05.14
12:22
(242) в (207) ясно сказано "Смысл замыкании как раз в рефакторинге", так что отчеты в пролете.
(243) Да. я отстал. моя среда разработки для не 1С - емакс. и необходимости в ее модификации я не вижу. Вполне нормально работает и для С++ и для лиспа.
(244) Круть. Значит до замыканий осталось полшага - основное то сделано уже. чисто косметические вещи остались - переписать платформу и переобучить армию программистов.

В общем, это мое последнее  сообщение в этой ветке. Смысла продолжать нет. Мы действительно говорим о разных вещах разным языком.

Не нужно
247 Asmody
 
15.05.14
12:24
[Смысл замыкании как раз в рефакторинге] — чо?!
248 quest
 
15.05.14
12:31
мопед не мой, он из 207 сообщения в этой ветке
249 KuzEv
 
15.05.14
12:33
После апдейта на 8.3.4.482 код, указанный у топик-стартера, отправляет платформу в дамп по таймауту, т.е. если не отвечать на вопрос в течение минуты.
250 Serginio1
 
15.05.14
12:35
(246) Ты посмотри на 245. Выделение на каждый модальный вызов отдельную процедуру еще то удовольствие.
Можно просто поместить ассинхронный код внутри например метода
АссинхронныйВызов(
ВыбранноеЗначение=ВыбратьИзМеню(СписокВыБора,Элементы.КомандаМеню);
Ф=154;
)

(248) Для выделения серверного кода или ассинхронного достаточно рефакторинга, который генерит методы при компиляции этакий аналог макроса который активно используется например в Немерле.
251 Serginio1
 
15.05.14
12:39
(247) На самом деле сначала анализируется захватываемый контекст и в итоге генерится новый код при компиляции.
Например если используются переменные то создается  класс с этими переменными доступ которым осуществляется как из вызывающей процедуры так и замыкания. Реализации могут быть различными.
252 Анцеранана
 
15.05.14
12:40
Слишком сложный руский синтаксис для простого парня из маленькой северо-мадагаскарской деревушки. Точки , стрелочки, скобочки (( Придумай проще!

Не нужно
253 Serginio1
 
15.05.14
12:43
254 Serginio1
 
15.05.14
12:44
(250) Чем для тебя 250 сложен?
255 Serginio1
 
15.05.14
15:08
в C# для упрощения работы с ассинронностью  ввели
async и await http://habrahabr.ru/post/162353/
256 dmpl
 
16.05.14
08:37
(168) Чтобы не писать портянку - любая коллекция КлючИЗначение к вашим услугам.

(179) Да нет никакой проблемы. Разработчикам платформы это просто не нужно. Ведь этого никто кроме обслуги не увидит. А вот внешние плюшки - очень даже нужны, заказчика впечатлить.
257 dmpl
 
16.05.14
08:44
(212) Заметь, насколько проще ошибиться в таком коде, если подумаешь, например, что x1 уже давно не используется, и используешь для своих целей.
258 dmpl
 
16.05.14
08:51
(243) Клиентов заработает тот, кто создаст хороший конечный продукт. Как он сделан внутри - 99,9% клиентов не интересует вообще.

(244) Осталось все это дело отладить :)

(250) АССинхронный - это от слова ASS? Т.е. по-русски - через-задницу-в-будущее?
259 ERWINS
 
16.05.14
23:36
Ассинхронное программирование это тренд.
А замыкания там в тему.
260 dmpl
 
17.05.14
10:09
(259) Вот блин, даже как название правильно пишется не знаете, а все туда же... аСинхронное оно. А ассинхронное - это через задницу получается.
261 Serginio1
 
17.05.14
10:24
(260) Прошу прощение за неправильное написание. Но вот то, что тренд существует это факт. При этом async и await значительно сложнее чем
АссинхронныйВызов(
ВыбранноеЗначение=ВыбратьИзМеню(СписокВыБора,Элементы.КомандаМеню);
Ф=154;
)  

см 255
Главное, что бы упростить код, а через что это будет сделано глубоко наплевать.
250 легко делается через рефакторин во время компиляции кода в промежуточный код (AST дерево wiki:%C0%E1%F1%F2%F0%E0%EA%F2%ED%EE%E5_%F1%E8%ED%F2%E0%EA%F1%E8%F7%E5%F1%EA%EE%E5_%E4%E5%F0%E5%E2%EE) или трехадресный код wiki:%CA%EE%E4%EE%E3%E5%ED%E5%F0%E0%F6%E8%FF
262 Serginio1
 
17.05.14
10:49
Ну и можно посмотреть на байт код в 1С http://kb.mista.ru/article.php?id=519
263 quest
 
18.05.14
15:51
" делается через рефакторин во время компиляции кода" - а как рефакторинг (изменение текста! программы) можно сделать в момент анализа AST? и как этому помогут замыкания?
264 Serginio1
 
18.05.14
20:35
(263) Посмотри  http://v8.1c.ru/o7/201312ref/index.htm

Там как таковые замыкания и не нужны. Просто генерация года во время компиляции. Это же касается и серверного кода внутри клиентского.
265 Serginio1
 
18.05.14
20:49
Вернее так скажем нет явного использования замыканий.
Посмотри на async и await http://habrahabr.ru/post/162353/
266 quest
 
19.05.14
12:25
Вот зарекался я суда писать. Но блин нельзя же так в одну кучу сваливать все вместе. Возьми ты книжку любую - как минимум sicp - и прочитай что такое замыкание. Затем прочитай у Фаулера что такое рефакторинг. И попытайся найти хоть одно сходство.
А то все вместе - и асинхронность, и замыкания, и рефакторинг, и видимо скоро китайский язык потребуется (ибо тренд от которого нельзя отмахнуться)

Насчет посмотри туда или сюда - все что ты пытаешься показать - не изобретения Майкрософта, использовалось это все еще в 90 году и нормально работало в лиспе, начиная с 2003 - перекочевало в ракету где стало еще лучше работать.

В общем не все вокруг гвозди. И читай не только вику
267 Serginio1
 
19.05.14
12:45
(266) Ты мне только на один вопрос ответь, что тебе не нравится код в 261 и 171. Чем для тебя плох Linq, await.
Почему лисп несмотря на его мощность не получил такого распространения чем тот же C#.
268 quest
 
19.05.14
13:48
По пунктам - почему не понравился? - код не баба. его задача работать, а не нравиться. Но конкретно по куску

АссинхронныйВызов(
ВыбранноеЗначение=ВыбратьИзМеню(СписокВыБора,Элементы.КомандаМеню);
Ф=154;
)  

тут у тебя мешаются 2 подхода к написанию, которые сложно читать.
Убери осмысленные имена и ты получишь
ф(х=у(й)) что приводит к увеличению времени чтения кода
Код должен быть однородным и не напрягать при чтении.
Хреновый сахар короче ты предлагаешь. Как было бы лучше? Не знаю.
Чем плох linq и прочий модный набор слов? Да ничем. Как впрочем ничем и не хорош. а если впихивать его вневпиху*мое - так даже вреден.
Почему лисп не получил распространения? Не знаю. Наверное потому что детям чернобыля было проще прочитать книжку "Освой программирование на C# за 21 день" чем htdp, paip или sicp. Да того же Страуструппа не читали. Как логичный результат подобного обучения - рефакторинг не сделать без асихроности и замыканий.
269 iamnub
 
19.05.14
13:54
(268)
Сегодня ты рефакторинг без замыканий делаешь, а завтра?!

А завтра ты запросы в цикле крутить будешь!
270 quest
 
19.05.14
14:03
(269) :) ты сделал мой день!
271 iamnub
 
19.05.14
14:14
(270)
;)
272 Serginio1
 
19.05.14
14:33
(268) То есть по твоему вместо 268 вот это легче читается?

ПоказатьВыборИзМеню(Новый ПоказатьВыборИзМеню("КомандаМенюЗавершение",ЭтотОбъект),СписокВыбора,Элементы.КомандаМеню);


Процедура КомандаМенюЗавершение(результат,ДополнительныеПараметры) Экспорт
ф=154
КонецПроцедуры

(269) Еще раз посморти на await и все, что за ним стоит.
Народ тоже раньше писал BeginXXX EndXXX. Не было анонимных делегатов и замыканий. Как только все это появилось народ с большим удовольствием начал писать по новому.
По поводу LINQ то там ты можешь писать запросы и в цикле, которые в итоге будут разворачиваться в один запрос.


Тогда у меня нет вопросов. Наверное у тебя просто потребность писать лишний код, который к тому же еще и хуже читается.
273 quest
 
20.05.14
14:10
Да, проще читается.
Народ до сих пор такое пишет на С++ и ничего, не пишут гневные письма в комитет по стандартизации. Странная ситуация, не находишь?

Приведи пример когда запрос в цикле будет разобран в один запрос.

Вот здесь - v8: Мощь LINQ-а, или 1С и  не снилось. написан простой запросик. Измени его так что бы бегая по массиву слов он отобрал все первые большие буквы при условии что  массив обходиться циклом. Как они в итоге развернутся?

На вкус и цвет как говориться. Но ради эксперимента покажи свой код 100 коллегам и попроси охарактеризовать его.
274 Serginio1
 
20.05.14
16:19
(273) Ну там в цикле можно условия задавать.
v8: Мощь LINQ-а, или 1С и  не снилось.
там запрос состоит из двух запросов
275 Serginio1
 
20.05.14
16:24
(273) Ну мои коллеги с удовольствием используют await
А конструкция из 261 На C# будет такой
выбзнач = await ВыбранноеЗначение=ВыбратьИзМенюAsync(СписокВыБора,Элементы.КомандаМеню);
// Код который ниже будет выполняться после того как выполнится выбор
// При этом не будет блокировки основного потока
Если выбранноеЗначение<>неопределено Тогда
Ф=154;
КонецЕсли;

Ну а сишникам я сочувствую. Особенно когда они мучаются с IDispatch  и прочим