hpr2807 :: Are bash local variables local? - Sách nói Miễn phí

hpr2807 :: Are bash local variables local? - Sách nói Miễn phí

Tác giả:

Ngôn ngữ: English

Thể loại:

Hiện không có bản âm thanh nào. Vui lòng quay lại sau!

Giới thiệu

Summary: A lesson on dynamic scope vs lexical scope

Series: Bash Scripting

Source: [http://hackerpublicradio.org/eps.php?id=2807](http://hackerpublicradio.org/eps.php?id=2807)

Original audio: [http://archive.org/download/hpr2807/hpr2807\_source.flac](http://archive.org/download/hpr2807/hpr2807\_source.flac)

[https://en.wikipedia.org/wiki/Scope\_%28computer\_science%29](https://en.wikipedia.org/wiki/Scope\_%28computer\_science%29)

In hpr2739, Dave talked briefly about local variables. But what are they?

In most modern languages, especially in compiled languages, "local" means that the value of a variable cannot be directly known, by looking up the name, outside the bounds of that function, but that’s not how it works in bash.

Languages like C and Python have lexical scope. Lexical scope means local variables are local in the text. The names are local.

If I’m writing code that is textually located outside the function, I cannot even describe how to access the variables within the function, because myvariable in my function is not the same variable, not the same place, as myvariable in your function.

Languages like Bash and Elisp have dynamic scope. That means local variables are local in time. The names are global.

What happens when you declare a variable local in bash is that the existing value of that variable is stowed away, to be brought back when your function exits.

#!/usr/bin/env bashfunction sayscope() { echo The scope is $whatsmyscope}function globalscope() { whatsmyscope=global}function dynamicscope() { whatsmyscope=dynamic}function localscope() { local whatsmyscope=local sayscope dynamicscope sayscope}globalscopesayscopelocalscopesayscope

The scope is globalThe scope is localThe scope is dynamicThe scope is global

Perl has both, and it calls them local (dynamic scope, like bash) and my (lexical scope):

#!/usr/bin/env perluse v5.10;sub sayscope { say "Dynamic scope is $whatsmyscope";}sub globalscope { $whatsmyscope="global";}sub dynamicscope { $whatsmyscope="dynamic";}sub lexicalscope { my $whatsmyscope="lexical"; say "Lexical scope is $whatsmyscope"; sayscope;}sub localscope { local $whatsmyscope="local"; sayscope; dynamicscope; sayscope; lexicalscope;}globalscope;sayscope;localscope;sayscope;

Dynamic scope is globalDynamic scope is localDynamic scope is dynamicLexical scope is lexicalDynamic scope is dynamicDynamic scope is global

You almost never want to use local in Perl, it’s mostly there for historical reasons — lexical scope is a Perl 5 feature. [https://perl.plover.com/local.html](https://perl.plover.com/local.html) covers well the remaining few and narrow exceptions where local might be useful.

As dynamic scope has some valid use, it’s available in some otherwise lexically scoped languages. For example, Common LISP has the special form, and several Schemes and Racket have parameter objects:

  • [http://www.lispworks.com/documentation/HyperSpec/Body/d\_specia.htm](http://www.lispworks.com/documentation/HyperSpec/Body/d\_specia.htm)

  • [https://srfi.schemers.org/srfi-39/srfi-39.html](https://srfi.schemers.org/srfi-39/srfi-39.html)

  • [https://docs.racket-lang.org/reference/parameters.html](https://docs.racket-lang.org/reference/parameters.html)

To dig fully into the history and flora of dynamic and lexical scope merits another episode.

Bình luận

Hãy là người đầu tiên bình luận

Chưa có bình luận nào về nội dung này. Hãy bắt đầu cuộc trò chuyện!

Thẻ: hpr2807 :: Are bash local variables local? audio, hpr2807 :: Are bash local variables local? - clacke audio, free audiobook, free audio book, audioaz