식별자(identifier)라는 것은 이름을 말하는데 이 식별자를 변수나 함수의 이름으로 사용할 수 있다. Maxima에서 식별자를 만드는 데 사용될 수 있는 구성 요소는 아래와 같다.

  • 알파벳 대소문자 (A~Z, a~z)

  • 숫자 (0~9)

  • _ (under bar)

  • %

  • \(백슬래쉬)+(특수문자)

 다른 프로그래밍 언어와 달리 맥시마는 식별자를 만들 때 %나 \#, \$와 같은 특수문자 조합도 사용할 수 있다. 또한 식별자를 만들 때 주의할 점은 숫자로 시작하면 안 된다는 것이며 대소문자를 구별한다는 것이다. 올바른 식별자의 예는 다음과 같다.

mA, aa, AA, lstB, _abc, %number, \@myVar, is_this_\#var

 변수에 어떤 수치 값을 대입하려면 콜론(:)을 사용하며 등호(=)가 아님에 유의해야 한다. 처음에 wxMaxima를 사용하기 시작할 때 가장 하기 쉬운 실수 중에 하나가 바로 변수 값을 대입할 때 콜론(:)대신 등호(=)를 사용하는 것이다.



이제 입력과 출력 앞에 붙은 (%i53), (%o60)와 같은 표시를 주의 깊게 살펴보면 이것들이 식별자라는 것을 알 수 있다. 맥시마에서 새로운 명령을 입력하거나 결과가 산출될 때 그것들은 이 변수에 자동으로 저장이 된다. 따라서 차후에 이 변수를 가지고 과거의 입력이나 출력을 참조할 수 있으며 그것들도 일반 변수와 같이 사용할 수 있다.


 기호 _ 는 바로 직전의 입력, %는 바로 직전의 출력이다. 다음 예를 따라서 해보고 결과를 확인해 보자.



그리고 현재 정의된 모든 변수를 확인하려면 values 라는 명령어를 입력하면 된다. 특정한 변수를 삭제하려면 kill() 함수를, 정의된 모든 변수를 제거하려면 kill(all) 명령을 내리면 된다.



 변수명으로 써서는 안 되는 예약어들은 다음과 같은 것들이 있다. (매뉴얼 pp.87)


if, then, else, elseif, and, or, unless,
integrate, next, from, diff, in, at, limit, sum, for, do,
product, while, thru, step



Posted by 살레시오
,

 Scilab에서 작업 폴더와 관련된 기본적인 명령어들은 다음과 같다. (리눅스 쉘 명령어들과 유사하다.)

[표 1] 폴더와 관련되 Scilab 명령들

명령어

기능

ls (혹은 dir)

현재 폴더의 내용물을 표시

pwd

현재 폴더(경로)를 표시

chdir full_path

chd  ‘full_path’

작업 폴더를 full_path 로 변경

(위와 상동)

mkdir

폴더를 생성

폴더와 관련된 변수들은 다음 표에 정리하였다.

[표 2] 폴더와 관련된 변수들

변수명

내용

HOME

사용자 홈 디렉토리(환경변수)

home

사용자 홈 디렉토리(전역변수)

OS

운영체제(환경변수)

PWD

작업 디렉토리(전역변수)

SCI

Scilab이 설치된  디렉토리(환경/전역변수)

SCIHOME

환경설정을 담은 디렉토리(환경/전역변수)

TMPDIR

임시 디렉토리 (전역변수)

 

여기서 전역변수는 일반적인 변수처럼 접근할 수 있으나 환경변수는 getenv() 와 setenv()함수를 이용해서 접근한다. 예를 들어서

>> getenv(‘HOME’)
ans =
       C:\Users\jhp

이 함수의 입력 인수는 문자열이며 Scilab에서는 폴더를 구별할 때 역슬래시(\)가 아니라 리눅스에서처럼 그냥 슬래시’/’ 문자를 사용한다는 것에 유의해야 한다.

 SCIHOME 환경 변수에는 과거 명령어들(history)등을 저장하는 파일들이 있는 폴더명을 나타낸다. 이 폴더에 scilab.ini 라는 스크립트 화일을 만들면 Scilab이 실행될 때마다 자동으로 읽어 들이는 시작 파일이 된다. 따라서 이 파일에 사용자가 자신만의 전역변수라든지 작업폴더 혹은 커스텀 라이브러리를 읽어들이는 명령어들을 기록해 두면 편리하게 사용할 수 있다. 예를 들어 작업 폴더를 Scilab이 시작할 때 자동으로 d:/scilab_files 라는 폴더로 변경하고 싶을 때는 scilab.ini 파일을 SCIHOME 폴더에 생성한 후 다음과 같이 작성하면 된다.

