powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Java [игнор отключен] [закрыт для гостей] / Перспективы Scala
25 сообщений из 56, страница 2 из 3
Перспективы Scala
    #39694580
Cheblin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cossack5,

Оно вроде
.... уж начал думать что-то пропустил.

тоже есть минусы:
единственный минус SCALA - высокий порог вхождения.
от чтения документации, до работоспособного кода, ( написанного действительно как на SCALA, а не в стиле "пишем на SCALA в стиле JAVA" ) значительная дистанция.

в этом смысле у Rust, к сожалению, ещё более высокий порог... очень мало программистов сочетающих в голове низкоуровневое С и функциональщину SCALA или Хаскеля.
...
Рейтинг: 0 / 0
Перспективы Scala
    #39694583
cossack5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cheblinединственный минус SCALA - высокий порог вхождения.
от чтения документации, до работоспособного кода, ( написанного действительно как на SCALA, а не в стиле "пишем на SCALA в стиле JAVA" ) значительная дистанция.
Мне не очень нравятся статические методы в scala, т.е. если мне в обычном классе нужны статические методы, я должен создать некий object с таким же именем и в нем писать эти методы. Как по мне, было удобно, если бы статические методы можно было писать и в object, и в class (чтобы не писать два раза object/class).
...
Рейтинг: 0 / 0
Перспективы Scala
    #39694585
Cheblin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cossack5,

некий object с
все Ваши неудобства - последствия JAVA аквариума.
напротив, именно с object, в SCALA всё удивительно логично. особенно в контексте, наличия traits .
...
Рейтинг: 0 / 0
Перспективы Scala
    #39694598
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CheblinmaytonCheblin, вау-эффекта нет.
вау-эффект обещаю, выкладывай JAVA аналог.
Аналог чего?

Постарайся в нескольких фразах описать идею. У меня нет времени читать все-все сорцы.
...
Рейтинг: 0 / 0
Перспективы Scala
    #39694609
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Partisan MСоздатель Scala - один. Швейцарский профессор Мартин Одерски. Он сам рассказал, что ему университет дал свободу творчества. Вот он и создал язык, напихав в него всевозможные достоинства. Но при создании языка не было определённой цели, и так как он был не программист, то ему было трудно понять, что нужно программистам.
А что нужно программистам?
...
Рейтинг: 0 / 0
Перспективы Scala
    #39694620
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА что нужно программистам?
бабло
...
Рейтинг: 0 / 0
Перспективы Scala
    #39694630
Cheblin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonCheblinпропущено...

вау-эффект обещаю, выкладывай JAVA аналог.
Аналог чего?

Постарайся в нескольких фразах описать идею. У меня нет времени читать все-все сорцы.

Вы не внимательны.
я писал выше
для эксперимента попробуй следующий код переписать со SCALA на JAVA.
представите на JAVA приведенную выше одну строку написанную на SCALA, получите вау-эффект
...
Рейтинг: 0 / 0
Перспективы Scala
    #39694640
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CheblinВы не внимательны.
я писал выше
для эксперимента попробуй следующий код переписать со SCALA на JAVA.
представите на JAVA приведенную выше одну строку написанную на SCALA, получите вау-эффект
здесь похоже только вы на своей волне - я вот тоже ничего не понял: вы привели какой-то код на C и ссылку на multiline с интерполяцией, что предлагается переписать и зачем? от отсутствия multiline никто за все время существования java не умер, а интерполяция строк - фича довольно сомнительная, ибо:
совершенно непонятно как IDE будет поддерживать зависимости - ловить баги в рантайме оно нафиг не нужно (тут с грустью вспоминаем эклипс, который jsp толком не умел)

это прямой путь к разного рода уязвимостям (XSS, XSRF, RCE, SQL injection и пр.), потому как интерполироваться оно должно в зависимости от контекста, а не абы как (как в scala )
...
Рейтинг: 0 / 0
Перспективы Scala
    #39694658
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cheblinmaytonпропущено...

Аналог чего?

Постарайся в нескольких фразах описать идею. У меня нет времени читать все-все сорцы.

