пятница, 29 января 2021 г.

Разобрался с синтаксисом

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

И вот, что я насоображал по поводу синтаксиса.

Во-первых, нужен будет стек. Чтобы просто не объявлять и не придумывать названия локальным переменным. Но я ещё не решил, скорее всего это будет FIFO, а не LIFO. Почему-то мне кажется, что это удобнее.

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

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

Во-вторых, и это самое главное, что я понял. Что у переменной метод get - это вызов переменной при обращении к ней как к параметру. Его не нужно вызывать явно - в этом просто нет смысла, хотя конечно это можно сделать, чтобы поместить результат на стек.

А вот метод set - это вызов функции, а не вызов переменной.

Таким образом синтаксис получается очень простым:

имя_вызываемой_функции  параметр_функции

И всё? - не поверил я. А как же всё остальное? Дополнительные параметры и всё такое.

Придётся что-то изобретать, как обойти данное ограничение. Когда я писал четвёртую версию fpli, то мне потребовался метод substr для класса String, который в Си имеет несколько параметров, и на первый взгляд кажется, что без них не обойтись - нужно задать начало и конец подстроки.

Но посмотрим на эту задачу иначе. У нас есть строка, нам нужно удалить начало и удалить конец - это не одна, а две операции, и так мы получаем искомую подстроку. 

Получится что-то вроде такого кода:

"Hello our perfect World!" // Кладём строку на стек
$ trim_left 10  // Удаляем 10 символов слева            
$ trim_right 7  // Удаляем 7 символов справа

На стеке остаются строки

0: "Hello our perfect World!"
1: "perfect World!"
2: "perfect"

Дело в том, что trim_left и trim_right - это методы класса String, и им не требуется больше одного параметра.

Но как же быть с методом convert_token? - возникает вопрос. Получается, что мы можем возвращать несколько значений результата. Ведь параметром функции может быть только литерал, константа, переменная или свойство объекта или класса. Чтобы передать в качестве параметра ссылку на класс или функцию, нужно будет добавить соответствующее ключевое слово - иначе просто непонятно, как быть в случае, если вызов функции возвращает указатель на функцию. Мы должны её вызвать или она и есть значение параметра.

Не знаю, может быть завтра выяснится, что это тоже не работает. Но пока выглядит многообещающе.

Комментариев нет: