你讨厌你最喜欢的语言有什么五件事?

afuga 发布于 2019-11-10 最后更新 2019-11-10 11:55 259 浏览

最近Stack Stack出现了一堆Perl讨厌的东西,所以我想我会把我的“Five things you hate about your favorite language”问题带到Stack Overflow。拿你最喜欢的语言,告诉我你讨厌的五件事。那些可能会让你烦恼,承认设计缺陷,认识到性能问题或任何其他类别。你只需要讨厌它,它必须是你最喜欢的语言。 不要将它与另一种语言进行比较,也不要谈论你已经讨厌的语言。不要用你最喜欢的语言谈论你喜欢的事情。我只是想听到你讨厌但容忍的事情,所以你可以使用其他所有的东西,我想听听你希望别人会用的语言。 每当有人试图向我推荐他们最喜欢的语言时,我都会问这个问题,有时候还会作为一个面试问题。如果有人无法找到五件令人讨厌他最喜爱的工具的东西,他不会很好地支持它,或者用它来支付大笔资金。他没有在足够多的情况下使用它来充分探索它。他主张它作为一种文化或宗教,这意味着如果我不选择他最喜欢的技术,我错了。 我不在乎你使用哪种语言。不想使用特定的语言?那就不要。你会通过尽职调查做出明智的选择,但仍然不使用它?精细。有时候,正确的答案是“你有一个强大的编程团队,他有很好的实践经验并且有很多Bar的经验,换到Foo会很愚蠢。”


这对代码评论来说也是一个很好的问题。真正了解代码库的人会对此有各种各样的建议,而那些不太了解它的人会有非特定的投诉。我问一些诸如“如果你可以重新开始这个项目,你会做什么不同?”在这个梦幻般的土地上,用户和程序员可以抱怨任何他们不喜欢的东西。 “我想要一个更好的界面”,“我想从视图中分离出模型”,“我会用这个模块代替另一个模块”,“我会重命名这套方法”,或者他们真的不管不喜欢目前的情况。这就是我如何处理特定开发人员对代码库的了解程度。这也是一个线索,说明程序员的自我与他告诉我的内容有多大关系。 仇恨并不是解释人们知道多少的唯一方面,但我发现它是一个很好的方法。他们讨厌的东西也给我提供了他们思考这个问题的思路。
已邀请:

ut_sit

赞同来自:

[R 不是我最喜欢的语言,但我经常使用它并且有很多抱怨...

  • S3对象只是美化lists而S4类仍然将所有数据都暴露给用户
  • 赋值运算符可以是<- ->=,请参阅Mike Dewar's rant
  • my.var是一种非常令人困惑的OO语言变量命名约定,请参阅Google's style guide
  • 我不应该后悔使用循环
  • 隐秘错误消息

verror

赞同来自:

C# 我的大多数抱怨都与假设C++约定自动成为C#的最佳选择有关

  • 类接口中不允许使用静态。它仍然是课程的一部分。为什么它不能成为界面的一部分?!我必须为此创建这样愚蠢的hack-y解决方案。
  • 区分大小写。我知道在这一点上它会破坏遗留应用程序,但为什么不是不区分大小写而不是从一开始的规则
用于.NET的奖励(不是C#特定的)
  • 编译器不够聪明。在.NET 3.x中,编译器可以在编译时找出“var”,那么为什么不进行其他常见的优化呢?我们都知道字符串与StringBuilder / immutable和可变的东西。为什么编译器不能为你转换它在很多情况下很明显StringBuilder比多个concat.s更好?我确信默认情况下编译器可以为我们做很多其他优化(可以选择否决)并节省大量时间。

qporro

赞同来自:

C#

  1. 没有简单的方法来检查类型是否为数字
  2. 这意味着你可能会使用大多数微软堆栈,IIS和MSSQL
  3. C#不是针对特定问题的特定工具,而是尝试成为每种范例的语言。
  4. 缺乏社区。当然,开始有C#的开源框架和库。 Java开发人员多年来可以使用的相同内容。
  5. 很难找到很好的帮助。互联网上充斥着如何解决C#问题的不良例子。这可以追溯到问题#3。

ivel

赞同来自:

我讨厌所有语言的五件事(我至少知道):

  1. 我说的是什么/打字,不是我的意思
  2. 毫无疑问会遇到那些认为自己是语言专家的人,但只是搞得一团糟(例如,坚持删除评论/未使用的局部变量的人会加快程序的执行时间)
  3. 除非语言过时,否则它可能会继续发展(无论是实际的语言,还是有效使用它的概念),要求你积极开发,以免落后。
  4. 无法修改词法分析器/编译器(添加自己的上下文敏感语法)
  5. 没有完美的语言(每种语言都缺少一些有用的功能,通常要么无法模拟,不可避免地会有一个丑陋的界面,或只是需要太多的时间来实现并使其正确)

nnihil

赞同来自:

我会按照自己喜欢的方式做PHP,Python会做得太多。

  • 没有命名空间;一切都在 是一种非常大的命名空间 地狱在更大的环境中
  • 缺乏标准 函数:数组函数取一个 针作为第一个参数,干草堆 作为第二个(见array_search)。 字符串函数经常采用 干草堆第一,针第二(见 strpos)。其他功能只是 使用不同的命名方案: bin2hexstrtolowercal_to_jd 有些功能有奇怪的回报 正常的价值观:这个 强迫你拥有第三个变量 在PHP的时候宣布无处可去 可以有效地解释一个空的 数组为false类型 戏法。几乎没有其他 功能相同。
    $var = preg_match_all('/regexp/', $str, $ret);
    echo $var; //outputs the number of matches 
    print_r($ret); //outputs the matches as an array
    
  • 语言(直到PHP6)完成它 最好尊重近乎迟钝的人 向后兼容,制作它 带有不良做法和功能 在不需要的时候(见 mysql_escape_string vs. mysql_real_escape_string)。
  • 语言是从一个演变而来的 模板语言 全后端的。这意味着任何人 可以随时输出任何东西, 它被滥用了。你结束了 用于模板的模板引擎 语言...
  • 导入文件很糟糕。您 有4种不同的方法来做到这一点 (include,include_once,require, require_once),它们都很慢, 非常慢。实际上整个 语言很慢。至少,漂亮 比python慢​​(即使有一个 框架)和RoR来自我 聚集。
不过我还是喜欢PHP。这是网络开发的链锯:你想要一个真正快速完成的中小型网站,并确保任何人都可以托管它(虽然配置可能不同)? PHP就在那里,它无处不在,只需5分钟即可安装完整的LAMP或WAMP堆栈。好吧,我现在要回Python了......

qea

赞同来自:

Delphi(又名Object Pascal),我将谈论本机版本,而不是.NET。

  • Var blocks!
  • 语言中的接口在设计时考虑了COM的使用 - 因此比C#或Java中的更复杂。即。除非您明确禁用引用计数,否则引用计数。
  • 没有try except finally end;
  • 对象创建过于明确:
    var obj: TMyObject;
    ...
    obj := TMyObject.Create;
    try
      ...
    finally
      obj.Free;
    end;
    
而是像
auto obj: TMyObject; // compiler adds the default constructor call and the destructor call in a try/finally block. 
  • 好的,语言非常好,我真的不能再这么想了,所以我在推动自己:像字符串,整数......或枚举这样的内置类型更好的方法。即。 i.ToString而不是IntToStr(i)

cea

赞同来自:

VBA(包括MS Office IDE): 1)文档不佳
  2)差错误信息
  3)阵列操作例程不足
  4)必须重复DIM语句的类型
  5)不会打印颜色(必须购买第三方插件)

cea

赞同来自:

Objective-C的 1)没有命名空间,只是手动命名约定 - 我不介意在类分离方面,但我确实错过了能够在一行中导入命名空间中的所有类定义(如import com.me.somelibrary。 *)。 2)图书馆在RegEx支持等重要领域仍然存在一些漏洞。 3)属性语法有点笨拙,需要三行(在两个单独的文件中)来声明属性。 4)我喜欢保留/释放模型,但它比释放引用更容易,然后意外地使用它。 5)虽然不是真正的语言功能,但Xcode与Objective-C的使用密切相关,我不禁想到这方面......基本上自动完成,非常不确定。它更像是一个奖励你找到你想要的东西的系统,然后把它作为一个选择。但后来我想我从来没有喜欢自动完成引擎。

wmagni

赞同来自:

经过一番思考后重写了这个...... 我讨厌PHP的五件事虽然我喜欢它(没有特别的顺序):

  • 内置函数中的命名和参数顺序不一致。
  • 由于SPL而面向对象的数组方法,但遗憾的是没有字符串(还)。
  • PHP本身没有真正的并发性,只能通过托管Web服务器多处理
  • 没有像JavaScript中那样的异步调用
  • 仅通过扩展程序进行操作码缓存。不是很糟糕,但只是讨厌。
这些是惹恼我的语言特征(或缺乏),但更大的问题是这些更多的人/社区相关的事情:
  1. 许多使用PHP的人对一般的编程和良好实践一无所知并且产生非常混乱的代码。 JavaScript也存在同样的问题。
  2. 教授真正糟糕的做法和风格的大量教程/书籍。这可能是#3的主要原因。
  3. 它的声誉很差,主要是因为#3和#4。

kodit

赞同来自:

蟒蛇:

  1. Global Interpreter Lock - 处理此问题会使并行处理变得复杂。
  2. Lambdas的功能有点笨重。
  3. 没有内置的有序词典类型。
  4. 根据Python的编译方式,它可以使用UCS-2和UCS-4进行内部Unicode编码,对于超出默认宽度的多字节字符,许多字符串运算符和迭代器可能会产生意外结果。字符串切片和迭代取决于位宽,而不是检查和计算字符。 (大多数其他编程语言也做类似的事情,并且对这些字符也有类似的奇怪行为。)
  5. 围绕Python的GUI框架存在不一致。

ueaque

赞同来自:

我有一本书在SNOBOL中探索各种项目。第一章探讨了围绕SNOBOL编程和语言的历史和文化,并花了一些时间来讨论一个优秀的程序员喜欢一种语言而不是因为它的缺陷,而是尽管它们。 我最喜欢的语言是Icon / Unicon。但仍有一些事情让我烦恼:

  1. 它并不为人所熟知,也不是很受欢迎。
  2. 与PHP,Perl,Java等相比,它有一个更小的库。数据库访问是通过ODBC完成的,实际上非常烦人。
  3. 对于所有其他优秀的列表处理,我想念PHP的内置explode()implode()
  4. 它没有表常量。列表,是的,表格,没有。
  5. 这是一种编译(实际翻译)的语言。

tiure

赞同来自:

C#中缺少预处理器。 我知道他们把它遗弃了,因为有些人可能会滥用它,但我认为他们把婴儿扔出洗澡水。代码生成被认为是一件好事,在C++中,预处理器是我的第一行代码生成器。

wqui

赞同来自:

红宝石:

  • 重要的空白。对于解释器,行尾=语句结束,除非看起来语句应该继续(或者你明确地转义换行符)。
  • 在线文档不如Python(在辩护中,Python非常好)
  • 我提到慢吗?

wrerum

赞同来自:

Haskell(具有所有GHC扩展,而不仅仅是基本的Haskell'98规范)。 我讨厌的只有一件事:它不是主流。

hrerum

赞同来自:

C++:

  • 缺乏象征意义的进口。
  • 过度痴迷C兼容性。
  • 非常复杂的预处理器。
  • 模板错误几乎无法理解。
  • 没有垃圾收集。

kalias

赞同来自:

Java的:

  • 没有程序编码,它编译成程序代码,所以让我使用它!
  • 没有多重继承,尝试用15,000个接口做同样的事情。
  • 日期类,我是否需要说更多。
  • 我不能完全使用多态性。 Java不会覆盖要触发的不同参数类型。
  • 我想不出第五个原因,如果我回来编辑这篇文章。

ket

赞同来自:

C:

  • 缺少功能指针(可执行文件)和数据指针之间的区别(你真的不想执行它)。
  • 极端不可读性。使代码看起来像它所做的那样,比首先执行任务更难以达到数量级。
  • 缺乏对lisp-think的明确支持。几乎没有做功能性的事情,但目前尚不清楚。
  • 库之间关于如何返回错误代码的严重不一致。
  • 过时的字符串处理。字符串不是字符串,它们是以空值终止的blob。这是各种令人畏惧的方式。
Lisp的:
  • ()涉及按下shift键。每次我做很多lisp时,我都会交换它和[]。

wearum

赞同来自:

JavaScript的:

  • 可以修改Object原型。程序中的每个对象都会获得新的属性,而且可能会中断。
  • 所有对象都是哈希映射,但很难安全地使用它们。特别是,如果您的某个密钥碰巧是__proto__,那么您就遇到了麻烦。
  • 功能参考时没有对象关闭。实际上,根本没有对象闭包 - 相反,只要使用对象表示法或new运算符调用函数,就会设置this。导致很多混乱,特别是在创建事件回调时,因为this未设置为程序员所期望的。
    • 推论:调用没有对象表示法的函数或new运算符会导致this被设置为等于全局对象,从而导致严重破坏。
  • 加载运算符重载也执行字符串连接,尽管两个操作根本不同。当您期望成为数字的值实际上是一个字符串时,会导致痛苦。
  • ==!=运算符执行类型强制。不同类型之间的比较涉及一系列规则,凡凡人都无法完全记住。这可以通过===!==运算符的存在来缓解。
  • nullundefined都存在,具有微妙的不同但冗余的含义。为什么?
  • 设置原型链的奇怪语法。
  • parseInt(s)需要一个C风格的数字,因此将前导零的值视为八进制等。您至少可以parseInt(s, 10),但默认行为令人困惑。
  • 无块范围。
  • 可以多次声明同一个变量。
  • 可以使用变量而不声明它,在这种情况下它是全局的,可能会破坏你的程序。
  • with { }
  • 使用JavaDoc工具非常难以记录。

uid

赞同来自:

EL - 表达式语言,JSP页面中的${...}#{...},以及用于从底层Java代码中提取数据的JSF 2.0 Facelets。

  • 所有有趣的事情,例如带参数的方法调用和基于注释的命名仅存在于Java EE 6中的EL中,该版本仅在Glassfish v3中可用。
  • 1)为早期的Servlet 2.5容器获取正确的罐子,以及2)让它们工作而不干扰容器中任何先前的实现,这是一种皇家的痛苦。
  • 只有像1.2这样的早期版本的JSF,取消了方法调用并让你使用f:setPropertyActionListener - http://weblogs.java.net/blog/2009/07/22/say-sayonara-spal - 相信我,这不是很好。
  • EL解析器不知道解析和解释的片段来自哪里,因此您倾向于将所有内容都设为id,这样您至少可以识别哪个标记使其变得脾气暴躁。
  • Eclipse在每次EL方法调用时都会发出警告,因为它是JSF 1.2。也是。

wsed

赞同来自:

我可以为Python添加另一个: 给定一个列表l = [l1, l2, ..., ln],然后是repr(l) = [repr(l1), repr(l2), ..., repr(ln)],但是str(l) != [str(l1), str(l2), ..., str(ln)] (str(l) = repr(l))。这是因为l = ["foo], [bar,", "],["]列表中可能存在模糊的条目,而str(l)会返回“可能会混淆用户”的"[foo], [bar, ], []"。但是,这使得str无法用于转储数据,因为列表会以“可读格式”转储“只转储数据”。 Augh!

wab

赞同来自:

C

  1. 没有参数多态(即C++模板)。它使得编写可重用的数据结构和算法变得很麻烦(并且几乎没有任何静态检查)。例如,参见qsort和bsearch的比较器参数:比较器获取无效指针:(
  2. 没有数据结构库。我真的很讨厌写自己的哈希表。我也非常讨厌在网上搜索可重用数据结构库。特别是如果它变得不完整。
  3. 字符串。表示效率低下,如果你理智,那么笨重,太难以安全地输入一个字符串。 snprintf没有标准。使用sprintf创建格式字符串太困难了,然后使用它以安全的方式再次创建一个包含sprintf的字符串。
  4. 只有词汇宏。如果不同的编译器期望在不同的地方使用函数注释,我必须将相同的HAS_NO_SIDE_EFFECTS放在不同的位置。为什么我不能只是抓住函数,切换编译器类型,然后通过宏调用将它插入到正确的位置?
  5. 没有用于常见功能的可移植库。对于套接字和线程,我使用SDL ---一个frigging游戏库。对于.ini风格的解析器,我能找到的唯一一个为ubuntu打包的库,我在每日wtf上发布(它计算一个哈希值数组,然后通过它进行线性扫描......)
C++
  1. 模板语法很重且很不合适。我们来看看,for(map<string, int>::const_iterator it = mymap.begin(); it != mymap.end(); ++it)
  2. STL中的设计错误。您的向量的分配策略是否真的会改变其类型?
  3. 过于复杂的类型系统。类型T1具有convert-to-T2方法,T2具有隐式的from-T1构造函数。这就是所谓的?重载,覆盖和多重继承如何交互?不好,我猜......
  4. 来自模板的令人难以置信的长而笨重的错误消息。你知道我的意思......
  5. 引用表示您无法在呼叫站点查看输出参数。在C中,您可以猜出foo(bar, &baz)可以修改哪些内容。

podio

赞同来自:

JavaScript的;

  1. 如果您不确切知道自己在做什么,那么“this”的动态绑定会非常混乱和危险。
  2. 函数声明需要关键字“function”。这不是我反对的打字,当我想做一些稍微聪明的事情时,就是读它。 Hrm现在我想起来也许这是一个加号。劝阻我做一些聪明的事情。
  3. 作为数字2的结果,复制/粘贴代码段的代码(就字符而言)通常少于将其声明为函数,如果它是一个相当短的习语。不幸的是,这促进了不良做法,特别是在我自己的代码中。
  4. Javascript通过使用第一类函数和闭包来使动作成为一种函数式语言,但是无论是在运行时还是在编译时,都无法验证函数中的引用透明性。如果没有这个,一些架构会变得冒险或笨重。
  5. 它声名狼借,因此我无法在没有被人嘲笑的情况下向任何人说“我用javascript编程”。

kesse

赞同来自:

MEL(Maya表达语言):

  • 单维数组:强制我手动同步两个或多个列表,或使用分隔字符串来模拟更复杂的数据结构。当然,它们也是不变的。
  • 单线程和慢速:导致整个Maya应用程序在完成任务时挂起。奖励分为无法杀死长时间操作,而是必须关闭并重新打开Maya。
  • 脚本源路径不是递归的:意味着您要存储脚本的每个目录都必须添加到脚本路径中。
  • 无名称空间:强制不一致地使用命名约定以确保全局过程不会发生冲突。
  • 模态命令:每个命令都是模态的,这意味着创建,修改和查询操作都是通过设置标志来处理的。这也迫使开发人员使大多数命令返回数组
  • 命令样式不一致:大多数数组命令实际上返回数组,但Tokenize命令必须将数组作为引用然后填充,而不是吐出数组。这有其他不一致之处。
这些以及其他几个原因是AutoDesk采用Python作为第二种脚本语言的原因,它带来了一些令人讨厌的因素:
  • 并非所有MEL命令都受支持:大多数都是,但是你不时会发现自己必须使用mel()函数来执行一些任意代码。更糟糕的是你必须做的所有令人讨厌的逃避。
  • 继承了模态命令样式:必须使用相同的create = True,query = True,edit = True stuff。

nvelit

赞同来自:

第一篇文章,所以在我身上放轻松:) ...真棒社区网站,顺便说一句! 我尝试阅读所有其他C#回复,以便我不重叠 C#...没有特别的顺序: 1)对于switch语句中的情况没有任何影响。如果没有通过...为什么必须明确键入break;无论如何?它只是迟钝和混乱,因为它意味着没有休息的能力; !!! 2)不能在子作用域中声明具有相同名称的变量,但是您可以使用与类变量相同的名称声明变量吗?允许两者兼有或不允许两者。否则,它没有意义。 3)功能中没有可选/默认参数 4)finally {}中的异常应该为每一行隐式捕获。或者至少,只是NullReferenceException异常。例如,在访问数据库之后,应该始终清理数据库。所以,finally块看起来应该是这样的:

finally
{
  if(par1 != null)
    par1.Dispose();
  if(comm != null)
    comm.Dispose();
  if(conn != null)
    conn.Dispose();
}
如果可以写成:
finally
{
    par1.Dispose();
    comm.Dispose();
    conn.Dispose();
}
但是,不...你必须检查你是否正在访问一个null对象,否则它可能会从finally块中抛出一个NullReferenceException ..并且最终块中谁真的需要异常? 5)泛型:您可以指定new()以便能够实例化您的通用对象,但该对象需要具有默认构造函数。为什么你不能指定一个签名,所以如果它没有它们就不需要创建空构造函数,只需使用它所拥有的构造函数。

kex

赞同来自:

这里对C++的另一次投票......仍然是我最喜欢的几个密切关注者--C和Python。这是我目前的仇恨列表,没有特别的顺序:

  • 从C继承的大量整数类型 - 由签名错误和无符号错误引起的问题太多
  • 复制构造函数和赋值运算符 - 为什么编译器不能自动从另一个创建一个?
  • 变量参数疯狂 - va_list只是不能与对象一起工作,我对使用sprintf(),snprintf(),vsnprintf()及其所有亲属创建的问题感到厌烦。
  • 模板实现需要在编译时完全可见 - 我在考虑缺少“导出”实现或至少可用的实现
  • 缺乏对属性的支持 - 我希望有一个像“a.x”这样的只读成员,可以公开阅读,只在内部分配。我真的很讨厌“val = obj.getX()”和“obj.setX(val)”。我真的想要具有访问控制和一致语法的属性。

uut

赞同来自:

蟒蛇

  • __init__
  • 有些库很尴尬,比如smtplib
  • 'self'必须在方法声明中!!!
  • (对于3.0之前的版本)有点差的unicode支持
  • 缺乏内联try-catch
  • 没有直接引用“this”/当前模块(而是必须使用sys.modules[__name__])

in_id

赞同来自:

C#

  • 通用参数不变 C#4.0引入了泛型类型的协方差和逆变
  • 必须明确将可覆盖的类成员标记为虚拟
Java的
  • 缺少无符号数字数据类型
  • 原始数据类型不是对象

kex

赞同来自:

我知道我迟到了,但仇恨是永恒的! 爪哇

  • 的Runtime.exec()。那么,如果我不手动清除STDOUT和STDERR缓冲区,我的代码会挂起吗?哇。死,PLZ。
  • 空指针异常。负责任的编程意味着我必须对待大多数对象,例如它们是未爆炸的炸弹,这是一种面向对象语言的pisser。当不可避免的事情发生时,我有点需要知道哪个物体在我脸上爆炸,但是Java显然觉得它会让我作弊。
  • 文件I / O.为什么我要跳过这么多箍来阅读dang文本文件?在复制文件时,我必须将源文件汇集到我的代码中并手动处理输出字节缓冲区?你认真吗?
  • 原始与原始包装。请注意,Java现在具有许多功能,允许您将原语及其包装器对象视为在某些地方可互换,但在其他地方则不可;别担心,编译器会告诉你哪个是哪个。这对于从根本上进行设计决策的工作感觉就像是一个黑客。它是。 (编辑:实际上,编译器比我想象的更安全,特别是在进行相等检查时。如果`a`和`b`是整数,`a == b`保证只有在其中至少有一个是输入`int`。如果它们都是`Integer`类型,那么只有当两个数字介于-128和127之间时,该语句才能执行您的想法.`Integer a = 1000; Integer b = 1000; return a == b;`将返回`false`。真的。)
  • XML。我有这个简单的小XML文件,我需要创建,我必须做什么?

raut

赞同来自:

VBA(因为你认为你的语言不好)

  1. 一条线内的空白是严格的 执行。
  2. 语句结束,并要求“_”分隔到下一行, 但不是每条线都可以被打破。
  3. 没有++, - ,+ =, - =陈述。真的吗?
  4. 数组可以从任何索引开始,而不仅仅是0.
  5. 某些类型(即:定点“十进制”值)必须是Variant的子类型,并且不能作为自己的类型使用。
  6. !=和<>。
  7. “=”用作比较器和分配,而不是分成“=”和“==”。
  8. “Option Explicit”。
  9. 自2000年以来,UI尚未更新。
  10. Office2k7未升级到VB.NET
  11. 大多数对象模型都是非感性的,过于冗长。

fillum

赞同来自:

Ruby有许多与其速度相关的缺陷,但我不讨厌这些。它也有社区传福音过火的缺陷,但这并没有真正困扰我。这些是我讨厌的:

  • 闭包(块)有4种不同的创建语法,但它们都不是最佳的。优雅的语法是不完整的,并且与哈希模糊不清,完整的语法很难看。
  • 社区倾向于反对真正的文档,倾向于“阅读代码”。我觉得这很幼稚和懒惰。
  • 元编程滥用,特别是在图书馆中,使得bug成为追踪的噩梦。
  • 在相关的说明中,普遍的元编程使得全面的IDE很难(如果不是不可能的话)制作出来。
  • 块传递给函数的方式是愚蠢的。没有理由在参数列表之外传递块,或者具有奇特的特殊语法来访问(yield)。我认为块应该被赋予一个不那么模糊的语法(或者哈希可以使用不同的分隔符;可能是<>而不是{}),并且作为参数传递给方法应该像所有其他参数一样。
    object.method(1, {|a| a.bar}, "blah")
    
    这些奇怪的东西,比如块必须是传递的最后一个参数,并且传递多个块是不同的,语法较长,真的很烦我。

ncum

赞同来自:

Erlang不在此列表中。在我最喜欢的语言中,但肯定有一些缺陷:

  • 语法。这包括3个终止令牌(,;。)和美学,但更一般地说,如何在文本中表达代码的语义。一个例子是关于所有小写标记是如何原子的,所以要引用一个你不能只命名它的函数,你需要fun my_function/1?PRECEDE_CONSTANTS_WITH_QUESTION_MARKS。来自Scheme,Haskell等,您只希望使用名称。
  • 图书馆支持很蹩脚。这主要是外部库,但即使是旧的标准库。较新版本的Erlang具有合理的POSIX正则表达式,但旧的版本有一个非常可怕的基本字符串操作库。您也永远不知道何时获得该值,或者{ok, Value}
  • 相关:非均匀的建筑和分销工具。 Ruby有gemrake,RSpec。 Perl有CPAN。我不知道Erlang中的等价物。
  • 少数Erlang特定工具非常奇怪。 Mnesia是一个很棒的数据库,但是来自SQL,你有很多值得学习的东西。与文档@spec相同,后者有一种描述签名的奇怪方式。
  • 当你只想要一点点变异时,功能范例通常会受到伤害。假设你想要一个哈希表,你不能像在Scheme或SML中那样破解它。 etsdets缓解了一些痛苦,但并不多。
第六,奖金:
  • 模块的导入和导出语法是一堆失败,与Java的80多行import语句不同。
所有这一切,Erlang是一种快乐^ _ ^

ueos

赞同来自:

红宝石。

  1. 奇怪的范围规则 - 变量,常量和方法各自的行为不同。规则也会根据您用于创建闭包的关键字而更改。或者你是在一个阶级,特征类,对象,模块或模块的自我。然后是instance_eval,它将规则更改为一组不同的规则。当模块被“包含”或“扩展”时,它们会再次发生变化,这些模块本身在范围上做了不同的事情。并且元编程无法模拟一些规则集,因此您必须使用eval。除非你使用ruby 1.9,否则所有这些都不同。
  2. 命名空间基本没用。如果你有Foo :: File,那么stdlib文件可能会被所有Foo破坏。
  3. require语句已损坏。如果两个文件彼此需要,那么这些文件的行为可能会发生很大变化,具体取决于首先从其他地方加载的文件。
  4. 库会显着地突然更改API,因此您必须要求所有依赖项的特定次要修订版本号。对于系统上的每个ruby应用程序。
  5. ruby​​gems软件包系统会覆盖“require”而不是将文件放在搜索路径中 - 因为为什么在可以替换它时使用系统?

aut_ea

赞同来自:

因为我不能真正全时使用它,所以我要出去了,但无论如何我都会尝试! Perl 6

  1. func(“frew”)!= func(“frew”)
    • 这让我很烦,但是有充分的理由。在Perl 5中,print(5 + 6)* 10仍然偶尔得到我
  2. 在许多地方解析可能比Perl 5更容易,但有时它仍会杀死我的编辑
  3. 它仍然有很多线路噪音Perl 5让很多人感到害怕。这意味着让他们兴奋等等更难。
  4. 还没有图书馆。
    • 如果Perl 6确实最终支持Perl 5,那么这将是一个非问题,但这可能是一个不值得承担的负担。
  5. 没有REPL,或者rubyists会称之为irb。
    • 具有标签完成,颜色编码等的可靠的交互式Perl 6将使得使用和学习它更加美好。
  6. 目前documentation基本上是英文规格。不太容易阅读。
  7. 我知道这是一个愚蠢的陈词滥调,但它还没有出来!
    • (我可以投诉,因为我正在帮助:-P)
前三个是语言;其余的不是真正的语言本身,而是它尚未出现的事实。