Вы не внимательны.
я писал выше
для эксперимента попробуй следующий код переписать со SCALA на JAVA.
представите на JAVA приведенную выше одну строку написанную на SCALA, получите вау-эффект
Начнем с того что я бы вообще так не делал.
Это хардкод. Я бы постарался генерализировать идею и описать ее в терминах ООП и композиции.

А а java есть фреймворк freemarker который решает аналогичные вещи.

Или apache velocity.
...
Рейтинг: 0 / 0
Перспективы Scala
    #39694668
Cheblin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей Панфиловздесь похоже только вы на своей волне - я вот тоже ничего не понял: вы привели какой-то код на C и ссылку на multiline с интерполяцией, что предлагается переписать и зачем?
это НЕ код на С. это одна SCALA мультистрока.

то, что видно как С код - это так подсветка кода всё разукрасила. поддержки SCALA на сайте нет.

Андрей Панфиловот отсутствия multiline никто за все время существования java не умер, а интерполяция строк - фича довольно сомнительная, ибо:

как Вам там пишется на JDK 1.1 ? от отсутствия джинериков смертей не наблюдается?

Андрей Панфилов а интерполяция строк - фича довольно сомнительная, ибо:
понятно.
нету - значит и не нужно. Л - логика!
...
Рейтинг: 0 / 0
Перспективы Scala
    #39694676
Cheblin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonНачнем с того что я бы вообще так не делал.
Это хардкод. Я бы постарался генерализировать идею и описать ее в терминах ООП и композиции.

А а java есть фреймворк freemarker который решает аналогичные вещи.

Или apache velocity.

весь приведенный перечень инструментов доступен в SCALA.
Соответственно все они были мной испытаны и проверены.

заявляю ответственно. Это всё Ацтой.

и в смысле удобства программирования, и в смысле поддержки в IDE, и в смысле скорости генерации текста.
Быстрее и эффективнее Twirl (который хадкордит во время компиляции все, до чего дотянется) ничего нет.
Но это всё предназначено и пригодно только для генерации web страниц.
Для кодогенерации НЕ пригодно.

В чем отличие?

В веб страницах в основном много контента и мало управляющих конструкций.

При кодогенерации наоборот.
Контент в ужастно мелкой грануляции (вплоть до ставить или нет запятую / точку с запятой в данном месте ) и гигантская мешанина управляющих конструкций.
...
Рейтинг: 0 / 0
Перспективы Scala
    #39694681
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cheblinзаявляю ответственно. Это всё Ацтой.

Нет, безответственно.

FreeMarker и Velocity написаны на Java и с успехом могли бы применяться в Scala, если бы любителям Scala не хотелось выпендиваться, как в этой цитате. Нормальное для них видите ли недостаточно хорошо.
Правда, Velocity устарел. FreeMarker популярен и применяется в важных программных средствах. Но есть ряд других генераторов шаблонов на Java, из которых можно выбирать. Меня например заинтересовал некий Thymeleaf, потому что он применяется в Spring (наряду с FreeMarker). В FreeMarker единственная проблема - если в программу входит более старая его версия, тогда надо исходный код шаблона FreeMarker делать с учётом её возможностей.
...
Рейтинг: 0 / 0
Перспективы Scala
    #39694690
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cheblinэто НЕ код на С. это одна SCALA мультистрока.

то, что видно как С код - это так подсветка кода всё разукрасила. поддержки SCALA на сайте нет.
getClass().getResourcesAsStream() - вроде нет никакого повода бежать и строчить минеты создателям scala, при этом жава код сам по себе, а остальное само по себе, и нет никакой лапши как в PHP.
CheblinАндрей Панфиловот отсутствия multiline никто за все время существования java не умер, а интерполяция строк - фича довольно сомнительная, ибо:

как Вам там пишется на JDK 1.1 ? от отсутствия джинериков смертей не наблюдается?А чего? в жаву уже завезли женерики?
CheblinАндрей Панфилов а интерполяция строк - фича довольно сомнительная, ибо:
понятно.
нету - значит и не нужно. Л - логика!Вы там в своем Китае читать разучились судя по всему, на мой взгляд я вполне доступно обосновал почему интерполяция - зло, если бы скала была бы столь же популярна как и жава (а не иметь три более-менее стрельнувших проекта из-за чего причислять себя к ылитарным погромистам), то из-за этой интерполяции каждый день бы новые CVE появлялись, нашлепанные ылитарными погромистами.
...
Рейтинг: 0 / 0
Перспективы Scala
    #39694693
