使用局部特殊变量

时间:2019-06-23 16:27:47

标签: global-variables common-lisp

为了方便原型设计,我依赖于在整个代码中大量使用的许多全局变量。但是现在我想将其中一些设置为本地(但动态)。在本地class IndexAjaxView(View): def get(self, request): param = request.GET.get('param') if param == 'get_total_topup': return self.get_total_topup(request) # <--- just change this return JSONResponse({}, status=404) def get_total_topup(self, request): return JSONResponse({ 'value': 'Rp.{:,.0f},-'.format( TopUp.objects.filter(owned_by=request.user).aggregate(Sum('amount'))['amount__sum'] ) }) 而不是在全局special声明它们是否有任何重大弊端(例如效率等)?

1 个答案:

答案 0 :(得分:1)

特殊变量不受欢迎的功能包括:

  • 缺乏参照透明性

这使得从功能上对代码进行推理变得更加困难。这意味着您的函数在语法上等效的调用会产生不同的结果。

  • 介绍错误

如果在代码的某个位置(例如,在系统函数中)定义了词法变量,则将其覆盖并导致错误。

  • 令人困惑

特殊(动态)绑定不受欢迎,会使不熟悉它的读者感到困惑。

  • 不必要

只需使用词法绑定,或者甚至使用照应宏。

更多信息:

隐喻宏请​​参阅Doug Hoyte的Let Over Lambda或Paul Graham的隐喻宏。

LiSP(小片段Lisp)中有一节有关绑定和动态绑定

Elisp默认情况下具有动态绑定,并且长时间执行强制动态绑定

许多早期的lisps具有动态绑定功能,但已将其删除。