Re[5]: fn-call, chain-call, params
От: Sm0ke Россия ksi
Дата: 22.10.23 12:00
Оценка:
Здравствуйте, netch80

По фрагменту моего коммента
x !as[type]

Вы писали:

Я не понял, к чему '!' впереди "!as".

Это применение метода (действия) к результату предыдущего выражения.
Но сперва я бы хотел пояснить про вызовы обычных функций.

# fn call

В кси есть два способа вызова функции:
Обычный, и по цепочке

angle = math.pi

// обычный вызов функции
x = math.sinus(angle)

// chain call
x = (angle |math.sinus)

  пояснение
Вертикальная палка означает: применить функцию к значению слева.
Идея повзаимствована из библиотеки шаблонов Smarty.

Я думаю, что на уровне парсера надо проверять, чтобы после | не было пробела при chain-call.


Так можно вместо вложенных скобок писать вызовы слева-направо.
param = "size"

// обычный вызов функции
x = math.sinus( config.get_value(param) )

// chain call
x = (param |config.get_value |math.sinus)

* Предполагается, что функции math.sinus и config.get_value где-то определены.

# Способы передачи параметров

--
При обычном fn-call и когда функция принимет один параметр — круглые скобки можно не писать, заменив их спец-символом:
// альтернативный способ передать первый параметр
std.loop! { /* тело цикла */ }

// простой способ
param = { /* тело цикла */ }
std.loop(param)

Символ восклицательный знак ! после функции (без пробела между ними) — означает вызови функцию, а как первый параметр возьми результат последующего выражения.
Может быть есть более походящий для этого символ, чтобы задать его в парсере?

Функция std.loop — это вечный цикл. Она принимает один параметр — sequence.
Где именно она определена? Может быть в библиотеке, а может и системная — вопрос не решённый.

Пока рассказываю про синтаксис вызова и передачи параметров.
С набором стандартных/системных функций ещё предстоит определиться.
Выбрать им имена)


--
При chain-call для функции с двумя параметрами — этот второй параметр тоже можно по разному пассить.
map = [1:"one" 2:"two" 3:"three"]

key = array |key_of("two")
key = array |key_of: "two"
// key == 2

Символ двоеточие для второго параметра при chain-call тоже задаётся в парсере.
Меня немного смущает, что смысл символа зависит от контекста.
Выписать бы контексто-зависимые символы отдельно.

Пример с циклами:
{
  /* pre condition */
} |std.while_do: {
  /* loop body */
}

{
  /* loop body */
} |std.do_while: {
  /* post condition */
}


# методы (actions)

Напомню, что ! перед именем (без пробелов между ними) — это вызов метода.
Для поиска методов — у обработчика свои правила разрешения имён, отличные от случая с функцией.


Про методы у типов напишу немного позднее / возможно / И про шаблоны тоже.
Но мне кажется интерес других программистов на RSDN к разработке нового ЯП поугас.

Однако я замечаю, что есть нюансы, по которым ругают Си++.
Так вот бы создать новый better language и сделать как мы хотим

Касательно темы функций — вопрос открыт про variadic параметры, нужны ли они ? Или взять fixed size массив / sequence
И про передачу параметров по имени. В php это есть, в других яп тоже. Но я бы предложил через отдельную команду #options ()
Отредактировано 23.10.2023 11:16 Sm0ke . Предыдущая версия . Еще …
Отредактировано 22.10.2023 12:02 Sm0ke . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.