eenim

赞同来自:

内容太长未翻译

psunt

赞同来自:

Perl 5的更多内容,从创建了大量Perl模块的人的角度出发,特别是在Moose上工作。

  1. 超载和绑定变量的可怕破碎。这两个功能都是尝试允许透明扩展内置类型的尝试失败。 它们都以各种方式失败,并要求像我这样的模块作者要么实现可怕的黑客来支持它们,要么说“永远不要将重载的对象传递给foo()方法”。这两种选择都不是真的可以接受。
  2. 缺少适当的钩子进入编译过程和元模型。如果Perl核心允许我们通过一个允许我们挂钩到元模型(包,类等)的合理API来影响编译过程,那么一般来说Moose,特别是角色使用可以变得更安全。 LI>
  3. 语言中缺少命名参数。相反,每个人都重新改造。这太烦人了。
  4. 同样,缺少可选类型。我不想要静态语言,但是指定类型和约束的能力,特别是函数/方法参数,将是很好的。 Perl 6做对了。类型是可选的,但非常丰富,内置和用户定义类型之间没有根本区别。
  5. 向后兼容警察。这更像是一个文化问题。由于Perl 5对向后兼容性的强烈承诺,因此上述一些问题永远无法解决。因此,即使要添加某些东西,有效地取代当前的捆绑和重载球,这些功能也永远不会被删除。当然,向后兼容性也是Perl 5的最大优势之一。
  6. Bonus hate:Perl的内置异常机制是一个笑话。异常可能是一个字符串或对象这一事实使得代码异常繁琐,并且语言语法中缺少一个问题就是疣上的疣。

nomnis

赞同来自:

C是我的最爱,但它也很可怕。

  • 它拥有最糟糕的预处理器。为什么他们不使用像m4这样的东西?
  • 整个标头与源文件 模特坏了。帕斯卡做对了 与单位。
  • 需要案例范围 switch语句。
  • 来自void *的工会和演员破坏了类型系统。这使得垃圾收集器变得不可能。
  • 没有嵌套函数。 GNU C有这个,但它应该是标准的。
  • 没有边界检查分配的内存。有些工具可以发现这一点但是 他们不会检测到一段代码错误计算地址和写入的错误 到一个完全没有关系的分配区域。我讨厌整个指针 算术。
  • 没有边界检查数组。
  • 关于可移植性的问题太多了。甚至wchar_t也因平台而异。

psunt

赞同来自:

C# 5.空合并运算符 ?? ??运算符允许你写:
x = y ?? z;
代替:
x = (y == null) ? y : z;
我喜欢这个运算符,但我想要另一个运算符:
x = y ??? y.foo() : z.foo();
代替
x = (y == null) ? y.foo() : z.foo();
我一直都在使用这种东西,我觉得输入== null部分很烦人。
4.平等应得到更好的支持 我必须使用以下命令启动每个Equals(object obj)方法:     MyClass other = obj as MyClass;     if(other == null)返回false; 你应该只写:
public override bool Equals(MyClass other) {...}
语言应该注意提供Equals(object obj)方法。
注意:其他应保证不为空。
3.不能使用不同类型的三元运算符 这不编译,我认为应该!
string foo = "hello";
int bar = 4;
object baz = foo == null ? foo : bar;

2.缺少名称空间私有 我喜欢internal保护,但我希望有一个保护,它只允许从同一个完全命名空间内进行访问。这样可以更好地控制大型类库中的访问。
1.没有多重继承 我实际上只对接口的默认实现使用实现(类)继承,但是有很多次我想要这样做。

eos_et

赞同来自:

的ColdFusion
  1. 编译大型Flash表单的时间。
  2. 动态变量类型(有时我讨厌它们。)
  3. CFScript缺乏功能。
  4. CFTable(永远无法让它显示正确)。
  5. CFChart缺少图表类型。
  6. 完全缺乏NTLM支持(企业就绪 - 是的)#/ li>
  7. CFC中的Moronic var范围
  8. 没有真正的NULL概念 - 你的变量就消失了!
  9. 无法测试某些事物的存在(如范围,只是其中的成员)

eet

赞同来自:

我自己的前5名“我真的很讨厌c ++”: [5]自动生成构造函数,析构函数和赋值运算符。伙计,每当我不在课堂上宣布某些内容时,这意味着我不需要它,而不是我忘记它。你,编译器,听到我吗?! [4]模板语法。哦,我真的需要输入所有这些“<”和“>”,每当我决定从课堂体中提取定义时? [3]字符串。 Jeez,我厌倦了“const char ”,我必须处理NULL情况,我必须浪费O(N)来获取它的长度,我必须为concat操作分配一个缓冲区。 [2]宏观处理。每当我不明白,我的编译器发生了什么,我就开始寻找一个宏。 [1]运算符重载。我看到代码“A + B C”,我不能说出这段代码是什么,直到我看到A,B和C的实际类型。

xsed

赞同来自:

Objective-C / Cocoa / Cocoa Touch:

  • 缺少名称空间
  • 使用Cocoa的任何有趣且强大的技术使用原始值的困难,例如,分布式对象,通知,KVO
  • 使用快捷点语法访问属性不一致,通常不得不使用全长访问者
  • iPhone上没有GC,而且一般情况下GC对于一种高度动态的语言来说已经很晚了
  • 不一致的图书馆支持,至少在Cocoa Touch中;一些非常基本的东西最近才得到高水平的支持,例如音频处理。
  • 缺少积木!

phic

赞同来自:

C# 1)缺乏为值类型编写泛型的实际能力。例如,任何白痴(大多数白痴)都可以编写一个例程来计算C++中int,float,double等列表的标准偏差,它编写简单,易于阅读并执行快速非通用代码。我想如果你能用C#写一些接近于击中这3个中任何一个的东西,而不是另外2个荒谬,你就是一个非常优秀的程序员。 2)协方差和反演方差,虽然这被添加到4。 3)LINQ的文档极差(好吧,不是语言的真正部分)。 4)当我想每次都做同样的事情时,尝试使用foreach / iterators,除了上次稍微不同的东西(例如在它们之间连接一串字符串和字符之间以及最后两个之间的逗号)。如果我用IEnumerable编写它,那么很难写入和读取,并且使用for(int i = 0 i< ...)它不是更好而且效率更低。 5)我知道我会对此抱怨,但缺少经过检查的例外情况。这不需要像在java中那样实现(框架开发人员确实对他们为什么不这样做做了一些非常好的观点),但我会很高兴编译器警告那些不喜欢检查异常的用户可以关掉。

mnam

赞同来自:

昆雅 •社区太小。当附近找不到另一个演讲者时,几乎不可能有一个好的语言浸入式课程。
• 不规则动词。是的,我知道英语和西班牙语也提到了它们,但Quenya是发明的。为什么还需要不规则的动词?
•没有Unicode支持。在我可以阅读大多数消息之前,我必须在我的计算机上安装三种不同的Tengwar字体,其中一些字符很难被修改。考虑到存在罗马化的转录,这不会是一个巨大的问题,但Tengwar是如此美丽,你不想使用它。
•并非所有概念都可以在昆雅语中轻易引用,导致烦人的迂回曲折,或诉诸Sindarin,Númenórean或(Manwë救救我)Klingon来表达我的观点。

xminus

赞同来自:

