Здравствуйте, 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 ()