Фотография fixxer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cheblin,

Вот именно управляющих конструкций в примере не увидел. Может пример неудачный? Я так понимаю вы говорите, что такие встроенные конструкции позволяют не переключать контекст? А как такое в последующей поддержке? Такая длинная чужеродная простыня посреди кода выглядит сомнительно с точки зрения читабельности. А если там посередине еще и сложная логика в выражениях? В целом, если стоит задача кодогенерации со сложной логикой, зачем использовать такое низкоуровневое средство как шаблон? Почему не строить АСТ и по нему уже генерить код, тем самым разнеся логику и саму кодогенерацию?

Ну и в целом выпячивание именно мультистрок и интерполяции как килер фичи выглядит сомнительно. Почему неискушенный читатель должен предпочесть scala, а не, скажем, groovy, где такие же строки?
...
Рейтинг: 0 / 0
Перспективы Scala
    #39694716
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подытожу для себя.

Мультистроки и интерполяция - это не та киллер-фича с которой надо выходить на Scala-презентацию.

Много языков имеют строковые подстановки с вычислением выражения но это не сделало их выдающимися.

Нужно привести пример кода который на уровне парадигмы принципиально сложно повторить в других ЯП в сравнение со Scala.
...
Рейтинг: 0 / 0
Перспективы Scala
    #39694861
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне тоже непонятно в чем крутизна примера, если есть 1001 других способов показать что скала крутая.
Мне например очень нравится концепция dependent-types.
В данном примере тип возвращаемого результата метода handle зависит от ЗНАЧЕНИЯ передаваемого в метод параметра. Передали LocalComputation - метод вернет LocalResponse, передали RemoteComputation - вернули RemoteResponse. Всего пару строк кодаи мощь системы типов скалы. Попробуйте переписать на java чо:) Многие java программисты даже не задумываются о том, сколько всего можно переложить на компилятор. Да, возможно дольше писать, но я лучше напишу так, чем миллион тестов потом:)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
import scala.concurrent.{Await, Future}
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global

case class LocalResponse(statusCode: Int)
case class RemoteResponse(message: String)

sealed trait Computation {
  type Response
  val work: Future[Response]
}

case class LocalComputation(work: Future[LocalResponse]) extends Computation {
  type Response = LocalResponse
}
case class RemoteComputation(work: Future[RemoteResponse]) extends Computation {
  type Response = RemoteResponse
}

object Service {
  def handle(computation: Computation): computation.Response = {
    val duration = Duration(2, SECONDS)
    Await.result(computation.work, duration)
  }

  def main(args:Array[String]) = {
    val a:LocalResponse = Service.handle(LocalComputation(Future(RemoteResponse(0))))
      a.statusCode
      //.statusCode
    // Result: LocalResponse = LocalResponse(0)
    val a2:RemoteResponse = Service.handle(RemoteComputation(Future(RemoteResponse("remote call"))))
    a2.message
      //.message
    // Result: RemoteResponse = RemoteResponse(remote call)
  }
}
...
Рейтинг: 0 / 0
Перспективы Scala
    #39694865
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нельзя редактировать свои посты, бесит. Вот правильный код с комментариями -

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
import scala.concurrent.{Await, Future}
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global

case class LocalResponse(statusCode: Int)
case class RemoteResponse(message: String)

sealed trait Computation {
  type Response
  val work: Future[Response]
}

case class LocalComputation(work: Future[LocalResponse]) extends Computation {
  type Response = LocalResponse
}
case class RemoteComputation(work: Future[RemoteResponse]) extends Computation {
  type Response = RemoteResponse
}

object Service {
  def handle(computation: Computation): computation.Response = {
    val duration = Duration(2, SECONDS)
    Await.result(computation.work, duration)
  }