HyperTalk:
  • 很久以前死了
  • 没有简单的作业(你不能只说a := 3,你必须说put 3 into a
  • 没有嵌套函数
  • 没有真正的数据结构,只有字符串。要制作“列表”,您可以使用itemDelimiter分隔项目并手动转义它们。您还可以获得get word 2 of line 5 of txt
  • 等行和单词
另外,我认为HyperTalk独有的最酷功能之一是特殊的it变量:
ask "How many years old are you?"
answer "You are " & it*12 & " months old."

et_id

赞同来自:

JavaScript的

  1. 数字作为字符串 - 数学可以 数字是令人沮丧的 解释为字符串。 5 + 2 = 52? 哎呀...
  2. 权限 - 所有最好的东西都需要用户的许可!
  3. 屏幕更新 - 浏览器必须处于稳定状态才能更新屏幕。似乎没有办法强制屏幕在脚本中间更新。
  4. 慢 - 虽然谷歌的Chrome很不错......
  5. 浏览器差异使得使用语言a [censored]。

mid

赞同来自:

VB6

  1. 仅限Windows。
  2. 不再支持。
  3. 数组可以从任意数字开始,而不是全部被标准化为0。
  4. 编译的应用程序依赖于许多dll才能正常运行。
  5. 许多复杂的控件(如浏览器控件或复杂的代码段)在运行未编译的代码时往往会破坏IDE,但在编译时工作正常。

pnon

赞同来自:

蟒蛇:

  • 您通常在文件末尾有程序的入口点。 (因为如果它调用模块中定义的任何函数,它必须在源中的那些函数之后发生。) 当你不得不花时间寻找程序的入口点时,我讨厌它,所以我总是有一个简单的main.py文件:
    def main():
        ...
    if __name__ == '__main__':
        main()
    
  • 当引发异常时,它只能被主线程捕获。 或类似的东西。
  • 析构函数毫无用处,因为用Python编写它们可能会破坏垃圾收集IIRC。
  • 我从未弄清楚相对导入在Python 2中是如何工作的。
  • 我想在标准库中看到更多的集合。 例如:链接列表,线程安全集合,......

zcum

赞同来自:

蟒蛇

  • lambdas中没有任何陈述。 GRRRR
  • foo( a for b in c if d )感觉不对,每次我逃脱它都会让我感到惊讶。不应该是foo( (a for b in c if d) )吗?
  • 我可以理解一下吗?
  • map和filter运算符在列表推导中有特殊的语法,如何减少?还是排序?
  • 只需在其中包含yield语句,就可以将函数神奇地转换为生成器,并且其界面完全更改。此外,该生成器在第一个next()之前无法执行任何操作。至少,并非没有使用返回生成器的函数。
JavaScript的
  • 没有制作模块化代码库的简短语法。您必须调用一个返回公共方法字典的函数。每次更改模块的界面时,您必须在(至少)两个位置编辑它。
  • 创建闭包涉及从一个函数返回它,该函数从('sup dog)yo'函数返回一个函数。杂波!
  • for each ( foo )语法和行为感觉像是事后的想法。
  • 知道你的代码实际运行的时间(以及以什么顺序)更像是一种黑暗的艺术。确保正确行事的唯一方法是将所有内容(是的,也是如此)放在一个大文件中。即便如此,你仍然需要等待document.onload
  • 我错过了什么吗?有没有简单的方法来获取json序列化值而不用手工构建它们? (是的jQuery可以做到这一点,有点)。

vet

赞同来自:

PHP

  • 几乎所有标准功能都在全球范围内
  • 函数参数顺序不一致
  • 功能命名不一致
  • 不区分大小写的函数
  • 脚本的行为可能会有所不同,具体取决于php.ini文件
  • 能够使用未定义的变量
  • 在某些情况下,必须先将结果分配给变量才能在函数中使用
更主观地说:
  • 动态打字

gipsam

赞同来自:

我讨厌C++的五件事

  • 链接时间。使用分布式构建,我可以在我们的链接器运行的同时重建整个项目。
  • 没有标准方法可以防止重新排序内存操作。使用写组合内存通常需要滥用volatile关键字。防止读取重新排序(通常对于处理SIMD数学流水线时的优化至关重要)通常是通过在例程中注入空ASM块来实现的。
  • 解决字符串化问题的多步宏:
#define STR_LINE2(x) #x
#define STR_LINE(x)   STR_LINE2(x)
#define LINE_NUMBER STR_LINE(__LINE__)
  • 进行字符串操作通常很痛苦。
  • 非标准化printf变种的扩散(vsnprintf_s vs _vsnprintf_s)。

sed_et

赞同来自:

Haskell中。
  1. 默认情况下会导入Prelude。
  2. 类型类的范围是通用的。
  3. 模块不是一流的。
  4. 类型不能依赖于值。
  5. Monad不与Functor统一。

fearum

赞同来自:

BrainF * CK

  • 你的亮点是你图灵完成了吗?!我可以在Perl正则表达式中做更多的事情!
  • 缺少物品。来吧,人们!就像,你好......
  • 没有网络库。我想要的只是刮一个网页,GOSH。
  • 没有一流的功能。恭喜 - 您要与您的Java好友保持同情。
  • 用于存储的无限磁带,没有别的。这非常自命不凡,我们不妨写Lisp。

xet

赞同来自:

VB.NET

  • 行为AndAlso / OrElseAnd / Or似乎倒退了。也许他们应该换掉。
  • When只能用于异常捕获。执行When条件的能力对于其他一些事情会很好。
  • VS IDE中没有friggin Refactoring(不是真正的语言错误)就像C#
  • 一样
  • Not <obj> Is Nothing。是的,IsNot已经解决了这个问题,但由于某种原因,我发现Not Is使用得太频繁了。 (对于那些会说英语作为第二语言的开发者来说,我更频繁地看到它,从这个角度来看它是否更有意义?)
  • ToString()和大多数功能都不需要()。 (导致草率的编码习惯)
  • 断线时必须执行_
  • 它允许可选参数。 (导致草率的编码习惯)
  • 声明数组由UpperBound完成,而不是由容量完成。 “Dim arr(2)as String” 实际上会持有3个元素。
  • =成为比较和赋值运算符。

aeius

赞同来自:

Java的:

  1. 非常不一致。
  2. 图形API有时候很难使用
  3. NullPointerExceptions不告诉你什么是null
  4. 我编写的程序有时不能在不同的JVM上工作,这是一个巨大的痛苦,与Java的“一次编写,随处运行”声明相矛盾。
  5. 摆动不是应该的那么好。

ut_sed

赞同来自:

PHP: 1)强迫我做出不必要的变量:

$parts = explode('|', $string);
$first = $parts[0];
2)Lambdas的实现如此蹩脚,它大致相当于使用eval(),所以我从未使用过它(我参考了http://www.php.net/create_function)。 3)一个try / catch系统,它只能捕获可能发生的大约80%的错误。 4)正则表达式支持与lambda支持一样蹩脚,因为它必须在常规字符串中编写,使得难以学习的编程工具之一难度大约是其三倍。 PHP应该是一种“简单”的语言?!?!? 5)无法在不写入两次或构建自己的函数或使用“@”运算符的情况下安全地从$ _POST中提取东西:
$x = isset($_POST['foo']['bar']) ? $_POST['foo']['bar'] : null;
6)奖金回答:'@'。如果您无法正确编写代码,只需添加“@”,对于之后需要调试代码的任何人来说都太糟糕了。

cnon

赞同来自:

LUA

  • 如果你做foo.bar(1,2)那么'self'在bar方法中是nil。你必须记得做foo:bar(1,2)。我宁愿切换(默认情况下应该定义'self',除非你使用':'运算符,或者你调用的函数不是方法)。
  • 默认情况下,变量是全局变量。我宁愿放弃'local'关键字,而是选择'全局'关键字。
  • 未声明的变量分配为nil。我宁愿收到错误信息。您可以通过操纵全局环境的metatable来回避这个问题,但我宁愿在默认情况下实现它并且能够将其停用。
  • 参数的多个返回值未得到很好的处理。假设你有一个函数foo()返回1,2,3(三个值),bar()返回4,5(两个值)。如果你打印(foo(),bar()),你将得到“1,4,5”...只有“最后”元组在通话中被扩展。
  • #(表长度)运算符仅适用于以连续整数索引的表。如果你的表不是那样,你想知道它有多少个元素,你需要用循环解析它,或者每次插入/删除一个元素时更新一个计数器。

qet

赞同来自:

C

  • 它非常灵活和强大,很容易编写非常糟糕的,或者彻头彻尾的危险代码(或者,如果你愿意的话,“以强大的力量来承担很大的责任”)。
  • '='用于赋值,'=='用于赋值;容易混淆'if'陈述。
  • 该语言的许多基本部分的实现依赖于编译器;例如基本类型的大小,位域中的位顺序,填充中的填充和字节顺序。
  • 位域不可参数(即你可以使用整数数组,但是你不能有一个位数组。)
  • 可以改进字符串处理。

gcum

赞同来自:

C#

  • 默认情况下,引用类型可以为空; in-language null关键字是无类型的。
  • 缺乏受歧视的工会
  • 默认情况下的异常,非异常错误处理方法 - 没有太多替代方法。
  • 古老的switch语句语法和限制
  • 不需要区分构造函数+静态方法
  • 静态方法不能是接口的一部分
  • 缺乏形状接口实现而不是显式接口实现 - 导致许多语言设计攻击,例如linq查询语法,foreach,collection&对象初始值设定项 - 没有一个可以灵活地重用。例如,对象初始化程序语法可能很好,但对不可变对象的效果很差。
  • 无法独立于实现继承类的“接口” - 导致代码重复和提供接口,抽象基类,一些常见实现的无法提供的代码,并且无法选择要使用的每个位。也;导致过多的代码紧密耦合到特定的实现,因为通常明确地引用实现类型而不是接口。
  • 由于类“interface”与它的实现紧密耦合,因此不能通过组合乘法继承;实际上缺乏混合物。
  • 接口的上述限制导致几乎相同的接口激增,这些接口在任何类型的层次结构中都不会自然重叠。 IComparableIEquatable对比IComparable<T>与object.Equals与运营商==等等。通过扩展,制作满足所有这些内容的自定义类型比必要的工作要多得多(特别是对于集合类)。显然,语言设计者意识到这一点,因此对于像linq,foreach和集合初始化器这样的东西的各种解决方法,它们都是按形状而不是通过接口工作。
  • 使用括号和括号的冗余,而不是layout-is-structure。
  • 可以忽略返回值,限制类型推断的有效性。
  • 枚举不是普通类型,也不能有方法。此外,枚举值不是类型安全的,并且可以初始化为0,尽管没有0值。通过将标志和非标志枚举结合在一起来混合隐喻。
  • 缺乏适当的价值类型支持。值类型不能被继承,具有不同的构造函数语义,并且由于CLR限制而表现不佳。此外,关于值类型的语义混乱:某些值实际上是值(并且不能被修改),而其他值实际上是非别名的非空引用(变量)。对于下一期问题,这一点尤其令人困惑:
  • 字段和属性之间的语义区别,特别是缺少可变性修饰符(ala C++的const)
  • 不能专门化仿制药
  • 无法提供默认的通用类型参数(例如工厂通用)
  • 缺少typedef使得泛型变得难以使用(using是一个有限但很有名的替代品!)
  • 不能对类型以外的内容进行泛型化(例如函数,普通值或名称)。这意味着你不能做一些事情,比如制作一个依赖属性的通用实现,导致一些令人讨厌的实现,例如依赖属性和过度使用代码片段以及结果可读性差的代码。
  • 指定通用类型要求的能力有限,例如通用求和方法,它接受int,double和bigint(没有棘手且通常很慢的黑客攻击)。
  • 接口方法实现或虚方法覆盖不能返回更具体的类型或接受更通用的类型;即使在C#4中也有限的共同/逆转支持。

nodio

赞同来自:

我在Nemerle怨恨的五件事:

  • 本地功能不能产生
  • 编译lambda的能力有时取决于它是否内联
  • 元组的值/引用类型语义不一致
  • 数组索引和类型参数之间偶尔存在歧义
  • 缺乏普遍采用

gnihil

赞同来自:

SAS

  • 从来没有自己的想法(每件事都是借来的)。
  • 贪婪的巨大数据集。
  • 使用Java,但从未学过什么是对象。
  • 窃取Perl,但将其隐藏在数据步骤中。
  • 总是和统计人员说谎!