chd d:/scilab_files

그러면 다음에 Scilab을 시작할 때는 자동으로 이 명령이 실행되어 작업 폴더가 변경된다.



Posted by 살레시오
,

루아의 변수는 다음과 같이 8가지 데이터타입을 갖는다.


nil

부울값

숫자

문자열

테이블

함수

----------

코루틴

유저데이터


이 중에서 코루틴과 유저데이터는 코로나SDK와 별로 관련이 없으므로 제외하고 나머지 여섯 개 중 참조를 갖는 것은 함수와 테이블이다. 문자열은 참조가 아니라는 것에 유의해야 한다. 참조란 실제 데이터가 저장된 곳을 가리키는 주소이다. (사실 참조도 주소'값'이므로 루아는 다 값이라고 주장하기도 하지만 혼동의 여지가 있으므로 여기서는 참조와 값을 구분하도록 하겠다.)

따라서 만약 어떤 테이블을 함수의 입력파라메터로 넘길 때 참조가 넘어가므로 그것을 받아서 조작하면 원래의 테이블값도 바뀌게 된다.


┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓

    local function Func1(a, tA)

        a = 20

        tA.x = 20

    end


    local function Func2(tA)

        tA = {x=30}

    end


    local x, tX = 10 , {x=10}

    Func1(x, tX) -- x는 값이, tX는 참조가 넘어간다.

    print(x, tX.x) -- 10, 20 이 찍힌다.

    Func2(tX)

    print(tX.x) --20이 찍힌다.

┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛


위의 예에서 Func1()을 호출할 때 로컬 변수 x는 값이 넘어가고 테이블 tX는 참조가 넘어가므로 함수 호출 후 테이블의 필드만 값이 변경되었다. 반면에 Func2()내에서는 tA가 tX의 참조를 받기는 하지만 새로운 테이블의 참조로 초기화되었다. 따라서 이경우 tA는 넘어온 tX와는 전혀 별개의 것이 되어서 tX에는 아무런 영향을 끼치지 못한다. 그래서 맨 마지막 print()에서 20이 찍히는 것이다.


이와 마찬가지로 함수의 리턴값이 테이블이나 함수일 경우도 참조를 반환한다. 다음 예는 처음에는 조금 이해하기 힘들 수 있으나 한 번 살펴보도록 하겠다.


┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓

    local function Func1(xR)

        local x = xR or 0 -- 내부변수 x를 넘어온 값으로 초기화

        local y = 0

        local Func = function() print("x :"..x);end -- 여기서 x가 사용되었다.

        return y, Func -- y는 '값'을, Func는 '참조'를 반환

    end


    local y1, Func2 = Func1(10)

    local y2, Func3 = Func1(20)

    Func3() -- 20 이 찍힌다.

    Func2() -- 10 이 찍힌다.

┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛


함수 Func1()은 그 안에서 내부변수 y의 '값'과 내부변수 Func의 '참조'를 반환한다. 기본적으로 어떤 함수의 지역변수는 함수가 종료되면 사라진다는 것은 알고 있을 것이다. 변수 y는 함수가 종료되면 더 이상 참조되는 곳이 없으므로 GC의 타겟이 되어 사라질 것이다. 하지만 내부함수 Func는 그 참조가 호출된 곳의 Func2 변수를 통해서 계속 사용되므로 사라지지 않고 살아남게 된다. 그럼 내부변수 x는 어떨까? x변수는 Func안의 print()문에서 참조를 하고 있으므로 Func가 살아있는 한 x도 계속 살아있게 된다.


또 한가지 주의할 것은 Func2 와 Func3에서 참조하는 변수 x는 서로 별개의 것이라는 점이다. 따라서 처음 Func3()호출에는 20이 찍히고 맨 마지막 Func2() 함수를 호출하면 10이 찍힌다. 서로 '다른' 변수 x를 참조하고 있기 때문이다.


이것을 이해했다면 클래스를 구현할 때 외부에서는 접근할 수 없고 내부에서만 사용할 수 있는 private 변수/함수 를 구현하는데 응용할 수 있다.

Posted by 살레시오
,