  def main(args:Array[String]) = {
    val a:LocalResponse = Service.handle(LocalComputation(Future(LocalResponse(0))))
    println(a.statusCode) //Compiling fine

    val a2:RemoteResponse = Service.handle(RemoteComputation(Future(RemoteResponse("remote call"))))
    println(a2.message)//Compiling fine

    val a3:RemoteResponse = Service.handle(RemoteComputation(Future(LocalResponse("remote call")))) // BOOM
  }
}
...
Рейтинг: 0 / 0
Перспективы Scala
    #39694877
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну или вот, классика. DSL for Payrol Calculator, readable by business и обратите внимание, все steps имеют свой тип(фантомный), Step[PreDeductions] Step[Final] и тд. Если бизнес чел перепутает шаги местами,то это вызовет компилейшен эррор. Опять же, желающие могут попробовать силы в переписывании на java

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
import scala.language.implicitConversions

object Pipeline {
  implicit class toPiped[V](value:V) {
    def |>[R] (f : V => R) = f(value)
  }
}

sealed trait PreTaxDeductions
sealed trait PostTaxDeductions
sealed trait Final

// For simplicity, use Float for money. Not recommended...
case class Employee(
                     name: String,
                     annualSalary: Float,
                     taxRate: Float,  // For simplicity, just 1 rate covering all taxes.
                     insurancePremiumsPerPayPeriod: Float,
                     _401kDeductionRate: Float,  // A pretax, retirement savings plan in the USA.
                     postTaxDeductions: Float)

case class Pay[Step](employee: Employee, netPay: Float)

object Payroll {
  // Biweekly paychecks. Assume exactly 52 weeks/year for simplicity.
  def start(employee: Employee): Pay[PreTaxDeductions] =
    Pay[PreTaxDeductions](employee, employee.annualSalary / 26.0F)

  def minusInsurance(pay: Pay[PreTaxDeductions]): Pay[PreTaxDeductions] = {
    val newNet = pay.netPay - pay.employee.insurancePremiumsPerPayPeriod
    pay copy (netPay = newNet)
  }

  def minus401k(pay: Pay[PreTaxDeductions]): Pay[PreTaxDeductions] = {
    val newNet = pay.netPay - (pay.employee._401kDeductionRate * pay.netPay)
    pay copy (netPay = newNet)
  }

  def minusTax(pay: Pay[PreTaxDeductions]): Pay[PostTaxDeductions] = {
    val newNet = pay.netPay - (pay.employee.taxRate * pay.netPay)
    pay copy (netPay = newNet)
  }

  def minusFinalDeductions(pay: Pay[PostTaxDeductions]): Pay[Final] = {
    val newNet = pay.netPay - pay.employee.postTaxDeductions
    pay copy (netPay = newNet)
  }
}

object CalculatePayroll {
  def main(args: Array[String]) = {
    import Pipeline._
    import Payroll._

    val e = Employee("Buck Trends", 100000.0F, 0.25F, 200F, 0.10F, 0.05F)
    val pay = start(e) |>
      minus401k        |>
      minusInsurance   |>
      minusTax         |>
      minusFinalDeductions
    val twoWeekGross = e.annualSalary / 26.0F
    val twoWeekNet   = pay.netPay
    val percent      = (twoWeekNet / twoWeekGross) * 100
    println(s"For ${e.name}, the gross vs. net pay every 2 weeks is:")
    println(f"  $$${twoWeekGross}%.2f vs. $$${twoWeekNet}%.2f or ${percent}%.1f%%")
  }
}



Ну и да, код можно еще упрощать и упрощать
...
Рейтинг: 0 / 0
Перспективы Scala
    #39694883
cossack5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как насчет нормальной поддердержки higher order functions ?

Код: java
1.
2.
3.
4.
5.
6.
7.
interface Function<T, R> {
R apply(T t);
}

useFunction(Function func)
{
}



Код: sql
1.
2.
3.
def useFunction[T,R] (f: T => R) 
{
}
...
Рейтинг: 0 / 0
Перспективы Scala
    #39695083
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никМне например очень нравится концепция dependent-types.
В данном примере тип возвращаемого результата метода handle зависит от ЗНАЧЕНИЯ передаваемого в метод параметра. Передали LocalComputation - метод вернет LocalResponse, передали RemoteComputation - вернули RemoteResponse.Чет я не особо фишку уловил, в жаве не так чтоли?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
	class RemoteResponse {
		public RemoteResponse(String message) {
			this.message = message;
		}

		String message;
	}

	abstract class Computation<T> {

		private T value;

		public Computation(T value) {
			this.value = value;
		}

		public T work() {
			return value;
		}
	}

	class RemoteComputation extends Computation<RemoteResponse> {

		public RemoteComputation(RemoteResponse value) {
			super(value);
		}

	}

	class Service {
		<T> T handle(Computation<T> computation) {
			return computation.work();
		}
	}

	public void test() {
		RemoteResponse response = new Service().handle(new RemoteComputation(new RemoteResponse("test")));
	}