iqui

赞同来自:

JavaScript的

  • 每个脚本都在一个全局“命名空间”中执行...在处理来自不同来源的脚本时你必须注意的事情
  • 如果使用了变量但尚未预先定义,则将其视为全局变量
  • 浏览器供应商按照自己的意愿制定标准,为使用这种美丽语言的开发人员编写代码而不是应该这样做
  • 区分大小写 - 考虑到没有合适的IDE用于使用编译时检查来开发js
  • 解决方法(例如使用hasOwnProperty方法)执行一些操作,否则操作简单。

uculpa

赞同来自:

我讨厌Java的五件事:

  • 没有一流的功能。
  • 没有类型推断。
  • 缺乏理智的默认设置,例如图片。
  • NullPointerException,不包含有关null的更多信息。
  • 无意义的“可配置”框架/服务提供者接口/工厂类/依赖注入系统的激增。几乎从不使用可配置性,严重违反DRY,代码大小翻了四倍,易读性减半。
我知道,我应该查看Scala。

uculpa

赞同来自:

不得不假设我们有一种语言。我们要不要?

dodit

赞同来自:

我简直不敢相信,我最喜欢的Python宠儿仍未被提及:

  1. (3.x之前)相对导入看起来像绝对导入。
    import foo
    
    这是从您所在的目录还是从sys.path导入foo?
  2. 拉链的鸡蛋,导致一个充满shite的sys.path。拉链蛋意味着您不能使用grepfind(除其他外调试问题1)!幸运的是,有点。使用pip。
  3. 部分电池是非智能的。它会使用它们。
  4. 可能是发行版和打包程序的错,但仍然是:sourcefile-encoding在安装/编译时设置为fscking ASCII。 WTF?意味着我必须在每一个.py中都使用“#coding:UTF-8” - 。
Py3k修复了我的其他几个烦恼,比如坚持认为字符串是unicode,8位的东西被区别对待......

qnon

赞同来自:

C# 厌倦了C#的头号宠物必须是: (1)事件对所有听众都有强烈的引用,从而防止收集任何听取事件的垃圾。如果你想看到问题,那么只能通过创建某种“弱引用事件处理程序”来尝试解决问题的所有人在网上搜索。 (2)在调用之前需要检查事件是否等于null似乎应该由语言处理。 (3)XML序列化程序无法在XML文件中读/写注释。在手动和使用C#编写的工具修改XML文件的环境中,这并不是很好。可以通过使用原始的XmlDocument来解决这个问题,但是能够将它抽象到类中更好。 (4)构建过程不允许您直接访问xsd文件之类的内容,而是需要一个创建C#分部类的中间步骤。这也会导致XAML文件出现问题,有时需要重建两次才能使更改正常进行。 (5)不支持MMX和SSE 1,2,3,4等CPU内在函数,因此在运行C#应用程序时,这些有价值的CPU功能未得到充分利用。 其他没有进入前5名的人: (6)无法将字段标记为属性,必须从get go显式实现所有属性: 例如。目前有:

public class MyClass {
    private int someInt;
public int SomeInt {
        get {
                return someInt;
        }
        set {
                someInt = value;
        }
    }
}
public class MyClass {
    [IsProperty(public, get, set)]
    private int someInt;
}
(7)不支持多个返回值,例如:
public int, string, double MyFunction()
{
    ....
    return x,y,z;
}
public void TestMyFunction()
{
    int x, string y, double z = MyFunction();
}
(8)不支持协变返回类型 我对仿制药实现有一些抱怨,但我会把它剪掉。我认为C#是一种很好的语言,可用于完成所有的GUI,网络和配置管道,是我的第一语言,用于从长远来看可以支持的方式快速完成工作。

mnam

赞同来自:

C

  1. 位字段 - 它们没有被语言很好地指定,它们的工作方式取决于编译器和体系结构。
  2. 通常很难找到在大量代码中定义特定符号的位置,尤其是如果该符号由宏生成。这让我想起......
  3. 预处理器是一个相当丑陋的黑客,适合各种各样的滥用。
  4. 缺少标准大小的整数(最近由uint * _t补救,但是有很多很多旧代码在那里浮动,有自定义typedef或#defines用于DWORD,WORD,BYTE等)。
  5. 缺少类似于Perl的cpan.org的东西(会喜欢那个错误。)
编辑: 在考虑C的CPAN时,我想......我会称之为“ccan”,然后使用谷歌搜索,我遇到了这个: http://ccan.ozlabs.org/ 它似乎还处于起步阶段。

equia

赞同来自:

JavaScript的 来自ECMAScript 5规范:

  • 7.6.1.2未来保留字: class,enum,extends,super,const,export, 进口 在严格模式下:implements,let,private,public,interface,package,protected,static,yield
  • 11.9.4严格等于算子(===)与11.9.1 TheEqualsOperator(==)
  • 11.9.6严格的等式比较算法(NaN === NaN为假)
  • 8.5数字类型 - 没有真正的整数,一切都是浮点数。
  • 4.2.1对象 - 原型继承
好吧,我有点喜欢最后一个,但它有7种令人困惑

xiste

赞同来自:

JavaScript的:

  1. 所有最酷的东西都是非常复杂的,但是,所有的冷静也包含在如此少量的代码中,让你感到愚蠢的努力追随它
  2. '+'是一种荒谬的运算符选择,用于弱类型语言的连接。他们试图吓跑新手吗?
  3. 这是一个跨浏览器的兼容性雷区(如果它甚至没有开启,也不要介意)
  4. 它通常是不受信任的 - 与诸如阻止后退按钮,永不死亡的弹出窗口等的捣乱相关联。
  5. 几乎不可能调试,因为只有几个不同的错误消息和一些不同的类型(数字,字符串,对象等)
如果不是jQuery,我可能仍然讨厌它,就像我以前一样:)

csequi

赞同来自:

蟒蛇 我只是不明白......

  • math.ceil()math.floor()返回浮点数,而不是整数(可能是为了避免底层C函数中的整数溢出 - 但为什么不强制转换为Python?)
  • len()是一个函数而不是方法
  • reload()非常有限,不会重新加载模块中的9次,只会重新加载导入的标签(如果它是模块) - 即如果foo本身不是模块则无法执行from bar import foo; reload(foo)
  • 可变默认参数有一个引用(为什么不是每个函数调用的新实例?!)
  • 所有这些强调的变量 - 如果它们是如此私密,我们怎么能在代码中看到内置的变量呢?获取命名空间!
  • 字符串不可变 - 也许这是有充分理由的,但我遇到过很多情况,我想调整一个特定的角色......
根据实施有意义的但是很烦人......
  • array.sort()不返回数组(我认为它就地发生)
  • 列表/生成器理解没有定义新的范围(只是for循环的语法糖,对吗?)
以及在Python 3中修复的一对
  • 默认情况下为整数除法
  • global只能引用顶级命名空间

et_et

赞同来自:

C

  • 字符串处理
  • 内存管理(决定谁应该分配以及谁应该释放它)
  • 没有名称空间(最大的)
  • 标准库中没有列表/数组和其他基本DS

JavaScript的
  • 使用不带var的变量会自动将其设为全局
  • 分号不是强制性的
  • 比较运算符“==”和“===”以及有关其使用的混淆
  • 没有适当的支持来处理二进制数据
  • 再次..没有命名空间
  • 变量没有块范围。 (来自C世界非常恼人)

bnemo

赞同来自:

我只有一个,但我相信值得分享。 CSharp / .NET 我们有Length属性来获取数组中的元素数,使用Count属性来获取集合中元素的数量。如果你考虑CLR自动将IList,ICollection,IEnumerable添加到场景后面的基于零的一维矩阵的事实,看起来更奇怪。 我相信CLR团队和BCL团队很难讨论这个问题;)

et_sed

赞同来自:

的Python
  • 1-3:包装/构建/文档系统没有明显的选择(例如Perl的cpanPOD或Ruby的gemrakerdoc)。
  • 4:Python 3.0与每个Python项目需要两个源分支(2.x和3.x)是不兼容的。但是Python 3.0并不足以证明它的合理性。大多数py3k的优点都太微妙了。
  • 5:Jython,IronPython,CPython不兼容。

svero

赞同来自:

d

  • 我们有运营商,但没有!在运营商?
  • 动态数组'长度'属性 - ya canna do array.length += 512;
  • 没有退出语句 - 如python的sys.exit()等。当然,你可以调用C的退出,但是未刷新的输出不会被刷新
  • 关联数组文字+字符串文字很糟糕 在关联数组文字中找到的字符串文字被解释为静态,因此,如果没有一些额外的转换,由于不同的长度字符串文字,此char[][char[]] hash = ["hello":"world","goodbye":"angels"];不起作用,尽管
    一个。我没有要求它被解释为静态数组
    湾不管怎样,关联数组中不允许使用静态数组
  • 不允许循环依赖(想要移植那个java lib?有趣的是重新设计类层次结构)
有人检查我这些;不确定它们是否仍然相关。

xid

赞同来自:

根据许多人的说法,Java很慢,但我同意某种程度的使用。 Java是戏剧性的。他们有很多课程只是为了你想做的一件事。但是你知道灵活性属性XD。 Java起初很难,但一如既往的乐趣。 当你编写一个简单的代码来打印“你好,世界!”请不要使用JAVA! XD我确信我有理由。 Java是一种混合,所以不要说它纯粹是一种OOP语言。 还有更多,但我只限于五个XD。谢谢!

uanimi

赞同来自:

