blob: 294e95fd6393e337a76e7c0d6291724fae98fee5 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package arith is an example of an IdL definition in vanadium. The syntax for
// IdL files is similar to, but not identical to, Go. Here are the main
// concepts:
// * PACKAGES - Just like in Go you must define the package at the beginning
// of an IdL file, and everything defined in the file is part of this
// package. By convention all files in the same dir should be in the same
// package.
// * IMPORTS - Just like in Go you can import other idl packages, and you may
// assign a local package name, or if unspecified the basename of the import
// path is used as the import package name.
// * DATA TYPES - Just like in Go you can define data types. You get most of
// the primitives (int32, float64, string, etc), the "error" built-in, and a
// special "any" built-in described below. In addition you can create
// composite types like arrays, structs, etc.
// * CONSTS - Just like in Go you can define constants, and numerics are
// "infinite precision" within expressions. Unlike Go numerics must be
// typed to be used as const definitions or tags.
// * INTERFACES - Just like in Go you can define interface types, which are
// just a set of methods. Interfaces can embed other interfaces. Unlike
// Go, you cannot use an interface as a data type; interfaces are purely
// method sets.
// * ERRORS - Errors may be defined in IdL files, and unlike Go they work
// across separate address spaces.
package arith
// Test the import mechanism.
import (
"v.io/x/ref/lib/vdl/testdata/base"
)
// Constants.
const (
// Yes shows that bools may be untyped.
Yes = true // yes trailing doc
// No shows explicit boolean typing.
No = bool(false)
Hello = "hello"
// Int32Const shows explicit integer typing.
Int32Const = int32(123)
// Int64Const shows explicit integer conversion from another type, and referencing
// a constant from another package.
Int64Const = int64(Int32Const + base.Five)
// FloatConst shows arithmetic expressions may be used.
FloatConst = float64(3.0 / 2 + 0.5)
// Mask shows bitwise operations.
Mask = uint64(0x1 << 8)
)
// Arith is an example of an interface definition for an arithmetic service.
// Things to note:
// * There must be at least 1 out-arg, and the last out-arg must be error.
type Arith interface {
// Add is a typical method with multiple input and output arguments.
Add(a int32, b int32) (int32 | error)
// DivMod shows that runs of args with the same type can use the short form,
// just like Go.
DivMod(a, b int32) (quot, rem int32 | error)
// Sub shows that you can use data types defined in other packages.
Sub(args base.Args) (int32 | error)
// Mul tries another data type defined in another package.
Mul(nested base.NestedArgs) (int32 | error)
// GenError shows that it's fine to have no in args, and no out args other
// than "error". In addition GenError shows the usage of tags. Tags are a
// sequence of constants. There's no requirement on uniqueness of types or
// values, and regular const expressions may also be used.
GenError() error {"foo", "bar" + "z", Hello, int32(Int64Const + 1), base.SixSquared}
// Count shows using only an int32 out-stream type, with no in-stream type.
Count(start int32) stream<_, int32> error
// StreamingAdd shows a bidirectional stream.
StreamingAdd() stream<int32, int32> (total int32 | error)
// QuoteAny shows the any built-in type, representing a value of any type.
QuoteAny(a any) (any | error)
}
type Calculator interface {
// A calculator can do basic arithmetic.
Arith // Arith provides the interface to basic arithmetic operations.
// A calculator has basic advanced function support.
AdvancedMath
On() error // On turns the calculator on.
Off() error {"offtag"} // Off turns the calculator off.
}