...
Рейтинг: 0 / 0
Перспективы Scala
    #39695110
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловЧет я не особо фишку уловил, в жаве не так чтоли?

А теперь добавьте LocalResponse и LocalComputation и сделайте чтобы метод handle возвращал Future<T>

Код: java
1.
2.
3.
4.
5.
class Service {
        <T> Future<T> handle(Computation<T> computation) {
            return Executors.newFixedThreadPool(1).submit( () -> computation.work());
        }
    }
...
Рейтинг: 0 / 0
Перспективы Scala
    #39695127
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никА теперь добавьте LocalResponse и LocalComputation и сделайте чтобы метод handle возвращал Future<T>

Код: java
1.
2.
3.
4.
5.
class Service {
        <T> Future<T> handle(Computation<T> computation) {
            return Executors.newFixedThreadPool(1).submit( () -> computation.work());
        }
    }



Ничего не поменялось:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
	class LocalResponse {
		public LocalResponse(int status) {
			this.status = status;
		}

		int status;
	}

...

	class LocalComputation extends Computation<LocalResponse> {

		public LocalComputation(LocalResponse value) {
			super(value);
		}

	}

...

	class Service {
		<T> Future<T> handle(Computation<T> computation) {
			return Executors.newFixedThreadPool(1).submit(computation::work);
		}
	}

	public void test() throws Exception {
		RemoteResponse remote = new Service().handle(new RemoteComputation(new RemoteResponse("test"))).get();
		LocalResponse local = new Service().handle(new LocalComputation(new LocalResponse(1))).get();
	}
...
Рейтинг: 0 / 0
Перспективы Scala
    #39695138
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кмк в Scala лучше система типов.

По крайней мере generic collection of primitives выглядит как в c++
...
Рейтинг: 0 / 0
Перспективы Scala
    #39695182
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов,

Да, вы правы. Я старался минимизировать пример, но убрал всю соль, действительно в таком виде его можно перепистаь на Java без особых проблем. В полном примере есть использование implicit фич, так что не охота было перегружать. Если интересно, то это частный случай так называемого magnet pattern, ознакомиться можно здесь -

А как насчет вот такого примера? Есть франшиза, есть персонажи. Есть метод, который должен компилироваться только если персонажи принадлежат данной франшизе. Сможете повторить на Java?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
object DepTypes3 {

  class Franchise(name: String) {
    case class Character(name: String)
    def createFanFictionWith(lovestruck: Character, objectOfDesire: Character): (Character, Character) = (lovestruck, objectOfDesire)
  }

  val starTrek = new Franchise("Star Trek")
  val starWars = new Franchise("Star Wars")

  val quark = starTrek.Character("Quark")
  val jadzia = starTrek.Character("Jadzia Dax")

  val luke = starWars.Character("Luke Skywalker")
  val yoda = starWars.Character("Yoda")

  starTrek.createFanFictionWith(lovestruck = quark, objectOfDesire = jadzia)
  starWars.createFanFictionWith(lovestruck = luke, objectOfDesire = yoda)

  //starTrek.createFanFictionWith(lovestruck = jadzia, objectOfDesire = luke) Компилейшен еррор, как и ожидается
}
...
Рейтинг: 0 / 0
Перспективы Scala
    #39695193
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКмк в Scala лучше система типов.

По крайней мере generic collection of primitives выглядит как в c++

То что вам кажется, является неоспоримым общепризнанным фактом. Несомненно система типов Scala в разы мощнее, не дотягивает конечно до Haskell но с Java сравнивать просто смешно. Даже представлять не охота, как можно закодировать List длиной 3 как тип..
https://apocalisp.wordpress.com/2010/06/08/type-level-programming-in-scala/
...
Рейтинг: 0 / 0
25 сообщений из 56, страница 2 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / Перспективы Scala
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]