德国 我的母语......虽然它听起来比克林贡语更美,但这是一个语法地狱......
  1. 结合:即使是常规动词也有不同形式的每个人和时间(少数例外)......例如:我看,你看,他/她/它看到,我们看到,你看,他们看到翻译成: Ich sehe,du siehst,er / sie / es sieht,wir sehen,ihr seht,sie sehen。
  2. 礼貌的地址形式:等于第三人称复数,习惯于在中年时代等于第二人称复数...我真的很讨厌区分“Du”和“Sie”的概念,因为我的哲学是每个人都应该在尊重它应得的数量方面被认为是平等的(我的意思是,什么是发誓的话,嗯?)
  3. 标点符号:告诉我一种定期使用更多逗号的语言!
  4. 缺少合适的词语:例如。没有真正的德语相当于“方便”或这个词的任何衍生物...几乎在每种情况下你都不能将它翻译成另一个德语单词并保留其含义......相反,你必须构成一个完整的子集描述它有点足够......
  5. Anglicisms和Denglish:当然,英语有“Kindergarten”或“Poltergeist”,除了德语之外什么都没有人们需要的Anglicisms ......更糟糕的是:我们重新定义了我们采用的一些词,例如。在德语中“Handy”意味着一部手机,与英语形容词无关......语法也有涌入,导致“Denglish”表达(见维基百科的链接文章) 还有更多,但我不想夸大这一点,这些是我讨厌德语的个人Top5 ...

jdolor

赞同来自:

Objective-C 2.0 严格遵守语言和运行时,而不是库,而不是任何特定的顺序:

  1. 缺少cVars。
  2. 没有模块。我对缺少命名空间并不十分不满意,但模块会很好。
  3. 基于Ivar的属性语法需要在3个位置使用变量名称进行声明。这很可怕。
  4. C传承。除了OO和GC之外,任何讨厌C语言的东西都存在。
  5. 对象不能存在于堆栈中。 Obj-C不是问题,而是它对其他语言编程实践的影响。例如,当我在C++中获得堆栈的返回值时,我发现它很奇怪。如果我在编写代码时实际上并没有查看库文档,我会假设每个函数都返回一个指针,这通常会在以后进行一些重要的清理工作。

ut_quo

赞同来自:

方案

  • 缺乏静态类型
  • 没有静态函数重载(由于上述原因)导致字段访问者的长名称
  • 没有统一的对象系统
  • 有点慢
  • 相对较小的社区

xet

赞同来自:

