Answers:
哈斯克尔几乎所有东西
还有很多。
PS。是。如果有人问我,我是Haskell迷。
Lisp宏。
Lisp宏语言是Lisp,为方便起见具有一些预定义的语法功能。使用它们,可以为语言添加主要功能,例如选择对象的面向对象样式或类似Prolog的确定性匹配,而又不会显得不合适。它使setf
宏成为可能,该宏在概念上非常强大: (setf A B)
意味着,当您评估时,A
您会得到B
,并且可以扩展到您喜欢的任何限制。
C ++模板元编程具有类似的功能,但所用语言与常规C ++完全不同。
Python的装饰器。
使用装饰器实现备忘录或功能计时非常容易。
功能计时器的示例。
class FuncTimer(object):
""" Time how much time a function takes """
def __init__(self, fn):
self.fn = fn
self.memo = {}
self.start_time = time.time()
def __call__(self, *args):
self.memo['return'] = self.fn(*args)
print("Function '%s' took %u seconds" % (self.fn.__name__, time.time() - self.start_time))
return self.memo['return']
现在,如果您有想要计时的功能foo,则只需执行此操作,
@FuncTimer
def foo():
# foo's implememtation goes here
你会看到类似的东西,
函数“ foo”花费了3秒钟。
void*
在C中进行强制转换。您可以将所有内容强制转换为原始字节,并对这些数据执行任何操作。
(是的,如今很独特...)
void*
... 仍然完全不同...
Pointer
在Pascal和Object Pascal中强制转换为相同的功能。
int64_t
,您不能始终将其强制转换void *
(对不起-2年-答复)。
Lambda表达式(闭包,嵌套函数,匿名方法,无论您如何称呼它们)。
我首先在Perl中遇到了它们,立即爱上了它们,并想知道为什么其他语言没有它们。如今,我猜它已经不再那么独特了。甚至PHP也设法以某种方式破解了它们。但是当时它们是半独特的。
Delphi中的集合非常有用,几乎只是一个命名的布尔数组。它们对于保存带有32个复选框的设置表单非常有用。但是它们具有相同的集合理论函数(即差,交集,并集)。
我不确定它们是否过时,但我一直都在使用它们。
/// <summary>
/// Get ID
/// </summary>
public int ID
{
get; set;
}
与
(Java)
/**
* Name of user
*/
private String name;
/**
* Gets name of user
* @return Name of user
*/
public String getName() {
return this.name;
}
/**
* Sets name of user.
* @param name
*/
public void setName(final String name) {
this.name = name;
}
C中的联盟
老实说,我还没有编写足够的C语言来自己编写这些代码,但是我已经与其他代码一起工作了。
归结为在处理原始位/字节的应用程序(例如网络或二进制数据存储)中打包不同数据的混合。在强类型语言中,没有简单的方法可以做到等效。
免责声明:
尽管联合在某些情况下非常有用,但是在大多数高级语言中都找不到联合,因为它们的类型不安全。IE,您可以使用并集使数据跨变量边界流失(在类型安全的世界中非常重要)。拥有权利的同时也被赋予了重大的责任。
union
是安全的,有些是习惯用法(尽管从技术上讲是不正确的)-请参阅cellperformance.beyond3d.com/articles/2006/06/…(尽管指针联合会带来更多的麻烦,但很容易伪造它)。
record
语法以支持工会:in_addr = record case integer of 0: (S_un_b: SunB); 1: (S_un_w: SunW); 2: (S_addr: u_long); end;
我不确定这有多独特,但是在python中,您可以做一些很酷的事情,例如将关键字对自动编入字典并返回。与列表相同:
def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
print "-- This parrot wouldn't", action,
print "if you put", voltage, "volts through it."
print "-- Lovely plumage, the", type
print "-- It's", state, "!"
parrot(1000)
parrot(action = 'VOOOOOM', voltage = 1000000)
parrot('a thousand', state = 'pushing up the daisies')
parrot('a million', 'bereft of life', 'jump')
C预处理程序。您甚至可以使用-更少或更多-ifdefs将通用代码编写到不同的平台。
Ruby的inject方法与Ruby 1.9 的Symbol#to_proc功能相结合,使人们可以编写一些非常简洁(但仍可读)的代码:
例如 (1..10).inject(:+)
将1到10的整数相加=> 55
看到这样的例子使我想学习Ruby,这是我刚刚开始做的。
JavaFX(RIP)中的绑定机制。通过bind关键字,您可以将变量的值绑定到表达式的值,并摆脱所有那些难看的Listener样板代码。
尽管JavaFX在许多方面都相当失败,但我发现脚本语言的许多功能都非常不错。