Renamed to lyng

This commit is contained in:
sergeych committed 2025-06-02 11:38:17 +04:00
1 parent 6ef94fff65
commit e13dde68b5
34 files changed
+47 -51

No files matched your search

+1 -1
View File
@@ -1,4 +1,4 @@
# Ling: scripting lang for kotlin multiplatform # Lying: scripting lang for kotlin multiplatform
in the form of multiplatform library. in the form of multiplatform library.
+1 -1
View File
@@ -2,7 +2,7 @@
Mutable list of any objects. Mutable list of any objects.
It's class in Ling is `List`: It's class in Lying is `List`:
[1,2,3]::class [1,2,3]::class
>>> List >>> List
+2 -2
View File
@@ -1,4 +1,4 @@
# OO implementation in Ling # OO implementation in Lying
Basic principles: Basic principles:
@@ -15,7 +15,7 @@ Basic principles:
## Instances ## Instances
Result of executing of any expression or statement in the Ling is the object that Result of executing of any expression or statement in the Lying is the object that
inherits `Obj`, but is not `Obj`. For example it could be Int, void, null, real, string, bool, etc. inherits `Obj`, but is not `Obj`. For example it could be Int, void, null, real, string, bool, etc.
This means whatever expression returns or the variable holds, is the first-class This means whatever expression returns or the variable holds, is the first-class
+1 -1
View File
@@ -3,7 +3,7 @@
Class that supports double-precision math. Woks much like double in other languages. We honor no floats, so it is ' Class that supports double-precision math. Woks much like double in other languages. We honor no floats, so it is '
Real'. Real'.
It's class in Ling is `Real`: It's class in Lying is `Real`:
(π/2)::class (π/2)::class
>>> Real >>> Real
+7 -7
View File
@@ -1,6 +1,6 @@
# Ling tutorial # Lying tutorial
Ling is a very simple language, where we take only most important and popular features from Lying is a very simple language, where we take only most important and popular features from
other scripts and languages. In particular, we adopt _principle of minimal confusion_[^1]. other scripts and languages. In particular, we adopt _principle of minimal confusion_[^1].
In other word, the code usually works as expected when you see it. So, nothing unusual. In other word, the code usually works as expected when you see it. So, nothing unusual.
@@ -8,12 +8,12 @@ __Other documents to read__ maybe after this one:
- [Advanced topics](advanced_topics.md) - [Advanced topics](advanced_topics.md)
- [OOP notes](OOP.md) - [OOP notes](OOP.md)
- [math in Ling](math.md) - [math in Lying](math.md)
- Some class references: [List](List.md), [Real](Real.md), [Range](Range.md) - Some class references: [List](List.md), [Real](Real.md), [Range](Range.md)
# Expressions # Expressions
Everything is an expression in Ling. Even an empty block: Everything is an expression in Lying. Even an empty block:
// empty block // empty block
>>> void >>> void
@@ -221,7 +221,7 @@ Notice how function definition return a value, instance of `Callable`.
You can use both `fn` and `fun`. Note that function declaration _is an expression returning callable_. You can use both `fn` and `fun`. Note that function declaration _is an expression returning callable_.
There are default parameters in Ling: There are default parameters in Lying:
fn check(amount, prefix = "answer: ") { fn check(amount, prefix = "answer: ") {
prefix + if( amount > 100 ) prefix + if( amount > 100 )
@@ -273,7 +273,7 @@ If you need to create _unnamed_ function, use alternative syntax (TBD, like { ->
# Lists (aka arrays) # Lists (aka arrays)
Ling has built-in mutable array class `List` with simple literals: Lying has built-in mutable array class `List` with simple literals:
[1, "two", 3.33].size [1, "two", 3.33].size
>>> 3 >>> 3
@@ -546,7 +546,7 @@ We can skip the rest of the loop and restart it, as usual, with `continue` opera
>>> 0 >>> 0
Notice that `total` remains 0 as the end of the outerLoop@ is not reachable: `continue` is always called and always make Notice that `total` remains 0 as the end of the outerLoop@ is not reachable: `continue` is always called and always make
Ling to skip it. Lying to skip it.
## else statement ## else statement
+1 -1
View File
@@ -81,7 +81,7 @@ mavenPublishing {
coordinates(group.toString(), "library", version.toString()) coordinates(group.toString(), "library", version.toString())
pom { pom {
name = "Ling language" name = "Lying language"
description = "Kotlin-bound scripting loanguage" description = "Kotlin-bound scripting loanguage"
inceptionYear = "2025" inceptionYear = "2025"
// url = "https://sergeych.net" // url = "https://sergeych.net"
@@ -1,4 +1,4 @@
package net.sergeych.ling package net.sergeych.lying
data class ParsedArgument(val value: Statement, val pos: Pos, val isSplat: Boolean = false) data class ParsedArgument(val value: Statement, val pos: Pos, val isSplat: Boolean = false)
@@ -1,4 +1,4 @@
package net.sergeych.ling package net.sergeych.lying
//fun buildDoubleFromParts( //fun buildDoubleFromParts(
// integerPart: Long, // integerPart: Long,
@@ -1,7 +1,7 @@
package net.sergeych.ling package net.sergeych.lying
/** /**
* The LING compiler. * The LYING compiler.
*/ */
class Compiler( class Compiler(
@Suppress("UNUSED_PARAMETER") @Suppress("UNUSED_PARAMETER")
@@ -1,4 +1,4 @@
package net.sergeych.ling package net.sergeych.lying
internal class CompilerContext(val tokens: List<Token>) : ListIterator<Token> by tokens.listIterator() { internal class CompilerContext(val tokens: List<Token>) : ListIterator<Token> by tokens.listIterator() {
val labels = mutableSetOf<String>() val labels = mutableSetOf<String>()
@@ -1,4 +1,4 @@
package net.sergeych.ling package net.sergeych.lying
class Context( class Context(
val parent: Context?, val parent: Context?,
@@ -16,10 +16,15 @@ class Context(
@Suppress("unused") @Suppress("unused")
fun raiseNPE(): Nothing = raiseError(ObjNullPointerError(this)) fun raiseNPE(): Nothing = raiseError(ObjNullPointerError(this))
@Suppress("unused")
fun raiseIndexOutOfBounds(message: String = "Index out of bounds"): Nothing = fun raiseIndexOutOfBounds(message: String = "Index out of bounds"): Nothing =
raiseError(ObjIndexOutOfBoundsError(this, message)) raiseError(ObjIndexOutOfBoundsError(this, message))
@Suppress("unused")
fun raiseArgumentError(message: String = "Illegal argument error"): Nothing = fun raiseArgumentError(message: String = "Illegal argument error"): Nothing =
raiseError(ObjIllegalArgumentError(this, message)) raiseError(ObjIllegalArgumentError(this, message))
fun raiseClassCastError(msg: String): Nothing = raiseError(ObjClassCastError(this, msg)) fun raiseClassCastError(msg: String): Nothing = raiseError(ObjClassCastError(this, msg))
fun raiseError(message: String): Nothing { fun raiseError(message: String): Nothing {
@@ -1,9 +0,0 @@
package net.sergeych.ling
class IfScope(val isTrue: Boolean) {
fun otherwise(f: ()->Unit): Boolean {
if( !isTrue ) f()
return false
}
}
@@ -1,4 +1,4 @@
package net.sergeych.ling package net.sergeych.lying
sealed class ListEntry { sealed class ListEntry {
data class Element(val accessor: Accessor) : ListEntry() data class Element(val accessor: Accessor) : ListEntry()
@@ -1,4 +1,4 @@
package net.sergeych.ling package net.sergeych.lying
class LoopBreakContinueException( class LoopBreakContinueException(
val doContinue: Boolean, val doContinue: Boolean,
@@ -1,4 +1,4 @@
package net.sergeych.ling package net.sergeych.lying
import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.sync.withLock
@@ -1,4 +1,4 @@
package net.sergeych.ling package net.sergeych.lying
data class ObjBool(val value: Boolean) : Obj() { data class ObjBool(val value: Boolean) : Obj() {
override val asStr by lazy { ObjString(value.toString()) } override val asStr by lazy { ObjString(value.toString()) }
@@ -1,4 +1,4 @@
package net.sergeych.ling package net.sergeych.lying
class ObjChar(val value: Char): Obj() { class ObjChar(val value: Char): Obj() {
@@ -1,4 +1,4 @@
package net.sergeych.ling package net.sergeych.lying
val ObjClassType by lazy { ObjClass("Class") } val ObjClassType by lazy { ObjClass("Class") }
@@ -1,4 +1,4 @@
package net.sergeych.ling package net.sergeych.lying
data class ObjInt(var value: Long) : Obj(), Numeric { data class ObjInt(var value: Long) : Obj(), Numeric {
override val asStr get() = ObjString(value.toString()) override val asStr get() = ObjString(value.toString())
@@ -1,4 +1,4 @@
package net.sergeych.ling package net.sergeych.lying
class ObjList(val list: MutableList<Obj>) : Obj() { class ObjList(val list: MutableList<Obj>) : Obj() {
@@ -1,4 +1,4 @@
package net.sergeych.ling package net.sergeych.lying
class ObjRange(val start: Obj?, val end: Obj?, val isEndInclusive: Boolean) : Obj() { class ObjRange(val start: Obj?, val end: Obj?, val isEndInclusive: Boolean) : Obj() {
@@ -1,4 +1,4 @@
package net.sergeych.ling package net.sergeych.lying
class ObjRangeIterator(val self: ObjRange) : Obj() { class ObjRangeIterator(val self: ObjRange) : Obj() {
@@ -1,4 +1,4 @@
package net.sergeych.ling package net.sergeych.lying
import kotlin.math.floor import kotlin.math.floor
import kotlin.math.roundToLong import kotlin.math.roundToLong
@@ -1,4 +1,4 @@
package net.sergeych.ling package net.sergeych.lying
import kotlinx.serialization.SerialName import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@@ -1,4 +1,4 @@
package net.sergeych.ling package net.sergeych.lying
val digitsSet = ('0'..'9').toSet() val digitsSet = ('0'..'9').toSet()
val digits = { d: Char -> d in digitsSet } val digits = { d: Char -> d in digitsSet }
@@ -1,4 +1,4 @@
package net.sergeych.ling package net.sergeych.lying
data class Pos(val source: Source, val line: Int, val column: Int) { data class Pos(val source: Source, val line: Int, val column: Int) {
override fun toString(): String { override fun toString(): String {
@@ -1,4 +1,4 @@
package net.sergeych.ling package net.sergeych.lying
import kotlin.math.* import kotlin.math.*
@@ -1,6 +1,6 @@
@file:Suppress("CanBeParameter") @file:Suppress("CanBeParameter")
package net.sergeych.ling package net.sergeych.lying
open class ScriptError(val pos: Pos, val errorMessage: String,cause: Throwable?=null) : Exception( open class ScriptError(val pos: Pos, val errorMessage: String,cause: Throwable?=null) : Exception(
""" """
@@ -1,4 +1,4 @@
package net.sergeych.ling package net.sergeych.lying
class Source(val fileName: String, text: String) { class Source(val fileName: String, text: String) {
@@ -1,4 +1,4 @@
package net.sergeych.ling package net.sergeych.lying
/** /**
* Whatever [Obj] stored somewhere * Whatever [Obj] stored somewhere
@@ -1,4 +1,4 @@
package net.sergeych.ling package net.sergeych.lying
data class Token(val value: String, val pos: Pos, val type: Type) { data class Token(val value: String, val pos: Pos, val type: Type) {
val isComment: Boolean by lazy { type == Type.SINLGE_LINE_COMMENT || type == Type.MULTILINE_COMMENT } val isComment: Boolean by lazy { type == Type.SINLGE_LINE_COMMENT || type == Type.MULTILINE_COMMENT }
@@ -1,4 +1,4 @@
package net.sergeych.ling package net.sergeych.lying
fun String.toSource(name: String = "eval"): Source = Source(name, this) fun String.toSource(name: String = "eval"): Source = Source(name, this)
+1 -1
View File
@@ -1,7 +1,7 @@
package io.github.kotlin.fibonacci package io.github.kotlin.fibonacci
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import net.sergeych.ling.* import net.sergeych.lying.*
import kotlin.test.* import kotlin.test.*
class ScriptTest { class ScriptTest {
+2 -2
View File
@@ -3,8 +3,8 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import net.sergeych.ling.Context import net.sergeych.lying.Context
import net.sergeych.ling.ObjVoid import net.sergeych.lying.ObjVoid
import java.nio.file.Files.readAllLines import java.nio.file.Files.readAllLines
import java.nio.file.Paths import java.nio.file.Paths
import kotlin.test.Test import kotlin.test.Test