Programming languages 可以操作对象属性的静态语言?

Programming languages 可以操作对象属性的静态语言?,programming-languages,static,Programming Languages,Static,在处理异构数据时,需要对保存数据的简单对象进行部分更改。例如,您可能希望添加、删除或重命名属性,或者连接两个对象。这在动态语言中很容易,但我想知道静态语言是否有聪明的解决方案 为了修正这些想法,有没有任何语言,可能通过某种静态混合语法,支持如下(C#): 这显然是可能的,因为没有使用运行时信息。是否存在具有此功能的静态语言 补充: 我考虑的一个有限版本是F#: 您所描述的在编程语言研究中称为记录连接。关于记录串联的静态类型系统,已经有一些工作,主要是在自动类型推断(la Haskell或ML)的

在处理异构数据时,需要对保存数据的简单对象进行部分更改。例如,您可能希望添加、删除或重命名属性,或者连接两个对象。这在动态语言中很容易,但我想知道静态语言是否有聪明的解决方案

为了修正这些想法,有没有任何语言,可能通过某种静态混合语法,支持如下(C#):

这显然是可能的,因为没有使用运行时信息。是否存在具有此功能的静态语言

补充: 我考虑的一个有限版本是F#:


您所描述的在编程语言研究中称为记录连接。关于记录串联的静态类型系统,已经有一些工作,主要是在自动类型推断(la Haskell或ML)的上下文中。据我所知,它尚未对任何主流编程语言产生影响。

您所描述的在编程语言研究中称为记录串联。关于记录连接的静态类型系统,已经有一些工作,主要是在自动类型推断(la Haskell或ML)的上下文中。据我所知,它尚未对任何主流编程语言产生影响。

可能是运算符重载?我觉得我不明白你在说什么。我正在尝试创建一个新对象,但没有运行时反射,
new{Hello=Hello,World=World}
。这在C#中是不可能的。您是否在询问是否可以在编译时完成?我的意思是,
std::map
允许您在运行时添加/删除键值对。@jtbandes:No,在编译时。我所说的一个有限版本是F#的复制和更新记录表达式:
让x={oldrecord with NewValue=48;NewValue2=50}
。这定义了一个新的静态记录,附加了
旧记录的字段和值?我觉得我不明白你在说什么。我正在尝试创建一个新对象,但没有运行时反射,
new{Hello=Hello,World=World}
。这在C#中是不可能的。您是否在询问是否可以在编译时完成?我的意思是,
std::map
允许您在运行时添加/删除键值对。@jtbandes:No,在编译时。我所说的一个有限版本是F#的复制和更新记录表达式:
让x={oldrecord with NewValue=48;NewValue2=50}
。这将定义一个新的静态记录,附加
oldrecord
的字段和值。
var hello = new { Hello = "Hello" };
var world = new { World = "World" };
var helloWorld = hello + world;
Console.WriteLine(helloWorld.ToString());
//outputs {Hello = Hello, World = World}
let myRecord3 = { myRecord2 with Y = 100; Z = 2 }