Я разработал и реализовал язык программирования.

Одна из особенностей этого языка - маскировка функции (в примере кода я называю ее leftBind) как переменной, так что любая следующая точечная нотация передается в качестве идентификатора.

Изменить: это похоже на метод доступа для класса, за исключением того, что здесь не используется класс. Будет ли применяться здесь тот же термин «получатель» или «аксессор»?

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

Пример этого:

/*leftbind aliases the identifier “sql” to the  function “quote”
It is called leftBind, since it’s binding the left side of the parse tree to a function*/ 
leftBind(“sql”, “quote”); 
q=“select * from foo where user=$sql.user”; // equivalent to quote(user)

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

Какая терминология обозначает этот тип поведения?

0
Zack Wilkes 29 Окт 2019 в 15:52

1 ответ

Лучший ответ

Если я вас правильно понял, это может быть комбинация строковой интерполяции и динамического поиска членов:

Строчная интерполяция

Например. в Swift вы можете вставлять выражения в код:

"This is \(getAdjective(), uppercasing: true) !"

Эквивалентно

"This is ".append(getAdjective(), uppercasing: true).append(" !")

Определив метод append для String, который принимает дополнительные параметры (в данном случае логическое значение uppercasing:) или принимает другой первый аргумент, вы можете позволить людям расширить этот синтаксис заполнителя.

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

Важной частью здесь является то, что существует синтаксис для встраивания выражений в строки, детали того, как Swift его реализует (метод append на String - это только то, как это делает Swift, а не то, как должна быть интерполяция строк .

Динамический поиск членов

В Swift класс может определять функцию, которая вызывается при ссылке на член, который не существует как свойство или функция:

@dynamicMemberLookup class MyClass {
    var dictionary: [String: String]
    subscript(dynamicMember: String) -> String {
        return dictionary[dynamicMember] ?? ""
    }
}

Это позволяет вам динамически создавать свои собственные переменные. Когда ты пишешь

let foo = MyClass()
let myString = foo.bar

Компилятор в основном просто генерирует код для

let foo = MyClass()
let myString = foo.subscript(dynamicMember: "bar")

Это о чем вы думаете?

1
uliwitness 31 Окт 2019 в 17:03