C#

  • 缺少基于方法参数的运行时类型的多次分派。 dynamic应解决大部分问题,但尚未发布。
  • 接口实现是声明性的而非结构性的。我真的很喜欢Google的Go语言类型
  • 进行异步方法调用真的很笨重(而且我很确定所有线程都是OS线程,而不是轻量级线程)
  • 没有宏系统。我不是在谈论C风格的宏;我在说LISP / Scheme风格的宏
  • 操作符是静态方法,它们的签名受到过度约束(并且您无法创建新签名)。
  • ret

    赞同来自:

    哈斯克尔

    1. 有时类型系统感觉倒退。如果我不希望编译器为我的变量推断类型怎么办?如果我想要相反的话,它会对所述变量进行约束检查,该怎么办?例如,它不是推断列表元素的类型,而是确保它们都属于特定的类型类。这是一个微妙但巨大的差异,这使我很难编程UI。它可以完成,但它需要比其他语言更多的努力。 Haskell针对非UI部分进行了研究,但是我将UI留给了无类型语言。
    2. 允许构建无限值有时会导致一些非常令人沮丧的错误。
    3. NoMonomorphismRestriction。
    4. Bytestring处理有时会让我陷入困境,直到你的程序崩溃,你才知道它,因为你把它们混合得不合适。当我们丢失应该防止这种情况的类型信息时,这里出了点问题。
    5. 对于琐碎的案件,如证人类型,应该自动派生类型类别,但在那里滥用的可能性很大。

    sunde

    赞同来自:

    C++

    • 涉及模板时的神秘错误消息
    • 缺少模板约束(许多情况下可以使用模板元编程,但这会导致代码不可读(至少对于普通程序员而言)大多数情况下)
    • 指向成员函数语法的指针
    • c ++标准委员会应该更频繁地发布官方标准(或者至少发布标准库本身的单独更新),我的意思是真的TR1是2005年发布的,我们仍然没有标准库中的shared_ptr,bind和类似。
    •   -

    nea

    赞同来自:

    蟒蛇

    1. Python 3没有Django。
    2. 静态输入。是的,动态打字很棒,但有时候我确实希望它是静态的。
    3. 正确的unicode支持(在Python 3中修复)
    4. 建筑师命名。我讨厌所有这些下面的代码: __in__ my代码。
    5. 线程效率不高

    aut_ut

    赞同来自:

    Perl代表了一种可怕的语言。

    1. 没有“公开”或“私人”或“受保护”的声明/定义。
    2. “my $ variable_name;”不会在子例程之外声明全局。
    3. “my $ variable_name;”通过子程序访问,但“use strict;”或其他“使用”会产生警告。
    4. 功能原型最终无法解释,不明确,不需要或其他一些借口。
    5. 当阅读符号的大小时,过度使用符号的使用会变得“酷而快”。
    6. 当一个人变热时,他们喜欢保持热度,不需要任何冷却它们。
    7. 经过一周的Perl,我最终无法编写函数并对其进行原型设计。
    8. 究竟是什么模块,它实际上需要“.pm”扩展名?
    9. 如果您想创建一个公共变量并从子程序内部访问它,那么如何在不创建警告的情况下完成此操作?
    10. 你在哪里找到一些整齐的脚本来教一个整洁的Perl?

    fearum

    赞同来自:

    哇,我很惊讶SQL还没有在这里做到。猜猜这意味着没有人喜欢它:)

    • 跨实现的语法不一致
    • 由于看似模糊的原因,微妙的代码差异可能会产生巨大的性能影响
    • 对文本操作的支持不足
    • 入门成本高,但掌握语言的学习曲线陡峭
    • 社区内针对最佳做法的最小标准化,包括语法风格。
    ......还有一些奖励它的奖励理由,不收取额外费用
    • WHERE子句最后一个,很容易过早地执行UPDATE或DELETE,从而破坏整个表。相反,WHERE应该在前面的某个地方。
    • 实施关系分工很困难。
    • 我可以将值设置为NULL,但我无法测试它与NULL的相等性。我可以检查IS NULL,但这只会使代码复杂化 - 在我看来,这是不必要的。
    • 为什么我们需要完全重新指定GROUPed列的公式,而不是在列上设置别名,然后在别名上设置GROUP BY(或者像SORT那样设置列索引)?

    eomnis

    赞同来自:

    Java的

    1. 已检查例外情况
    2. type erasure
    3. 缺少运算符重载(例如,对于BigInteger / BigDecimal)
    4. 缺少正则表达式/日期/持续时间/复杂文字
    5. 对不变性的支持不足

    aeius

    赞同来自:

    蟒蛇

    • 我终于习惯了print语句,现在有了这个打印功能??? (py3k)
    • 从未让py2exe或cxFreeze正常工作
    • 未标准化(轻微挑剔)
    • 递归深度仅为100(iirc)

    uqui

    赞同来自:

    Python(3.1)

    • 条件语句的奇怪的无序T if C else F语法。
    • bytes文字看起来太像str文字了。我们应该有x'414243'而不是b'ABC'
    • str在某些平台上为UTF-16,在其他平台上为UTF-32。 (虽然至少它比2.x字符串有所改进。)
    • 具有相同的运算符以进行添加和连接。这会对numpy.array等类型造成伤害。
    • 慢慢跑。

    qquod

    赞同来自:

    我讨厌Python的事情:

    • 没有编译器
    • 没有认真对待
    让我烦恼的关于Python的事情:
    • (self,
    • 没有private
    • 破坏兼容性

    我讨厌PHP的五件事:
    • “按预期工作”,当它显然是一个错误
    • no goto
    • 错误引用(foreach $arr => &$val ... foreach $arr => $val)
    • 没有多重继承
    • 在没有牺牲羔羊给黑暗神的情况下,没有真正有效的编译器

    kquis

    赞同来自:

    哈斯克尔:

    • 空间泄漏 - 默认为懒惰付出的代价 - 可能价格过高?
    • 即使像headtail这样的纯函数也可以调用error并将你引导至IO
    • 来自Monad
    • fail - 带回MonadZero
    • Num类 - (+)应该在AdditiveGroup或类似名称中。
    • Monad不是Applicative

    baut

    赞同来自:

    TCL 这是我几乎所有事情中最喜欢的语言。多年来,它已经(慢慢地,非常缓慢地)进化,以解决困扰我的大多数事情。语言非常灵活,很容易实现语法糖来覆盖那些仍然让我烦恼的事情。但是有一些关于语言的东西不能轻易改变只是打破它的禅宗:

    • 数组(关联类型,Perl调用哈希)没有正确的值语义。这使得它们难以传递到函数并从函数返回。此外,这意味着它们不能嵌套。出于这个原因,dicts(词典)被发明但为时已晚,这是一个很好的数组访问语法: $array($foo) 现在永远被愚蠢的数组用于向后兼容。我们现在坚持: dict get $dict $foo 这更加冗长,对我来说感觉不那么可读。
    • 没有真正的关闭。虽然它可以通过全局变量或命名空间进行某种程度的模拟,但首先会破坏闭包的原因。虽然,我现在还不能真正看到如何在纯值语义系统中实现闭包。
    • 与其他所有存储库工具相比,Teacup难以使用,并且完全不直观。这是比tcl-core更多的ActiveState错误,并且在编码时并没有真正破坏tcl的Zen,但它仍然非常烦人。

    uut

    赞同来自:

    LUA:

    • 内置的错误系统绝对是可怕的 您可以通过修改Lua解释器来实现try-catch系统;但它与内置函数抛出的错误无法兼容。
    • 事实上他们有__newindex而不是__setindex作为setter ...和__newindex仅在密钥尚不存在时触发。如果确实如此,则根本不会调用metamethod。
    • 没有好的类型比较系统。 有type()函数,但它只处理基本类型(所有表都是表)。它确实需要一种类型比较的元方法。我之前使用'is'运算符和__type元方法实现了它,它的效果非常好。
    • 定义新关键字是个婊子。 你可以这样做,但Lua中的代码没有很好的记录,因此找出如何获得你想要的结果是一种试验和错误。当你想要实现我自己上面提到的东西时,这是一个主要问题(尽管__setindex不是很多,但这很容易修改)。
    • 我无法在网络浏览器中使用它。 是的,语言本身并不是真正的问题,但该死的,我是否愿意能够使用Lua代替Javascript ...... :)。

    ysequi

    赞同来自:

    LUA:

    • Metatables在他们“点击”
    • 之前一直很混乱
    • 缺少像a += 20这样的赋值操作符很痛苦
    • 没有集成的面向对象的解决方案意味着每个人和他的狗都使用自己的味道
    • 用于评论的语法(--)排除了前后增量/减量运算符的可能性
    • 在不攻击C方的情况下,不可能有任何先发制人的多任务处理系统

    esaepe

    赞同来自:

    C#。 我最讨厌的是:

    1. 没有多重继承 - 想象你可以提供任何GUI框架基类(Control,Window,等等)与MVC相关的东西等......框架/基类不可知!
    2. 没有“朋友”关键字......我知道,RAD - 受害者会滥用它来处理各种恶臭的代码和搞笑的渎职行为,但对于OOD来说这会很好 - 强制实施demeter定律
    3. 没有语言集成的DBC功能,有合同,但我宁愿让那个Spec# - 风格具有通用性“!” - 后缀运算符
    4. 没有AOP(我不明白......这种语言有属性,在编译器中添加拦截代码会很容易!)
    5. 没有弱事件委托 - 观察者模式变成了现在的内存泄漏诱饵......: - (

    kautem

    赞同来自:

    斯卡拉:

    • 标准库怪异:它并不总是显示最佳实践,并且未充分记录
    • 硬编码的FunctionX,TupleX类
    • 缺乏属性:getter和setter是分开的,这违反了DRY,并且使得像FRP这样的东西几乎不可能
    • 需要= _来初始化属性

    wiusto

    赞同来自:

    C# 我对C#非常满意,但这两个真让我烦恼:
    • 基于构造函数的不可变类初始化不太方便,不太直观(当您阅读代码时,您不了解分配给什么的代码),IDE支持比内联对象初始化少。这使你不可避免地倾向于可变类。我知道之前已经提到了这一点,但我对不可变类的初始化语法严格存在问题。
    • switch太冗长了。每当我看到一个开关适当的情况时,我真的倾向于使用if..else if..只是因为它更简洁(打字减少约30%)。我认为切换应该没有漏洞,应该暗示breakcase应该允许以逗号分隔的值列表。

    ncum

    赞同来自:

    C# 我知道它很愚蠢,但我想将数据类型转换为我想要的东西,而不必添加(int)Convert.ToInt32等等。它只会节省我的时间。令我很生气的是,如果我写了一些内容来输出一个int,然后我发现我需要一个long,那么我经常需要通过并改变我所做的一切才能使它工作。只为我做! 对不起,想不到五个,但我是新手,所以也许我会回来再添加更多:P

    lest

    赞同来自:

    VB .NET,但仅仅因为VB6毒害了整整一代程序员 我在VB .NET商店工作,曾经是一个VB6商店,在这里工作的每个人曾经是VB6开发人员,顽固地拒绝学习任何关于.NET的东西。他们编码好像它仍然是VB6,他们的应用程序就像VB6应用程序一样糟糕。我的老板积极阻止对LINQ的任何使用,因为她担心其他人难以理解,这是真的,因为没有人想要了解它。 如果MS刚刚使用C#,我认为我们会好起来的,这让我很难说,因为我认为花括号远远不如VB的详细结束语。

    xnobis

    赞同来自:

    C++

    • 与char *和std :: string相关的库中的不一致。所有C++库都应该使用std :: strings。
    • 字符不是相对于iostream的字节。我做了很多面向字节的工作。具有“字节”类型和“字符”类型将显着地使其更简单。这也将允许更容易扩展到Unicode。
    • 位操作在值上应该很容易。我应该能够访问和设置值的第n位,而无需播放和/或跳舞。
    • 缺乏GUI的标准化界面。这是微软真正能够很好地利用C#定位的地方。 OS制造商提供的标准接口绑定对我的工作来说非常有用。

    vet

    赞同来自:

    蟒蛇

    • 调试时错误/异常含糊不清
    • 我不在工作中使用它
    • 在类
    • 中使用__init __,__repr __,__ rs__等
    • 不能简单地编译可执行文件(.exe或其他)
    • 我尚未尝试过的其他一些事情,但我肯定会让我感到烦恼
    对于所有那些C语言程序员来说,自我对我来说比这更有意义,因为对象指的是它的自我

    eet

    赞同来自:

    的Perl
    • 混合使用符号
      my @array = ( 1, 2, 3 );
      my $array = [ 4, 5, 6 ];
      my $one  = $array[0]; # not @array[0], you would get the length instead
      my $four = $array->[0]; # definitely not $array[0]
      my( $two,  $three ) = @array[1,2];
      my( $five, $six   ) = @$array[1,2]; # coerce to array first
      my $length_a = @array;
      my $length_s = @$array;
      my $ref_a = \@array;
      my $ref_s = $array;
      
      • 例如,这些都不相同:
        $array[0]   # First element of @array
        @array[0]   # Slice of only the First element of @array
        %array[0]   # Syntax error
        $array->[0] # First element of an array referenced by $array
        @array->[0] # Deprecated first element of @array
        %array->[0] # Invalid reference
        $array{0}   # Element of %array referenced by string '0'
        @array{0}   # Slice of only one element of %array referenced by string '0'
        %array{0}   # Syntax error
        $array->{0} # Element of a hash referenced by $array
        @array->{0} # Invalid reference
        %array->{0} # Deprecated Element of %array referenced by string '0'
        
      Perl6中,它是written
      my @array = ( 1, 2, 3 );
      my $array = [ 4, 5, 6 ];
      my $one  = @array[0];
      my $four = $array[0]; # $array.[0]
      my( $two,  $three ) = @array[1,2];
      my( $five, $six   ) = $array[1,2];
      my $length_a = @array.length;
      my $length_s = $array.length;
      my $ref_a = @array;
      my $ref_s = $array;
      
    • 缺乏真正的OO
      package my_object;
      # fake constructor
      sub new{ bless {}, $_[0] }
      # fake properties/attributes
      sub var_a{
        my $self = shift @_;
        $self->{'var_a'} = $_[0] if @_;
        $self->{'var_a'}
      }
      
      Perl6中,它是written
      class Dog is Mammal {
          has $.name = "fido";
          has $.tail is rw;
          has @.legs;
          has $!brain;
          method doit ($a, $b, $c) { ... }
          ...
      }
      
    • 设计不佳的正则表达式功能
      /(?=regexp)/;           # look ahead
      /(?<=fixed-regexp)/;    # look behind
      /(?!regexp)/;           # negative look ahead
      /(?<!fixed-regexp)/;    # negative look behind
      /(?>regexp)/;           # independent sub expression
      /(capture)/;            # simple capture
      /(?:don't capture)/;    # non-capturing group
      /(?<name>regexp)/;      # named capture
      /[A-Z]/;                # character class
      /[^A-Z]/;               # inverted character class
      # '-' would have to be the first or last element in
      # the character class to include it in the match
      # without escaping it
      /(?(condition)yes-regexp)/;
      /(?(condition)yes-regexp|no-regexp)/;
      /\b\s*\b/;              # almost matches Perl6's <ws>
      /(?{ print "hi\n" })/;  # run perl code
      
      Perl6中,它是written
      / <?before pattern>  /;   # lookahead
      / <?after pattern>   /;   # lookbehind
      / regexp :: pattern  /;   # backtracking control
      / ( capture )        /;   # simple capture
      / $<name>=[ regexp ] /;   # named capture
      / [ don't capture ]  /;   # non-capturing group
      / <[A..Z]>           /;   # character class
      / <-[A..Z]>          /;   # inverted character class
      # you don't generally use '.' in a character class anyway
      / <ws>               /;   # Smart whitespace match
      / { say 'hi' }       /;   # run perl code
      
    • 缺少多次发送
      sub f(   int $i ){ ... }  # err
      sub f( float $i ){ ... }  # err
      sub f($){ ... } # occasionally useful
      
      Perl6中,它是written
      multi sub f( int $i ){ ... }
      multi sub f( num $i ){ ... }
      multi sub f( $i where $i == 0 ){ ... }
      multi sub f(     $i ){ ... } # everything else
      
    • 操作员重载不佳
      package my_object;
      use overload
        '+' => \&add,
        ...
      ;
      
      Perl6中,它是written
      multi sub infix:<+> (Us $us, Them $them) |
                          (Them $them, Us $us) { ... }
      

    ut_est

    赞同来自:

    Clojure的

    • 功能定义中缺少可选和关键字参数的内置语法。当然,您可以轻松添加它,但这意味着库编写者不会使用它。普遍的解构尚未被证明是一个很好的替代品
    • 缺少方法组合(在Common Lisp中找到的排序方法之前/之后/周围)
    • 过分依赖Java互操作,例如没有内置文件IO
    • 有时我想要静态输入。这个不是纯粹的仇恨;我通常更喜欢动态,并尝试将两者混合在很大程度上令人不满意
    • 内置数据结构没有内置的快速二进制序列化格式,但我听说人们正在研究它

    ysit

    赞同来自:

    C++

    1. 制作一段简单的代码需要花费很多时间。
    2. for(std :: vector :: const_iterator iter = [...]
    3. vector.remove()不会删除。
    4. vector.push_front()不存在。
    5. 标题文件
    6. 没有lambda
    7. 如果至少有一个虚函数,则不会自动清空虚拟析构函数。