0

我设计并实现了一种编程语言。

这种语言的特点之一是将函数(在示例代码中,我称之为leftBind)伪装成一个变量,这样任何以下的点符号都可以作为标识符传递。

编辑:这也类似于类的访问器方法,除了这里没有使用类。相同的术语“getter”或“accessor”在这里适用吗?

这种语言的目的是提供一个功能齐全的语言但被监禁的环境,以允许项目的复杂配置,但保护项目免受整个未经授权的行为。

一个例子:

/*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)

这对于更复杂的任务或当您想要将常用函数内联到字符串中而不需要额外的代码行乱扔您的程序时变得非常方便。

这种行为的术语是什么?

4

1 回答 1

1

如果我理解正确,这可能是字符串插值和动态成员查找的组合:

字符串插值

例如,在 Swift 中,您可以在代码中嵌入表达式:

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

相当于

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

通过定义一个带有附加参数(在本例中为布尔值)或接受不同的第一个参数的append方法,您可以让人们扩展这个占位符语法。Stringuppercasing:

您还可以实现一个返回字符串的方法,这样您就可以在\(...).

这里重要的部分是在字符串中嵌入表达式的语法,Swift 如何实现它的细节(append方法 onString就是 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")

这是关于你在想什么?

于 2019-10-31T16:56:32.037 回答