# Coding Style Guide

# Naming rules

For class names, always use PascalCase

// Correct
class FooBar {};

// Wrong
class fooBar {};
class foo_bar {};

For function and methods, use snake_case

// Correct
int test_func(int x) { return x+1; }

// Wrong
int TestFunc(int x) { return x+1; }
int testFunc(int x) { return x+1; }

For special python objects, use the same name as in python.

auto x = vm->None;
vm->call(obj, __repr__);

For global constants, use k prefix with PascalCase

const int kMaxCount = 10;
const float kMinValue = 1.0;

For macros, use SNAKE_CASE

#define FOO_BAR 1
#define TEST(x) x+1

# Access control

Please use python style access control.

We do not recommend to use C++ keywords such as private or public to achieve access control. Also do not write any trivial setter/getter.

Use a single _ as prefix to indicate a function or variable is for internal use.

class FooBar {
    int _count;
    int inc() { _count+=1; }
    void _clear() { _count=0; }

_ prefix is just a warning to remind you to use such members carefully.

It does not forbid users to access internal members.

# Use compact style

Try to make the code compact if it does not affect readability.

// Correct
if(x == 1) break;

// Wrong
if(x == 1){

# For std::shared_ptr<T>

Use a _ suffix to indicate a type is a shared pointer.

using CodeObject_ = std::shared_ptr<CodeObject>;
CodeObject_ co = std::make_shared<CodeObject>();